设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 % V6 y, u# H: j( j. ^8 S" [% c
    # [1 p! r- Z5 B4 J0 H
    为预防老年痴呆,时不时学点新东东玩一玩。
    0 D. ^" f: u8 E% \2 jPytorch 下面的代码做最简单的一元线性回归:" \' ^, H  I3 i6 u& u% Y
    ----------------------------------------------: K1 ~6 @- }; |5 G9 q) b
    import torch7 G2 `. l( y# J$ z5 y( x+ H2 n
    import numpy as np
    + u! O5 o  R8 K. C' Z+ W0 fimport matplotlib.pyplot as plt. ?; b$ L* a7 Q: t
    import random# f' w8 r7 `6 ?! X+ C# Y9 ]
    ! G; ?$ R! b& F" D5 \. ~
    x = torch.tensor(np.arange(1,100,1))
    " A; P4 q: O8 l0 ~y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=152 [. n8 n% S7 Y* w" U

    0 y9 U) M9 ^* f" o( Dw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    " q$ E5 L- p* b2 Yb = torch.tensor(0.,requires_grad=True)
    : }; I/ j+ y$ \8 `
    . [# O9 ?* j1 s4 m% S3 v7 Gepochs = 100' r2 ^. a' q5 o* V0 M2 A
    5 ~" {  \; `) g- M5 p& S
    losses = []4 |0 A5 Y6 s) e$ N6 L/ i
    for i in range(epochs):, R& o8 `' e4 X; q* I
      y_pred = (x*w+b)    # 预测
    * j  {, v  B: T" _9 e( g  y_pred.reshape(-1)6 j7 ?9 j* W. `

    : ?* f$ k2 s4 E7 l  loss = torch.square(y_pred - y).mean()   #计算 loss
    0 W' ^, _) v0 T' ]9 R5 ^  losses.append(loss)0 i% k3 Y, o* a, e% S
      ! J, N" E7 o- u$ _- V
      loss.backward() # autograd
      f3 ?( \* _9 b. ?  with torch.no_grad():! f* d# P- I' ^5 n8 D) s5 O
        w  -= w.grad*0.0001   # 回归 w
    * W3 K* q" s6 p; z    b  -= b.grad*0.0001    # 回归 b
    * N. @; W6 v! r3 O  w.grad.zero_()  
    0 A& |3 H3 }3 x" U3 d1 v  b.grad.zero_()
    - |2 O/ P% v( p0 [9 ~2 }. e
    ! W8 c; R- t0 m$ m* C& _! J) e6 D+ Tprint(w.item(),b.item()) #结果9 d# i0 K0 A9 R" ^* S* N
    - A5 J4 H8 S) Q
    Output: 27.26387596130371  0.4974517822265625
    ; X9 \/ T7 d- k. M4 ~" S2 t----------------------------------------------
    + V4 q$ u; b7 d/ B最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    . {  o$ N" @3 S4 `6 F6 t9 S- V高手们帮看看是神马原因?4 S6 @: D% T, g

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 ; ]. r$ @3 I  N/ k. v" s% o. ?' E
    1 N5 }. C0 _6 p- C! i
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?) K. P/ y" d! n! w& {$ Q& ~5 X+ l$ P
    -------( `7 E* |2 A8 @* p
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    : g# {3 W8 B8 P' A; \-------
    * e: E3 ?1 h0 P/ @算法诊断部分,建议把循环次数改为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/ x4 a0 g7 }( J& O. P2 ]
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    % M3 c  C: @6 {* `# z1 W) |-------
    : n+ S6 M" D: [( u, B  ^5 i不好意思, ...
    : r& F/ z! h( _3 N  o
    谢谢,算法应该没问题,就是最简单的线性回归。
    2 X8 v4 H1 P- M# @8 n( ^我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 ! S* b0 @* ~0 \* F0 o$ h" P. u
    雷达 发表于 2023-2-14 21:52
    % D; B" m. r$ _' G) ]0 l- y谢谢,算法应该没问题,就是最简单的线性回归。4 o' @( D- Z4 h' t, `2 Q
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    6 U2 u, i% W3 K# ]* x& U
    ( j+ f# z! \* m' S$ I% W2 L刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。1 ?% z4 ]- O. m

    4 n; y* D  g. N# N3 w或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 " T' {1 c! ~% i6 J8 o& L" B1 R0 ^
    老福 发表于 2023-2-14 22:00
    7 P' o% H" G9 n4 V8 u' X刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
      g5 {; |4 l; e+ r4 I& V% v# P( A/ R  A, I- e0 N* D0 a
    或者把b但的起点改为1试试。 ...
    # z  }/ O1 N, q! L4 T3 t

    + W5 S0 J" g# n7 B  _. D你是对的。
    ; T/ S' ]' T9 ~3 S9 V1 e去掉了随机部分
    : Y9 q$ R  s# a8 m; M, y' ]9 K#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    ; h* W, W" D0 W$ T& Jy = (x*27+15).reshape(-1)9 q0 _& q) J3 v" x; k  {$ ]
    / F1 |4 B" O4 h: Z9 i/ Y; W+ e
    循环次数加成10倍,就看到 b 收敛了' b9 n4 s1 x4 `5 N2 s/ F& z2 r+ i
    w , b9 {" ^6 v6 \$ A- Y& n3 `
    27.002620697021484 14.826167106628418/ a$ B" ]# k. U, ~- R* ?1 U

    9 m; G- g7 }" Y; d3 S6 G和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-10-13 21:13 , Processed in 0.029192 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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