设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    6 f3 v' o! u% r' w. h/ _3 T$ N6 X- @
    为预防老年痴呆,时不时学点新东东玩一玩。' U' f* j8 ~7 h$ X6 c/ j
    Pytorch 下面的代码做最简单的一元线性回归:
    . x( q& [) c( {1 L! [----------------------------------------------
    " _. Z9 n7 p, C( Z) M% {- Nimport torch0 t: {1 P1 f" C/ V7 K5 N$ {$ D  u  V5 t
    import numpy as np/ a; Z0 _5 e7 X( Q7 u! j6 m: H
    import matplotlib.pyplot as plt
    5 i# A  C* D2 ]8 limport random
    0 F/ k3 h9 i: k' S% W0 k3 F0 b* y# g5 O9 L" U  u  [0 B
    x = torch.tensor(np.arange(1,100,1))* ]9 ]. D) z: f3 n2 w0 u
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=158 A, ?* c% M( j% G2 _8 d; a2 x

    ) y: f9 U3 r* e8 j1 uw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    $ _* @2 P- q9 g3 P) U$ U4 W/ Ab = torch.tensor(0.,requires_grad=True)/ Z2 [5 u. r* W1 _
    . r+ r7 g: N1 r% ?& Y, r
    epochs = 100
    7 l4 z* J& ^1 r8 z6 a/ l/ ~/ D
    $ ]* v, u. @; \* I  ?* [' llosses = []( l% h9 A9 O1 [6 W# M( a# E. B
    for i in range(epochs):
      L  {9 u% l: h0 H  y_pred = (x*w+b)    # 预测) w4 @6 e  a1 D2 Q  V5 W& `
      y_pred.reshape(-1)
    % l: I$ G4 e% q* A/ @: ` & D# l4 T2 t$ s- y* o
      loss = torch.square(y_pred - y).mean()   #计算 loss0 e; |' L% g! p
      losses.append(loss)% d/ }5 ?: O4 l5 e
      
    * w8 _& g& B7 a. _: w' Z2 x7 v  loss.backward() # autograd
    ; C& v5 s. o9 E& ]& G  with torch.no_grad():
    4 T, ~, |/ s  B1 `6 X0 U  @" Y  z4 x    w  -= w.grad*0.0001   # 回归 w3 b8 o' n) V! s  b
        b  -= b.grad*0.0001    # 回归 b
    / x/ a4 F! U; W& N  h) f  w.grad.zero_()  
    2 a+ g  k  e; L  b.grad.zero_()
    3 k; N& u0 ?3 ^" B
    5 C0 Z: e& ?& ]- d) h$ lprint(w.item(),b.item()) #结果5 j9 c7 {. m( E: k* C* ?

    ; [7 l! U2 G7 [. K7 i( ?Output: 27.26387596130371  0.49745178222656257 y& t* t9 ~: w, g& I+ I
    ----------------------------------------------$ g( M% x5 r: z3 F9 v) u: r
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。! V* b+ ^  |% c/ t2 o. g
    高手们帮看看是神马原因?
    9 f; Y1 k/ }: ?

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    7 c* c: ^& G; F( m6 d. ^4 ^' b% g4 M
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?% S0 l/ i0 w( m
    -------
    ( W. p6 e' Z. T0 e0 Y2 c2 u不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。% A, }, v/ m6 Q+ m' F
    -------
    , |1 H9 e' g$ Q% W算法诊断部分,建议把循环次数改为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
    ( J4 F' x/ s& d* N. K/ P没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?2 G: w) e; u4 B# L  B) M
    -------$ y) T* k- t' r: f
    不好意思, ...

    * F* Q* H$ p  m& U; L谢谢,算法应该没问题,就是最简单的线性回归。4 F. ~  ^( k. Y1 X
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 : X! v/ `- C$ C* m8 o' n
    雷达 发表于 2023-2-14 21:52
    2 s4 ?1 e5 ?: a1 A$ e; _$ R3 |谢谢,算法应该没问题,就是最简单的线性回归。& N9 R  G8 e* Y, P4 e4 d, A4 z
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
      B: z5 n* l5 Y& d2 L

    * a3 `3 G+ c" g1 Z" [刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。  P2 Y- g+ {/ A0 @
    9 p) m/ Q/ y3 e* k4 a: W
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑   P$ k* x: M0 I1 t6 @
    老福 发表于 2023-2-14 22:00& i% Y5 @! H0 e% ~8 A
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。' n" l$ n* n, p& u9 K0 K+ `

    ' s& m9 l/ a' y/ N$ s8 x或者把b但的起点改为1试试。 ...

    7 b7 ~: U. p2 z6 x, g
    1 M! l" K; p$ y  S1 e0 R3 |你是对的。; c3 r1 B. M! @# n, L
    去掉了随机部分
    7 G& D7 L0 d7 I* O0 ^. }8 p#y = (x*27+15+random.randint(-2,3)).reshape(-1)$ ]' E. Z5 I- u& Q2 W1 n
    y = (x*27+15).reshape(-1)$ B7 B8 ~2 j; A  F! l; x

    # n" m" W# o  Q( f: c4 D$ r循环次数加成10倍,就看到 b 收敛了
    ; J* N# l4 a1 U+ \& `) N8 pw , b
    ( F" ^; `8 m7 W$ {5 K' h. L27.002620697021484 14.826167106628418
    3 b) x% t1 m) l7 b- k9 _
    0 @7 K# |! g- |2 j* }; U2 y和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-23 10:29 , Processed in 0.060835 second(s), 17 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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