设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    ) C: c; _( c9 o1 O  `
    5 D5 y" K% R& }9 o为预防老年痴呆,时不时学点新东东玩一玩。
    . t2 K% O& G. r5 N3 h* a& F1 u9 j- j* JPytorch 下面的代码做最简单的一元线性回归:
    2 o( h: d- {% f: L. D----------------------------------------------# z2 D/ H* x8 J: F! P9 a6 E# m
    import torch: z) V0 G0 u& g* {2 m
    import numpy as np# O$ ^/ r/ I# |0 A# Z' T4 M& T
    import matplotlib.pyplot as plt
    $ D) N/ W; ~5 m7 A9 f0 a/ N2 `; wimport random; e9 m: s* G8 Y; I- f; N
    5 J+ ^5 {3 n! i. d
    x = torch.tensor(np.arange(1,100,1))
    9 x" N+ V0 C! M* oy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15) ~; ?% p4 n" Z- l: x6 d: F3 }
    / y: d. |) w9 v) A$ h7 ]% `6 Q
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b# y/ w! s6 @/ o5 R  Y
    b = torch.tensor(0.,requires_grad=True)
    " c- r) D1 {# Y" \1 A% i
    . `  k. g$ [- Aepochs = 100
    + T6 d  h) }7 f
    ' \$ \: n8 o# m9 c  D: P! ~* Z0 b  }losses = []
    " [, j' X0 G+ W* Q9 v: ^! B% a1 Xfor i in range(epochs):
    : {, J  Q. X( {+ c& }  y_pred = (x*w+b)    # 预测* L) @- z% W* i& \; Y" q
      y_pred.reshape(-1)
    - y( v7 l7 O- |$ p9 |5 \6 ?
    5 ~' `7 ^7 n! U" O' L& ?1 B  loss = torch.square(y_pred - y).mean()   #计算 loss
    ! U1 }" E  @0 u7 Q  n2 ~5 m  losses.append(loss)9 q3 K0 K6 O, `$ n# V# g
      ) L7 F0 h0 {( Z$ n9 T% G
      loss.backward() # autograd/ c+ h% X; I/ i  I# F0 l
      with torch.no_grad():
    ! Q; o/ f% h; b: V    w  -= w.grad*0.0001   # 回归 w; }: u/ Z* C* U
        b  -= b.grad*0.0001    # 回归 b 3 G% F" m* d4 A- E2 L+ J, H9 y: \; U
      w.grad.zero_()  
    ! j2 z) Q) @2 M  p5 x+ J6 u! B  b.grad.zero_()
    & @4 J. {6 m! \" k" U% M' k" M
    7 V; R0 @  C6 H' Yprint(w.item(),b.item()) #结果5 s& s5 L( [. \, A) C- R* F

    2 ^9 o% v: |1 c  T5 L% B2 kOutput: 27.26387596130371  0.4974517822265625! m2 L, o) Y7 W* s
    ----------------------------------------------. v- k- f* r6 B  \# q
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。* h/ z% L) G; E
    高手们帮看看是神马原因?
    % d2 ^3 _4 p6 b: H4 P2 ?* Y- b

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 ( y' l0 i5 N, A' t, E

    - ?- ~% R  p* Q: G没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    & L; I" j% v3 m  K2 [-------
    9 ]3 a8 \! ^5 Y, g  a不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    7 L) L$ X' o7 n! [* I, J3 _" k: ~-------6 r2 A* h: [- x
    算法诊断部分,建议把循环次数改为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
    1 ]6 D% \0 Q0 X8 d没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?3 q( O3 N; D' ?# x. L7 k
    -------
    1 f3 p) u9 i8 }6 q不好意思, ...
    7 J) s1 Z: n7 o. A) O- V
    谢谢,算法应该没问题,就是最简单的线性回归。
    2 b+ w; x0 H* F2 \7 Q我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑   |9 g5 b: X' F) n5 C
    雷达 发表于 2023-2-14 21:52
    2 s/ [; z* A  a- F$ `9 T& T谢谢,算法应该没问题,就是最简单的线性回归。9 E# P5 W$ l/ e9 \7 h3 t( f+ |/ n
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    * Y( l) t. E/ ?+ G
    * j2 f0 T9 H' t
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。) y! |3 }( U. E6 o$ P4 e
    7 F% a, ~3 T# c, ?
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    8 D3 P. {( h$ o4 `9 M
    老福 发表于 2023-2-14 22:00
    7 O' H' b% s( `# N! I1 o% G刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。) T2 b. l0 \6 m

    2 v- B. \* b; q+ k或者把b但的起点改为1试试。 ...

    4 ?6 ?( P9 f; `+ t. n" q* h, b3 ?/ f; K4 K7 ?. Z2 U* J
    你是对的。- A5 @4 z2 O( k4 O0 H  a
    去掉了随机部分
    + o8 w0 y% j/ `- b6 z#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    , o# e7 \) [* {; U9 U; vy = (x*27+15).reshape(-1)
    + o# c- v! p$ w% `* H2 y5 n4 {! `1 q; w  B
    循环次数加成10倍,就看到 b 收敛了
    8 s% b- O( V6 d% J! g7 qw , b  y" I1 h8 C8 h" z3 j! y) C- K
    27.002620697021484 14.826167106628418
    9 c! H1 o% {* I& b7 x7 [- H: J, I. F  \. k; j
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-1 17:14 , Processed in 0.067769 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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