设为首页收藏本站

爱吱声

 找回密码
 注册
搜索
查看: 2732|回复: 4
打印 上一主题 下一主题

[信息技术] 继续请教问题:关于 Pytorch 的 Autograd

[复制链接]
  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    0 X& a& _: E! J1 k3 ^) Z! \
    ( ?1 ^( }6 \; b+ ^' V% Y; v为预防老年痴呆,时不时学点新东东玩一玩。
    & F- V. H) N& i% f( J  `, a$ \, ZPytorch 下面的代码做最简单的一元线性回归:! b+ j1 `& ^2 w) ?6 g) A& a/ B
    ----------------------------------------------1 l$ m) e" i6 a! }# E" B  Z* y6 I
    import torch5 o; S/ Y4 f% Z! S8 B
    import numpy as np, D: b: ^  R8 _$ g, B1 f# l
    import matplotlib.pyplot as plt
    . O0 I! R: N% Ximport random% [+ K4 z" O/ |. m

    : R, }1 P' R( w7 a5 B8 Ox = torch.tensor(np.arange(1,100,1))# g, V2 e* n5 k( m1 J: Q
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    ( a1 n/ ?9 Y2 _  n# `( U% W8 Y8 s' P8 Y, j# v4 m; X1 r% q
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b: t& t2 ?# K: z1 B, X, T
    b = torch.tensor(0.,requires_grad=True)$ N' x9 @; I: L1 ?
    / V" T: i7 C6 r2 m* E7 E
    epochs = 100& x( Y7 O/ B3 V; `1 C& ?
    ! b0 U  I! N0 ]# ]* X
    losses = [], I; w2 S4 x8 M( B; J( |4 R
    for i in range(epochs):
    ) @1 _' `2 G5 k+ ?5 T( Z# V6 s  y_pred = (x*w+b)    # 预测& ~$ ]# u* f& R* q6 L4 N9 G
      y_pred.reshape(-1)
    2 l" `1 v( {/ P: s' q  k
    : \, M8 _- k- t2 s+ {2 I  Y  loss = torch.square(y_pred - y).mean()   #计算 loss
    . [3 d% V0 P. l' M! o4 @  losses.append(loss)
    * j  H( l5 K' C0 J8 y0 u$ {% R  m  9 S1 z  A7 n3 `1 ?6 y  B
      loss.backward() # autograd
    + Q9 q) t; D, X  with torch.no_grad():1 }+ ]5 j$ D  Y; g! h: x( d
        w  -= w.grad*0.0001   # 回归 w
    . z$ e# ?) C' e5 X    b  -= b.grad*0.0001    # 回归 b
    + k* I- o6 H; o: T  w.grad.zero_()  
    8 Q# C( `! A( b7 E% h( s  b.grad.zero_()" m5 ]! T; G5 R7 n8 o% u/ a. l
    1 B1 _4 L" z7 U8 v1 ]7 b" d/ d+ ?
    print(w.item(),b.item()) #结果7 }" g0 E& l/ v! ]9 T. P
    - V7 t, w7 i- `5 ^- y! w2 X
    Output: 27.26387596130371  0.4974517822265625: L* c8 `2 U# G
    ----------------------------------------------, J' K4 f" ?4 ?5 c. O
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。1 p- V7 g. W* _- i/ t
    高手们帮看看是神马原因?
    3 W/ f: w# v+ B. i+ r; {

    评分

    参与人数 1爱元 +10 收起 理由
    老票 + 10 不明觉厉

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    - c% Q  h6 E+ _8 U( T/ [2 A% Y' @9 j; f$ {0 t
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    & m& o7 M2 l# B/ S2 l: g-------; @: F: [4 r0 B8 }
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    6 B, }/ @. c. {4 B8 g, L" p- I+ k-------
    - w2 [! |& h0 p算法诊断部分,建议把循环次数改为1000, 再看看loss是不是收敛。有点怀疑你循环次数不够,因为你起点是0, 步长很小。只是直观建议。

    评分

    参与人数 1爱元 +10 收起 理由
    雷达 + 10 谢谢建议

    查看全部评分

    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    板凳
     楼主| 发表于 2023-2-14 21:52:57 | 只看该作者
    老福 发表于 2023-2-14 19:23' ^# \# i# g+ L/ x1 K( Q" r
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?! n( k" y% e- [5 Z3 S% h  A
    -------
    6 c8 k# w6 c4 J% {( \/ O& m0 P不好意思, ...

    : E( U, s$ a! d$ `4 F* d& A谢谢,算法应该没问题,就是最简单的线性回归。
    6 l: F! h0 Y. Z) X' e$ h6 W' H: ?我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    ; c. ]6 n0 P4 `0 L
    雷达 发表于 2023-2-14 21:52* E9 ^2 G3 f2 e/ q$ c( g. ~
    谢谢,算法应该没问题,就是最简单的线性回归。
    7 c5 \; I6 X5 \- s: d' V: @; |# G( \我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    " O. A' ], i# \2 f# Y
    / b2 H: c9 S7 q1 b9 S' s
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。, a+ Y0 K/ A/ r
    : \, C& n; \; r, i/ |6 r
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    3 `2 v0 b% _9 k
    老福 发表于 2023-2-14 22:007 ~( L* m" l6 h* o
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。$ c) A6 a% @1 d( ]4 u1 l  Z
    ' e1 B) f# `- m1 a5 Y( T
    或者把b但的起点改为1试试。 ...
    0 Y7 e3 t4 Y. N* K/ z; Y

    3 a- t! F- c; B% E3 {4 M! u你是对的。
    , _: N+ B! x7 O1 j3 D% _* |. ~去掉了随机部分8 ~! w1 k- F: G* N! g7 d& ?% F' O4 n
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)8 E  ~* U5 e, q
    y = (x*27+15).reshape(-1)
    * \! I) j3 ~  Y' i! l; Y
    6 q. N, S+ L8 f; n' F, B循环次数加成10倍,就看到 b 收敛了2 h$ ?7 M+ K3 O% P
    w , b! U+ @7 v# u8 u; Q/ t; ]8 R
    27.002620697021484 14.826167106628418
    " @. n! j0 f9 z) `
    8 f5 X+ @8 _; c和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

    手机版|小黑屋|Archiver|网站错误报告|爱吱声   

    GMT+8, 2026-4-11 13:34 , Processed in 0.078018 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表