设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    6 o- i; h6 a: T% d1 j. q) K% u8 D/ j4 M4 k
    为预防老年痴呆,时不时学点新东东玩一玩。
    ' c4 x4 a5 F* f# {Pytorch 下面的代码做最简单的一元线性回归:6 b2 O' p7 _0 m2 U/ n. p9 U
    ----------------------------------------------
    # H  e( v6 a. ^3 w8 y# ?% zimport torch
    8 h* F2 x7 @& m: E/ x4 `import numpy as np
    / u, ^+ S+ W4 {5 m3 ]1 J4 x7 rimport matplotlib.pyplot as plt4 L2 C6 [5 _! z2 J0 @) n5 M
    import random& w9 A5 x& w8 Q7 N* N
    9 e) X, a6 Q% s. M- ^
    x = torch.tensor(np.arange(1,100,1))0 p% J& K/ n# s  f; ^
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=155 m. u  J, y5 t$ _9 c

    3 r2 f  Z, ?( Y; }8 P  V& {; Yw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b' m7 l  t8 ]! r: ]
    b = torch.tensor(0.,requires_grad=True)
    2 G; J) V1 O5 _1 Z+ r
    # {5 P. T% |1 Q8 o5 V: \' V$ Nepochs = 1000 z5 H; B1 S( }6 t0 l6 Z* |

    6 E: o/ u4 Z6 M" }+ Dlosses = []
      s, T' I. I9 J3 w; _for i in range(epochs):9 W5 Z7 y' B2 p# \# g
      y_pred = (x*w+b)    # 预测. A. d9 t4 W$ U. |! z6 Z# Z: v# E+ K$ W
      y_pred.reshape(-1)
    , a" ^" C  n) ]- e % D3 Y$ w+ ]7 v; H4 p3 O5 Y7 \
      loss = torch.square(y_pred - y).mean()   #计算 loss1 F+ e1 Z4 n( ^' _
      losses.append(loss)3 u) q0 s  m/ ~. [: ?
      
    . l: T8 X+ ]9 B' P  loss.backward() # autograd' U, T; t8 @4 q* r3 l
      with torch.no_grad():2 `" D# I! L! j3 ?/ \8 s# N- E
        w  -= w.grad*0.0001   # 回归 w+ e$ j1 ]" V6 d1 V! r& T3 f8 t
        b  -= b.grad*0.0001    # 回归 b
    - k* I: m+ q) t2 f  w.grad.zero_()  
    " s; x$ Z( O6 k  b.grad.zero_()% v8 I7 ]+ R! Q0 V+ f5 j2 D2 F! t
    : o8 x1 i0 a  ]$ D- s+ r8 |4 r& {
    print(w.item(),b.item()) #结果- B8 i: a2 c4 U+ `4 |  D' Z9 k

    1 u# G: J3 \* W. h5 X# V" \Output: 27.26387596130371  0.4974517822265625+ o7 s) a& Z: P! S7 u
    ----------------------------------------------5 F1 }& f- P3 H
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。' M" O/ u; `( p& ]- o5 I
    高手们帮看看是神马原因?
    . f" M4 J! u9 b% e' i; C

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 0 ^/ E/ `! ?4 }- z4 p% `# J" C5 K
    ! ?; Q) a; L2 N* @; O, ?
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?" X6 X7 N+ a6 Z1 K& u1 x
    -------
    ! E$ F9 Y  p6 d- D. c2 ?4 g: c不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    ! r4 ]5 ]* y) Y; U$ U+ g% N+ O-------- ?0 l6 q0 A, E! I
    算法诊断部分,建议把循环次数改为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
    ! |- q2 _* I2 T5 j( {, J# A9 d1 \没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    " M+ Q- ]* u) Q: Q' v; o6 B; e-------( V5 b2 a+ j6 G7 J$ f2 H
    不好意思, ...

    $ p+ l$ N: ~+ K4 y! b. j) Z谢谢,算法应该没问题,就是最简单的线性回归。/ K. `$ Q2 n3 N- |) T
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    8 V+ h. A4 \! m' U$ D
    雷达 发表于 2023-2-14 21:52
    4 t+ q) j' u2 R: R$ q7 w谢谢,算法应该没问题,就是最简单的线性回归。
      z$ s6 Z( O% P( Y" f我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    ! |( P9 H  t1 D- q+ E+ e
    , T6 f- I! Q# [
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。7 l; o$ Z# H6 ?4 l
    9 |! p0 |! z- e7 O' r4 v
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑   v, E' D4 F& p" r9 K" K$ s/ ?
    老福 发表于 2023-2-14 22:006 R0 a9 ^) G: h7 E" n6 @
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。- _% m7 m% d3 B5 G, z

    ( o7 U- Q0 ?- N% v5 g4 n7 U或者把b但的起点改为1试试。 ...

    , R1 E9 i  @0 {
    3 I5 g4 ~8 S! k9 ?你是对的。: T# d7 Z  {- l
    去掉了随机部分
    8 f0 C* F  Q6 Q9 G. w: y6 @#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    ; q+ ]! {% w% _( l, jy = (x*27+15).reshape(-1)
    9 p9 @+ {; l, P3 [- |- |0 J, `
    . I- t* h  F8 z+ _7 Q! o% d循环次数加成10倍,就看到 b 收敛了
    8 t, m) n* J* Tw , b! {0 A  m3 O0 g1 t
    27.002620697021484 14.8261671066284180 u7 y' q) y- l% T% M1 z6 z9 T
    7 J8 P6 s+ Y5 `* ^0 D9 }
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-6 23:32 , Processed in 0.058335 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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