设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    * ~: L/ y; C' N6 _0 O$ N
    " Y, L: i3 X8 p! H为预防老年痴呆,时不时学点新东东玩一玩。
    2 x5 d6 X' i  t" w( K; V! xPytorch 下面的代码做最简单的一元线性回归:: W: d# l2 D* Q0 D$ Y- R
    ----------------------------------------------
    " o( N$ a" x; y2 n" r+ t# ]import torch+ W* e/ R5 H0 {, z7 y4 q8 J3 p
    import numpy as np3 T# W+ T% P+ B1 b$ ^2 W# t) {9 v
    import matplotlib.pyplot as plt
    2 f' k5 w: Z' s3 Y; ~import random
    ( }' V9 O8 J1 ?/ M
    " B, D$ E, ?8 v# L$ ^: Ix = torch.tensor(np.arange(1,100,1))- f! f9 D# K( p7 M) ~6 B) [% S2 p
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15- u. n0 U! V2 d- q: q+ J7 q  H
    & R/ A6 c6 L% v0 b) X
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    ) I9 V9 N7 E$ v9 v: R1 Ub = torch.tensor(0.,requires_grad=True)
    / u6 Y- R" z. A  D7 ^
    - c' ?: J+ D! d" d' E# R6 _epochs = 100
    : P/ `. Z- E. ?1 }5 Q$ ~( h! K: d+ z! m: T2 N; ~  k
    losses = []+ N, v5 p- M7 n. c  A. C
    for i in range(epochs):
    5 P- i8 }% j# i! P2 T6 W  y_pred = (x*w+b)    # 预测
    $ T; y: W0 ]9 h' \4 s  y_pred.reshape(-1)
    $ B" g3 A* v' a) t . j+ J6 a% Y/ x& i: j' l# K6 M
      loss = torch.square(y_pred - y).mean()   #计算 loss9 B7 V1 C0 a6 Q: e
      losses.append(loss)) {1 U# c/ v" h
      9 K' z& O6 q  x" V. @
      loss.backward() # autograd
    . D3 y5 ^; J) t) D2 m/ d  with torch.no_grad():
    ; l& c! x* U; F, S. J+ T    w  -= w.grad*0.0001   # 回归 w, c+ }. J2 a; U
        b  -= b.grad*0.0001    # 回归 b
    ; c0 H8 S3 z5 e; W& _: R  w.grad.zero_()  ( r/ S4 M5 H6 K( d, ]; F$ ?$ |
      b.grad.zero_()2 [. u4 r! \4 n8 K/ S. L1 l/ N

    ( e4 A$ v0 U4 Nprint(w.item(),b.item()) #结果* x* X2 h) _( L  P! ]5 U
    4 Q: S3 X- x" `  z& V
    Output: 27.26387596130371  0.49745178222656257 |( p$ A  a1 v6 [$ [0 |* ~: b) S
    ----------------------------------------------; J( P# |1 }1 U  O. q% _
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    8 e+ {* X2 H8 p7 B% U9 V+ c. M高手们帮看看是神马原因?& u* m+ u) X" i/ k$ m5 T5 m# p

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    # ]9 p3 \, ]2 L( h# l) H# u
    ! T  e+ c3 }. J6 B* D4 e没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?6 _0 i1 N! T+ D1 x* n* H/ I
    -------
    $ W- L  J! h$ C3 C; e8 h不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。8 j9 ^, s  r- I, p* w
    -------
    * v* W4 k& H. l6 y. F算法诊断部分,建议把循环次数改为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:234 D. o( s9 w% C* |  Y
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    1 T7 J( J0 l* Z5 R+ S  p-------' U4 d1 j& F: b
    不好意思, ...

      }7 T, ]  B. f6 p2 ^9 d  s3 H3 I& ?. E谢谢,算法应该没问题,就是最简单的线性回归。/ q) `  D  z+ s' ~- B
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 * q4 ~8 D5 t9 E9 X8 T1 e
    雷达 发表于 2023-2-14 21:52, A; V& D" w8 a/ W0 ~# `
    谢谢,算法应该没问题,就是最简单的线性回归。
    ! z( T" o  s% E) G9 O我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    + \  S/ |! M5 i
    0 |6 e9 P/ z$ I, d+ S5 E( }
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    - Z! H" g! `, v  S  j9 U  [& f1 Q+ a* ~8 G4 l# _
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    / v5 ~* l7 i& o+ t4 z' s
    老福 发表于 2023-2-14 22:007 d: A( ^5 N: I  g* @7 g3 }) e
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。! \8 P& ]" M9 y& Y$ R* R; A
    , b+ G; D' E1 g# X
    或者把b但的起点改为1试试。 ...
    , b1 r7 p+ t6 {: Q( I
    3 i2 _9 P& t7 `
    你是对的。3 u9 D+ `* D  f3 s4 y# K" E
    去掉了随机部分3 N- ~% \) x- j# p3 T
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    + V2 G; V* y3 V) S/ M/ I' V" `y = (x*27+15).reshape(-1)
    ! o' B, W1 d$ @- D2 w
    $ z6 g1 f8 C+ C% Y3 v- a4 ?. Y循环次数加成10倍,就看到 b 收敛了
      A6 ^$ E' e2 F3 Z4 K; J. M+ `7 q) cw , b
    * b' ~6 g2 h8 q& e- ?2 C0 j, w" ~  d4 z27.002620697021484 14.826167106628418! @' D6 Y+ ~6 v$ T9 ^
    + `7 r9 W8 ~# L
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-12-24 17:42 , Processed in 0.031541 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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