设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    1 d/ i$ n  D  \$ l% K. ]0 H* ~8 R5 d9 \6 u  W$ L/ @
    为预防老年痴呆,时不时学点新东东玩一玩。
    5 N4 Z, O9 g- M4 c" @6 U1 b1 ?Pytorch 下面的代码做最简单的一元线性回归:/ e# W: S! Y' b" S  R. H# [
    ----------------------------------------------
    9 v) P, @. k! `import torch% r( e, M+ X" o. |$ V; r
    import numpy as np
    % N6 x$ l% Y9 Y& o" simport matplotlib.pyplot as plt! [+ n2 s; v, \, x! ~' X
    import random2 P9 J# C; x+ w( ?

    ! x% w/ V% p4 b; {9 M( i& hx = torch.tensor(np.arange(1,100,1))
    2 l1 g3 b. m, H! M. ~) @y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    : o: r, u4 n( b0 a  w; g+ m: B1 [% Z* E0 R; J  x
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b& q4 b$ V5 @0 O3 r
    b = torch.tensor(0.,requires_grad=True)
    7 I" G) U% l0 v3 W
    ( M$ w/ }0 e' K; E. G+ h* _epochs = 100
    + w* x4 P% j3 m/ h. u& j: A) `# T; c( [# F+ j+ O
    losses = []
    9 l  P( t6 W. k2 Kfor i in range(epochs):' [' M& e/ ~- `7 h$ n
      y_pred = (x*w+b)    # 预测+ `5 i+ ?; U' c
      y_pred.reshape(-1)  {- a" G7 N1 ], ?

    - {1 k- H' O: v, j# ?  ~  loss = torch.square(y_pred - y).mean()   #计算 loss4 L6 T, J8 l5 q8 @0 E+ D+ q
      losses.append(loss)- t  L  P6 _* Q3 V
      + y1 o# @" ?7 b' ?' h/ l% A
      loss.backward() # autograd' _+ z9 g( I2 W  h( a8 w8 R
      with torch.no_grad():
      M) E5 T! r. ]+ l( {- Z    w  -= w.grad*0.0001   # 回归 w; j# _" w( U8 X% e/ i: J1 o' B
        b  -= b.grad*0.0001    # 回归 b
    , u( A( P4 H; D  w.grad.zero_()  
    * {8 s9 d2 t! j  b.grad.zero_()
      e0 A5 [$ [# }% V
    , I4 _  P. _8 G% pprint(w.item(),b.item()) #结果6 c8 e) H' j0 }' E* V# E

    . A- ~% P; O  N! o/ oOutput: 27.26387596130371  0.4974517822265625: a5 I0 E( Z2 ^7 a7 s" u2 U$ Z# g
    ----------------------------------------------
    6 ^- F3 k3 \7 Z0 e& z# R" ]最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。( k6 c% r# z$ r
    高手们帮看看是神马原因?
    + f! L) y* n" h  q" {- K: m

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 1 M, q0 f* {6 T6 s
    . L& }$ T  v' Z4 U1 c5 \/ Z
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
      f2 ?; ~3 o0 \. Q-------. q$ h$ I  D1 ^& ~7 K
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。, h4 X) `5 \  ?* I+ L/ w# x
    -------2 |( L9 Q! U9 Y7 x+ F& S: x  D
    算法诊断部分,建议把循环次数改为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:238 Y% D& x% j% p  d
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ) l0 Q, L( B7 @, X-------
      `6 M  ~0 J) S  s5 Z/ x0 G不好意思, ...
    + H0 v1 g& f1 L) E! c
    谢谢,算法应该没问题,就是最简单的线性回归。' P- m. d4 x% s: P
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    % m' Z5 R- b5 u  ]; S  s' v6 E* {7 V
    雷达 发表于 2023-2-14 21:528 K1 w0 ^+ u$ R& l2 T
    谢谢,算法应该没问题,就是最简单的线性回归。
    " }; {7 }; `, g我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    % M4 c5 z4 Q& y  t1 ?$ g7 W' M2 Y6 k2 @: b6 U6 f% s9 [6 T7 t0 b
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    : u6 L& C% {% O1 H4 F
    $ r) }& M- h2 W1 q' f$ c% G或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    1 J3 z1 v3 [8 |
    老福 发表于 2023-2-14 22:006 d8 m! A9 I' y5 s0 l
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
      y( o, V8 P9 S" o
    , h9 y6 w, K7 m% \4 \4 s  F: l或者把b但的起点改为1试试。 ...

    5 z0 }! a  T, e* M( S. s& B
    - z: l0 e$ N3 k  A& I, u1 \$ j5 d( Q你是对的。% |3 z% L5 v, Y" |
    去掉了随机部分1 n$ n$ c" B7 A1 B6 Z
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)) o8 a/ q( x$ [
    y = (x*27+15).reshape(-1)% u! }# ?0 `5 L: d* y6 d) w
    ) S/ j$ U. R0 F+ N+ [/ Q
    循环次数加成10倍,就看到 b 收敛了/ S* [$ m; Z" e. @
    w , b
    ( s+ h4 c7 n% _( y27.002620697021484 14.826167106628418- I" i  r" k: r4 j% x! p

    . A2 q: G! \6 O# D3 x8 W0 Y和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-30 09:38 , Processed in 0.062991 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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