设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 # L% U, u5 R. v$ p' W2 J  _

    7 w5 g; b! n# \( [; l- I) c; f为预防老年痴呆,时不时学点新东东玩一玩。1 u, f$ J& P! Z: `
    Pytorch 下面的代码做最简单的一元线性回归:
    ( e, x9 A1 `0 _5 ^5 \----------------------------------------------
    $ J, R; {8 o5 w4 U/ f) h+ t$ [% J2 aimport torch
    * g# H" z: {4 r1 U+ l" y# _import numpy as np
    6 ^5 t2 n8 w& W; x2 Y6 M1 simport matplotlib.pyplot as plt! b7 ?" n8 F1 D, j7 W$ K
    import random
    ) H7 k. V) s9 S$ G& Y1 E  q1 J/ n3 ^- q, o( I" p
    x = torch.tensor(np.arange(1,100,1))& V! z, q2 p% |8 ~6 j8 }
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    ' e. E" \7 S" r3 m8 D! \- |* L
    2 H. }  s3 a9 d; T- a- J8 l# rw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b* W- I  E7 |0 Q) \9 u
    b = torch.tensor(0.,requires_grad=True)
    8 B7 K$ a+ y+ g! k2 A
    6 j/ G  x% a# }8 B. B& X# [epochs = 100% `! ^* Q+ G) n
    , ~5 E+ V& ], }: K2 P' F# n; r: x, W
    losses = []; r4 o3 I: k5 ^/ _% l! k
    for i in range(epochs):1 d( k1 l. ^  p8 s
      y_pred = (x*w+b)    # 预测5 L9 U- e6 J+ l6 [$ J" M
      y_pred.reshape(-1): R3 [# l. a' f' W

    # e' ^9 X; |; f, \+ L9 e: p2 a  L  loss = torch.square(y_pred - y).mean()   #计算 loss2 B7 u7 h/ S; F4 M* e) i  h
      losses.append(loss)
    . B  ^) W8 Q+ q/ j5 k# Y  & {0 ~# y8 Q1 a% O' _, j; E
      loss.backward() # autograd. b, \" J; c1 j: w  s
      with torch.no_grad():& P+ g2 i8 T. r6 ]
        w  -= w.grad*0.0001   # 回归 w1 n7 U# t1 h$ ?0 l6 p0 c  p7 `
        b  -= b.grad*0.0001    # 回归 b   d8 c& W! [8 N, K. `1 J, k
      w.grad.zero_()    ]$ ~5 U$ R+ f+ l
      b.grad.zero_()
    / Z! k" _1 k# T4 ^" ?- L/ c& O# F0 a% L# B- T! \7 _
    print(w.item(),b.item()) #结果& ?; @9 F# D0 e( N3 O, ^: C0 S

    & U2 ^5 x# Y; ]1 j6 {; x- ?Output: 27.26387596130371  0.49745178222656255 L5 K: ~. n$ }
    ----------------------------------------------$ t# g3 Z% B+ Q& V5 }, p
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。8 n+ t/ b/ L7 E4 `5 T  b; @
    高手们帮看看是神马原因?
    % U5 \. ]. ~9 H/ N. e9 l

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
      q2 V2 F  `: n
    . ?' N0 A, i! L3 k: x& x3 i没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?. H: }5 D- X  `
    -------
    3 O' ]' P; ~  `  `$ E; ]1 Y2 X不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    9 l. h: \0 y0 T# f4 a' l8 s-------5 a; \/ z1 @, L1 q& k! C0 T
    算法诊断部分,建议把循环次数改为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 i1 K8 W1 _! G. k2 O' P# Z没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    - [( [$ k- u! p  o! h4 \% f-------
    + `  l) W. e8 j* B9 H不好意思, ...
    . T1 g6 X/ v  F9 i) @
    谢谢,算法应该没问题,就是最简单的线性回归。0 l" A2 t  @% i7 g' F0 N
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    & v  r3 t: ]; E. r8 ?% g
    雷达 发表于 2023-2-14 21:52
    : f3 o5 ?0 i; H谢谢,算法应该没问题,就是最简单的线性回归。+ {, X! q$ }9 Z. p
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
      ?" K0 G# \9 E& r& K5 q4 {3 k. e

    0 t9 [! O# Z6 V* B) E5 u3 d: I刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。, K/ T4 w! I) h4 O" ^1 h

    . A4 t1 W, w: e. m; x1 {+ Q1 l或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑   S! A1 H- }$ S
    老福 发表于 2023-2-14 22:00
    / G* s  a2 }- t6 n1 N& R4 M' W刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    . L# x6 y4 C9 V5 q" z: Q' w& _
    ' V! ], V( I) D: l. `! `% a( B4 S% Q或者把b但的起点改为1试试。 ...
    - R3 o* x# L9 t2 m, ]1 `
    7 q! Y* f. ~2 x5 G/ b) c5 d7 [
    你是对的。" t1 u, H+ E+ B; Q( }
    去掉了随机部分8 c2 T/ ?& H" R( e9 J% b' O1 t
    #y = (x*27+15+random.randint(-2,3)).reshape(-1), r) E% E$ N2 T$ @1 d5 L
    y = (x*27+15).reshape(-1)
    & I+ g7 X5 C5 b' G: ?5 ]
    4 W4 a3 L3 i% Y% u6 s. ?3 C/ P; T循环次数加成10倍,就看到 b 收敛了( z3 S, I/ G# c. o( v# t
    w , b
    & ]  E! q& Y8 T8 v& a27.002620697021484 14.826167106628418# ?3 _, H, X5 ?) X7 f) ~
    , r; y% A2 x& I+ ^' \, p) U
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-12 23:02 , Processed in 0.056000 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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