设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 , d* l9 k9 p- F- }

      |3 N$ B. b  y5 {$ h$ a为预防老年痴呆,时不时学点新东东玩一玩。
    , y. u! q- E. P" z- CPytorch 下面的代码做最简单的一元线性回归:
    1 p. \* D# V, W5 x5 v----------------------------------------------
      k' O: Q* i& e! N+ {- m1 p6 P  @import torch: \; G4 n9 }# L2 G8 E" s2 g
    import numpy as np3 ?( t" Y% t: g& o- b+ ]% ?
    import matplotlib.pyplot as plt
    . s/ c- v1 L+ J; A7 b; y7 t! Pimport random
    & ]4 U2 a7 A6 r2 d
    - \3 s  A) L1 [% c" cx = torch.tensor(np.arange(1,100,1))
    ( a& B; o/ y+ w9 }' d& yy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    . V* d& h6 K6 @. s: e! K5 k
    0 T  t/ m& \8 v8 h3 B- |w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b$ U3 ~- h3 ^' _; U8 O$ |
    b = torch.tensor(0.,requires_grad=True)5 J, m7 D, _! R  A: w5 m7 ?

    0 {3 p; G* t1 E/ b# f  W% ?/ Iepochs = 100+ i$ I* Q' L( w. g6 J; Z, p) S5 m0 U
    6 A8 K! e. I# n& i" X* z
    losses = []: y. u! j5 J% m8 X0 V7 e0 x9 W
    for i in range(epochs):
    , S  p% M9 l5 v' Y9 d  J  y_pred = (x*w+b)    # 预测# T8 A9 L% A) s% x
      y_pred.reshape(-1)2 N  s$ B- [: F6 b* w8 N

    " c# m: X9 e9 p: o# l+ k  loss = torch.square(y_pred - y).mean()   #计算 loss) R) k6 [3 q1 n' J: |1 E
      losses.append(loss)
    ; ]$ y7 c: k6 z; T) n, b  
    8 a( }" o3 B' `/ E# w9 u" f  loss.backward() # autograd; X7 i4 i; p9 r
      with torch.no_grad():
    7 K2 L+ o- F9 }2 K0 w    w  -= w.grad*0.0001   # 回归 w5 w2 k/ K+ @* `! a. u5 h
        b  -= b.grad*0.0001    # 回归 b % l0 w$ z$ s7 I5 @/ [0 \6 t0 D  M  m
      w.grad.zero_()  
    : m7 g9 i7 g2 j7 f  b.grad.zero_()
      L' b" v6 G1 n, Q1 B: |
    8 x, ]7 [* b0 w1 D: K% w' Vprint(w.item(),b.item()) #结果
    4 N! Y+ {3 E. J, E! H" H- ^* b
    . y5 W4 n; @/ L2 hOutput: 27.26387596130371  0.4974517822265625, [, U4 F" f: y" {1 i+ x; h* g
    ----------------------------------------------
    ) t, Q7 a! X( m& @最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。, Y8 ?! I2 ~) O/ {% F
    高手们帮看看是神马原因?
    ! y+ c8 Z" ]9 R& z: k

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    6 W, I+ b4 |% ^, P! e  u: H9 c
    - y( N8 |- A! H' T/ A: v) H没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?5 t/ r& K) t3 F+ r1 s( t
    -------
    ) \0 X0 C: x! e) n不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。' ~5 O" O' B! I) y& z9 K
    -------; f6 ~* M+ C7 |; ^3 G
    算法诊断部分,建议把循环次数改为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
    * j# ^5 S6 f; @* [( r没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?% f! W1 P, e/ ^% Q
    -------
    ; i% A' W5 `1 k3 g! Z9 u3 A' I不好意思, ...
    2 Z- J( p- ~4 ^& v3 D
    谢谢,算法应该没问题,就是最简单的线性回归。
    : I. N" A$ @; X8 s# f( ~我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑   z/ G& }# J! q- ]
    雷达 发表于 2023-2-14 21:52
    ! j) C1 a& k; ^1 A6 d. t' x! }谢谢,算法应该没问题,就是最简单的线性回归。
    ' q2 X% g! M$ M' s/ |5 B/ _. T我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    / L/ ^3 u" r$ u$ ?4 u4 [8 v) g
    2 @0 [5 V5 O) t! Y' w- T. ?刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    0 B& N$ z( L/ o
    8 O+ n: p/ o( n/ @9 p) r或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 # p  B" n; D" Y: S& j+ w$ `; |1 o) x( b% k
    老福 发表于 2023-2-14 22:00. o  j4 g* h1 {, E  ^- _
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    * E% z+ k/ u6 y* e4 }# b) ^" t: N$ h
    或者把b但的起点改为1试试。 ...
    # X8 o7 R' V  n1 m( F
    , h1 _( ^9 k0 U( F
    你是对的。
    9 ]% P, m9 \$ i0 @去掉了随机部分7 @4 v2 @: K9 b; E
    #y = (x*27+15+random.randint(-2,3)).reshape(-1), @6 n# w! d5 Y4 _/ S) ~- X8 o4 B
    y = (x*27+15).reshape(-1)4 g5 I( l' s+ N8 M+ ]5 W* G2 K) a2 X0 @

    ( G( x  u) L" i8 ]循环次数加成10倍,就看到 b 收敛了* u! N  E( A+ v, h8 b3 K0 b  Z' B
    w , b( D; a- M9 X9 L9 m* q1 R
    27.002620697021484 14.826167106628418
    # i$ T8 n. P5 [& X" x+ _, M/ H- l( c% H
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-12-21 05:20 , Processed in 0.039081 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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