设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    1 x# t; }) ]4 \# _7 p- ~
    3 e; k1 c' g/ Z- e% k* J为预防老年痴呆,时不时学点新东东玩一玩。2 a# q) C5 S* G2 V
    Pytorch 下面的代码做最简单的一元线性回归:3 z6 ^) S' h5 }) y0 B
    ----------------------------------------------
    " R  ?9 @& ?8 F1 G+ O6 }import torch( ~( P' c! d& C7 _$ ~" V/ @
    import numpy as np* F3 M" f) t3 o- b4 c5 ]- `4 E
    import matplotlib.pyplot as plt
      Q3 p3 g* E7 Jimport random8 T% X1 x( o$ Q9 b# b! h

      c9 b% r* f4 ux = torch.tensor(np.arange(1,100,1))
    # n; X; k0 M( Q& \: V5 @  A4 gy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    # S: s* v2 z( |
    ) k, l% k& z9 O+ P. q, H5 }0 N% ew = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    ( g2 b4 N  d' x: a! N8 Vb = torch.tensor(0.,requires_grad=True)
    7 f& Q, m9 k7 \' ]" h0 w' B- V7 G( z* i* F
    epochs = 100' D* v. r1 Z$ W1 U2 L
    3 X1 `7 g" ~8 D6 u
    losses = []
    7 F( ?8 D" w2 e% Z6 Z3 ]9 \, r3 N5 bfor i in range(epochs):. l, z, i7 t+ `% ^# U7 x
      y_pred = (x*w+b)    # 预测
    ' b+ ^* u- H1 Z2 n; O% @, C  y_pred.reshape(-1)- H8 s& A2 M. z- N6 J

    4 j$ S" I- ^0 s3 v. |  loss = torch.square(y_pred - y).mean()   #计算 loss
      @. j" ~! I0 I5 L  losses.append(loss)
    2 `. R: E4 ^- @  
    # R# K& q8 [2 _& I2 C  loss.backward() # autograd" @" U+ z, a; T; o& K: I
      with torch.no_grad():
    9 v0 N0 O8 K7 P" s  H" Y    w  -= w.grad*0.0001   # 回归 w
    8 _: k( T7 @- m    b  -= b.grad*0.0001    # 回归 b
    # ?8 ?8 i( j. F$ V0 m: j5 }& \  w.grad.zero_()  4 b. g$ C+ K) n) B; ^7 l
      b.grad.zero_()  m) K- Y9 W& U& D8 K  F
    . w! w/ P4 y5 t' u0 f
    print(w.item(),b.item()) #结果, e* Q% B- t5 a" ^% S9 }
    9 u2 G* q. k: U/ o$ M* c  T4 u
    Output: 27.26387596130371  0.49745178222656251 @0 @  {: w+ M# l* T" J1 E0 V/ R
    ----------------------------------------------
    ! v4 @  p, B  G' S2 I- [' F3 X最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。  m/ Q6 O7 C  g8 v$ Q
    高手们帮看看是神马原因?& @$ k. Y/ T+ U  _( }) i

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 % S2 k2 u6 Z0 @; J+ }, M2 j2 c
    ; K7 Y# }0 w' w& m/ Y
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?0 T% q+ A% V, F5 a% F! \$ t2 V
    -------
    & `/ r: \& r4 S' z不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    ) l! k  x; f8 N1 S-------9 v8 A$ L( Z$ C: z- A
    算法诊断部分,建议把循环次数改为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:230 N% r" y/ U4 t, w
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?' n- }! I" s- ?5 r  f
    -------
    6 C' @1 t, s7 q' x不好意思, ...

    # J7 \5 X7 Z) e, U' ^谢谢,算法应该没问题,就是最简单的线性回归。: }+ |. R2 I: v! |6 e
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    2 f% q+ l( f$ D: l# s) @; S0 v
    雷达 发表于 2023-2-14 21:52- X/ P. _3 h7 m3 D$ t: U
    谢谢,算法应该没问题,就是最简单的线性回归。7 T$ v/ S1 p& s% g( O3 j
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    % r6 w' O+ m/ ]" i: l9 c
      b# v8 @6 D2 h' {刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。1 s; A, R  B7 j6 M- w. }6 b! a( M: S5 @

    , p3 Q  t) z9 K. s/ E) ^或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 ; U' R$ E; j! j# @- o
    老福 发表于 2023-2-14 22:00
    . P# u3 O7 K: {9 ^6 B刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    / Y1 }+ r% I, H% [) E0 E, g3 o  D$ e
    0 `5 T0 K5 B1 a0 o0 N或者把b但的起点改为1试试。 ...
    " b. N. x6 z; m& L
    - n: h; h& B& o- `% X0 H
    你是对的。
    % U( E& r8 z3 G! a' i$ N去掉了随机部分8 p1 C" n8 Q0 B. M
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)' _4 i- i4 @; }0 g) T
    y = (x*27+15).reshape(-1)( {  Y+ N0 }9 j, m8 \% }

    ' F6 f# ]+ i  X$ }" p循环次数加成10倍,就看到 b 收敛了
    0 x, T/ h; L( @7 b! V5 j: {# [w , b$ Q% @2 c0 ^: [  N7 V5 E
    27.002620697021484 14.826167106628418, R  b& z- \7 R  }7 d: ^3 v: R
    ) {5 ^0 i0 s+ S6 k
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-10 04:15 , Processed in 0.054482 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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