设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 ' V* v: j! c9 {* k+ M3 s
    & \& M9 c0 X& I" J8 L  `9 T6 x$ y9 J
    为预防老年痴呆,时不时学点新东东玩一玩。
      j# W, B1 ]- r  x9 q0 hPytorch 下面的代码做最简单的一元线性回归:! R, Z- O2 s% ~9 J5 u* Y- V% m
    ----------------------------------------------
    : w3 D- @% u& F4 l& L  z) T% Zimport torch
    + H$ N& C9 l. t# z) ?9 h9 Zimport numpy as np
    , z, \2 G6 k% X! V" `0 _5 e( Ximport matplotlib.pyplot as plt# D8 n% I8 X9 {( n. _9 G1 r
    import random  t# y* t  P* A6 L' Q# ]
      T1 ]8 w, I8 A6 S0 q
    x = torch.tensor(np.arange(1,100,1))0 ^& T2 |, _: {" R
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=153 |- z2 p& {) ]. l1 j1 E8 J

    0 c. k" u4 h8 x8 o. T9 H- @- Q# jw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    , p/ E* a+ N( O  t1 L* i1 Nb = torch.tensor(0.,requires_grad=True)
    7 v' r3 J6 D- @' @0 o* }
    6 M& Q( J" w7 t5 {epochs = 1007 X1 W3 I% g4 O; ?6 g
    + n0 G0 M0 w; Y$ R; O
    losses = []
    1 A0 C! b0 ~$ h# Cfor i in range(epochs):
    " @8 K* o; k1 d  y_pred = (x*w+b)    # 预测
    9 F* F; E, p4 x9 I  y_pred.reshape(-1)
    1 o6 c1 N7 k7 ^
    ! V: S' T3 f3 n# K0 r& p( |$ m2 X  loss = torch.square(y_pred - y).mean()   #计算 loss
    ; P# e/ v2 S$ O6 y6 G  losses.append(loss)
    / M. G1 }7 `$ u. ?9 T  
    + z9 j% X3 F0 a  v' b9 s  loss.backward() # autograd
    . \8 U5 }7 E  q( {* u: w" L/ p  with torch.no_grad():" Y1 I9 M) n* ^: j+ |* i! g
        w  -= w.grad*0.0001   # 回归 w
    * J" B% p: K* g    b  -= b.grad*0.0001    # 回归 b ) e3 x; ?- s7 P0 P0 ]! l
      w.grad.zero_()  
    & E- P9 j  o8 j6 q0 b2 D3 T, k! I  b.grad.zero_()  R4 l  F( i' \3 p6 P6 S
    ) ]. D& n. \& k% J" U* g
    print(w.item(),b.item()) #结果* m7 s% p2 z) M1 {" ~% T: G* I& `
    1 T3 ^# z) _' S2 d$ b, o
    Output: 27.26387596130371  0.49745178222656251 ^" Y3 v5 [1 o4 Q, \! n
    ----------------------------------------------% T8 O- T) `  n4 n% ]
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。# l+ y! U/ ]; [6 t
    高手们帮看看是神马原因?
    % h# w* m, U! n" T6 w

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    1 U- j* b  s! }/ f: q% p7 x! P. Y" @
    # X2 {9 }2 ~/ Z5 x, Q没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    1 S2 O/ B9 {, d+ n-------: x* X. ?+ h" Q  _# O4 e
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。" ^+ U/ p$ h& f6 O8 [; E: h
    -------
    8 p$ d4 d$ b) `  X0 p- p7 c; 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
    ; i% W! O4 C  c/ J7 J3 m, {/ T没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    " V/ Z3 j4 N+ I) }: N8 q-------
    ) s$ @. w( W1 V4 D, [不好意思, ...

    5 P. }: K$ N+ B0 ], e' t* R# p谢谢,算法应该没问题,就是最简单的线性回归。
    & Q+ ?6 J# r% N我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    & H- V' c7 m" ?: {/ t+ `
    雷达 发表于 2023-2-14 21:52' R! k$ X7 v1 T2 u1 q5 a$ y
    谢谢,算法应该没问题,就是最简单的线性回归。
    5 F- B; G* O  ~! x$ u: g4 Q我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    0 u7 t& t& k; M6 a5 v! J1 L
    $ J2 t( R  X. T3 `
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。0 p. m- F6 k  W: E2 A8 |3 r
    # K2 o# [, c+ i" A- d' `+ G
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    : d/ ]$ e+ X" R3 Z
    老福 发表于 2023-2-14 22:00
    . D8 v, T1 @. k刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。4 K! J7 u/ I) f* P, n; m7 h# f

    ( E5 b/ H- ^$ a# X4 d或者把b但的起点改为1试试。 ...
    $ z. C" [* b& ]' Q( N6 t8 o# ^- o

    / M- M0 ?! f2 A7 I# S+ K你是对的。
    - g7 o; P1 `. e% j2 e- `9 y) q) d去掉了随机部分
    + Q! K2 M( f1 M. L#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    ! K, A2 n( |* Z2 D. Ry = (x*27+15).reshape(-1)
    6 V- L- i- a) V" z( }; j0 p* r6 [9 g
    循环次数加成10倍,就看到 b 收敛了* D# w% }) Y% z! N) j& Z; `6 G1 p
    w , b6 t- l1 j) [7 G( s% m5 D
    27.002620697021484 14.826167106628418
    , s# l2 g( T$ F
    4 S& J, I, j; q8 V$ \和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-27 01:36 , Processed in 0.055668 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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