设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    2 z3 Y# e2 `. }1 D1 w0 V5 I2 r, w
    为预防老年痴呆,时不时学点新东东玩一玩。
    - t7 E! q' p, V1 `# f6 ]' DPytorch 下面的代码做最简单的一元线性回归:$ w8 G8 }- g% g% m! r+ g: V: v0 D
    ----------------------------------------------- }2 |$ O+ i3 x
    import torch
    . B( A2 z: G; Wimport numpy as np
    ! D8 T6 w$ d7 u# n9 Iimport matplotlib.pyplot as plt
    7 v9 Z; ?2 V" s. g1 u& u# A# rimport random! k$ J, A* e; {% N5 {5 {+ P# U
    ; j# ~5 ]/ t. S3 n  }
    x = torch.tensor(np.arange(1,100,1))
    ) l* y8 N( v: u, dy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    9 H6 m* F: F/ _+ [* @  I
    7 R5 T" Y1 p) u8 R2 s2 Vw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    4 I. e7 p: f7 @/ z. G) j- ^4 kb = torch.tensor(0.,requires_grad=True)/ `  A3 O- @2 a; X/ X

    3 z1 I3 q1 ?3 Z, W0 ~epochs = 100$ R# z3 S! _9 k. l
    7 `) a  o/ d8 F% R
    losses = []8 G5 n% x# o' y. v' l& i
    for i in range(epochs):" n6 A( K1 w  O9 C9 @
      y_pred = (x*w+b)    # 预测
    9 }! Q9 D/ N# u' [7 I  y_pred.reshape(-1)  l! M5 B4 }8 j4 o. M; m! Q

    6 f% ~6 b4 d, ]6 A$ N" k& N  loss = torch.square(y_pred - y).mean()   #计算 loss
    1 M8 T# v" g2 {$ O" l/ }$ F  losses.append(loss)
    9 N5 f5 X8 ^4 q- o  
    + ~. V( `+ \2 Y* \* Q8 W$ w) |  loss.backward() # autograd, S( P5 i& a% |2 x8 S' r) t
      with torch.no_grad():
    / t, T+ K" }- o0 @/ e    w  -= w.grad*0.0001   # 回归 w
    ; X% t  H+ G1 x7 N' m+ b% H    b  -= b.grad*0.0001    # 回归 b
    % Y3 \  X  \% e  s1 p, G  w.grad.zero_()  
    0 q. x8 ]/ h$ V+ d$ q  b.grad.zero_()
      K$ J/ R" P  O/ k2 r
    6 P& ~) x9 y4 J/ w) yprint(w.item(),b.item()) #结果! o  J, J. _( [$ o' t

    ! q# Z1 J" c% K. l  G( C  EOutput: 27.26387596130371  0.4974517822265625" v% K- f% e/ R2 R
    ----------------------------------------------
    5 I( w+ d% c0 v) v( j最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。. X, d& s% T5 W2 p
    高手们帮看看是神马原因?
    . P) R7 a4 D3 t" {1 M/ x1 R. N

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 . k) M5 X$ N7 G6 _$ n' @4 Y
    6 D: b# @% O" z' @  R
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    $ O1 ]( @. k( u9 k-------
    . Y! e9 b9 Z1 H/ E) O( N, O不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。  q1 {( i7 M# j8 r' _; B. u
    -------; x' R1 w  {. N0 v# h  x% L
    算法诊断部分,建议把循环次数改为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# ~( Q+ t9 [! c' Y
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    3 V: r+ e3 W& ?$ |  w-------
    * R5 o3 ~% ]4 s2 [1 z不好意思, ...
    3 t* P6 X! o6 k# `
    谢谢,算法应该没问题,就是最简单的线性回归。
    : w& a8 E& J1 i" L! v! @我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 ! x3 e  P5 @; t: u; }
    雷达 发表于 2023-2-14 21:52
    0 l) k, b$ L- U. J谢谢,算法应该没问题,就是最简单的线性回归。
    + S, L, O' a& z$ U8 @我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    $ H4 B2 L/ {2 j! R
    1 J* v( o  |% h. h/ D刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    9 _( n, @' d( @2 I0 ?7 }  d" x7 [' u" U+ q  g
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    ; P. v- ^1 m# B
    老福 发表于 2023-2-14 22:00
    4 ?6 k" F0 R; l: J$ N刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    , t' F. _( Z) `8 X$ [4 i
    : X+ ^1 R, j2 D% `或者把b但的起点改为1试试。 ...

    9 y; l! ]; o2 v/ s
    ) _( {8 X& _! R1 D* F" u你是对的。, `6 W! K0 E3 N" i. i  ^
    去掉了随机部分+ v% W! j. ~- E$ R+ }
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)  z6 q5 Z1 m3 b- u
    y = (x*27+15).reshape(-1). x+ h# Z" y3 u- B8 n& O/ M

    6 ~' n" [5 Q5 |2 M5 A3 e循环次数加成10倍,就看到 b 收敛了* y$ q& v3 Q4 U3 |' ^
    w , b
    / h! r4 G* V3 k  c27.002620697021484 14.826167106628418! j8 U9 w5 G; X: P8 j

      ?; ^% `* r' ?% q, v" S和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-14 09:56 , Processed in 0.056133 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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