设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    " f! B$ q$ a# X  Z0 K+ Q
    . N9 I9 \# G. L9 y) A5 U! r为预防老年痴呆,时不时学点新东东玩一玩。# H2 z$ G3 n/ N: b; j# G- ^' `5 K
    Pytorch 下面的代码做最简单的一元线性回归:
    4 \& I0 I; Z9 ^2 H+ [3 r----------------------------------------------# g( C- N2 D6 z- Q: J5 Z
    import torch4 I2 J# Q, q! }8 F/ J/ l2 M/ t9 k
    import numpy as np" H6 C3 r, `; b* @0 F: D7 {
    import matplotlib.pyplot as plt4 w. c2 u9 a( ]
    import random) E# @2 ^9 f, C( j7 Q! v) _
    , x; G% x8 f- I) L- \- ~
    x = torch.tensor(np.arange(1,100,1))+ y6 T. f5 h' j; p( }/ d! P) w
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    1 @/ U- \! J7 V1 N9 s. \/ L
    3 {# j- ?% Q' M* W1 h3 z# L" gw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    " Z/ s& _5 I& _  _b = torch.tensor(0.,requires_grad=True); T$ h7 [! d. \

      Q, J9 f  X: |- d; O, m$ z( xepochs = 100
    ! k- F& }9 [6 l, i  P2 D# q3 B6 R+ x1 U4 |6 o
    losses = []3 `; c2 r6 i  {* X2 P! W2 z
    for i in range(epochs):
    3 q% u1 y7 d- S: \* y. q6 O) a  y_pred = (x*w+b)    # 预测
    # v' E5 {9 A3 D1 j5 S2 M7 [. l  y_pred.reshape(-1)
    : w, y1 w- h( D  n, J5 }
    - k, |+ w% l0 R  loss = torch.square(y_pred - y).mean()   #计算 loss, _: d  O% F/ ^
      losses.append(loss)/ {" w* H4 l; e3 L) g
      
    # S$ ]+ `& t7 U. d( L9 n5 h  loss.backward() # autograd
    " i' A1 H1 _. _+ m- ]2 Q  with torch.no_grad():
    4 Z. y% J4 B; @1 G: v    w  -= w.grad*0.0001   # 回归 w
    . _4 N9 G% j( o) u    b  -= b.grad*0.0001    # 回归 b
    - x! Z: P1 P# l- `" l& n  w.grad.zero_()  $ @" z5 h( w0 O: V2 g
      b.grad.zero_()
    . y) Z" f3 a* I: s3 l3 q5 u% m  Q4 q  Q6 _
    print(w.item(),b.item()) #结果5 u1 w, g2 X$ I2 @9 E- F

    - }4 \6 g. z4 [0 ?5 v- }" _9 AOutput: 27.26387596130371  0.4974517822265625% l. z4 `& D% W6 {9 v
    ----------------------------------------------
    + X: O/ X$ K& b最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    3 n" G, b$ m4 R2 G- r高手们帮看看是神马原因?5 ?9 P8 \  n1 [) p. h

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 7 W# p. s& G2 h
    7 k6 t2 u6 s! |9 R: h% J& A
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?$ _& Y% b5 \1 g/ M
    -------
    1 A% \, p. ^" A1 c9 m不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。0 G" A+ B* m* Q
    -------; }6 y# H( v7 s; X7 p$ Z
    算法诊断部分,建议把循环次数改为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
    6 S; ?7 r0 C- ?4 ?没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    + x& J5 T6 o) j3 n2 q-------4 t  M8 ~- G) S6 S
    不好意思, ...
    ( U0 a5 N- k1 r" V! [* v. ^; J9 x
    谢谢,算法应该没问题,就是最简单的线性回归。
    4 \6 g' t$ D# v8 V我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 " d* n. ~1 C3 W/ V+ `
    雷达 发表于 2023-2-14 21:522 r" |8 W" w; p# g/ y
    谢谢,算法应该没问题,就是最简单的线性回归。# J+ ?' G% A1 r6 ?
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    7 ?" X3 \( _7 o6 J& O9 |9 g8 b6 e
    ) l& p) ?5 u6 V- k% Y& u
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。  @  Z) D8 X  u" t" z: k2 z$ j
    ' l3 Z# e; P/ D  l6 V; M
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 0 L- w% A9 q, n8 y  u
    老福 发表于 2023-2-14 22:00
    : f4 g1 `. |/ x- Y4 Z& y刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。, z6 {* X5 q2 H
    ; t! W! @7 ~  E# z/ _
    或者把b但的起点改为1试试。 ...
    & W$ h4 v& ]& l8 r( ]$ j8 Z6 U
    6 l: y& Z+ R/ G8 v
    你是对的。8 S9 R$ Q/ w5 B, h# D% s
    去掉了随机部分
      t( A# P4 o# O#y = (x*27+15+random.randint(-2,3)).reshape(-1)
      V5 Q3 a- t0 P) py = (x*27+15).reshape(-1)
    ! @  M$ X% k; J% _6 _9 \  M& [) O1 G* }( J  Q3 ]
    循环次数加成10倍,就看到 b 收敛了
    ( D. |6 w& D( ?$ qw , b* P  M& p" Q, I) `8 Q; U
    27.002620697021484 14.8261671066284185 V+ S3 y1 X* z% B1 V' t  f- u
    8 b$ t% s2 o3 P4 `7 t
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-30 05:45 , Processed in 0.063375 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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