设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    ) s9 d! g1 ~7 w( n2 v: I8 n, P7 r4 w8 O! A' r
    为预防老年痴呆,时不时学点新东东玩一玩。! ~8 V8 e2 \7 @/ r3 c
    Pytorch 下面的代码做最简单的一元线性回归:  A% |: Y/ ~5 {* x( Y% m4 b
    ----------------------------------------------
      v# ?8 V2 o8 i( \  Mimport torch7 l7 Z) @) r- f. k, e& E
    import numpy as np. L2 X' W& S  @8 P5 v, s  ~
    import matplotlib.pyplot as plt
    " S- h- i0 a4 \( A- Gimport random
    6 ]& K% [0 n7 q9 B/ b6 m9 i2 C3 ]7 B
      f" E8 E( m( i' w, D, y7 T! px = torch.tensor(np.arange(1,100,1))
    . m* S8 S) L' p( y4 \) Oy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    1 c" @/ s  Y% L
    " n" W& C- x% `* ]9 _w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    / R+ d4 |) L( S; Eb = torch.tensor(0.,requires_grad=True)% e, y6 _3 x$ _7 E3 E
    3 a' p) t* k5 [. q& O' H
    epochs = 1003 N5 e( ?2 k1 k  l0 w6 u

    , U* d  a6 H& j  P2 ^5 Mlosses = []+ B/ {' P1 A# Z3 `' `
    for i in range(epochs):
    ( z$ T- d' X, C( ?8 R0 d  y_pred = (x*w+b)    # 预测5 g6 |  z2 h; J0 D% D1 E
      y_pred.reshape(-1), n+ F; p/ L+ @) k  C' a

    + B. w2 U& i- {9 [, n  loss = torch.square(y_pred - y).mean()   #计算 loss4 g# ~6 H* m! u- M
      losses.append(loss)
    ! n8 e  H  Y4 q  
    6 `. T) C% x6 _8 l- c% z0 Q  loss.backward() # autograd
    ( `$ M. D  z. Y, h  with torch.no_grad():' n2 f7 U* z& L$ R4 K4 h
        w  -= w.grad*0.0001   # 回归 w% m( i5 Q; N: M" ^- L5 u
        b  -= b.grad*0.0001    # 回归 b . v8 A0 j  V# M3 O6 O: w
      w.grad.zero_()  1 P; l9 M5 x. }) v( O( q2 H/ X4 [
      b.grad.zero_()
    % N& Z, g3 g, [: _7 L7 s2 e, e
    , U, P; @$ ]  iprint(w.item(),b.item()) #结果1 q. U2 I+ f8 O8 D7 O# k9 v

    4 w! C, B) i9 p$ ]* l  b* B3 ROutput: 27.26387596130371  0.4974517822265625! d, l3 q" V) Z9 C
    ----------------------------------------------: N+ q7 j- a4 m# N4 p
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    : w, n; O6 j8 \/ }高手们帮看看是神马原因?1 G) n+ H& l. p* w5 {. \

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    7 F: Z) z* l0 n
    2 q) r7 S* b+ F' ~没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    0 @) g+ A5 B. O+ r$ {-------
    " k# y0 |4 \2 _) c不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    . p4 N0 o+ ~& G6 W% F# T0 `% V  E) t-------
    ; W1 N# V: J" ^; [算法诊断部分,建议把循环次数改为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
    . \. l  E' k, x# e7 x. Q没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?1 M: p2 o& D' n! u6 x; h5 `
    -------; @( N9 C/ |  O/ @/ x/ D
    不好意思, ...

    * U- A0 F8 C7 h( _谢谢,算法应该没问题,就是最简单的线性回归。
    5 e4 X: E& o0 Q我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    ) q3 S* |* }5 c+ h: H
    雷达 发表于 2023-2-14 21:52) f1 k: H. |/ x8 E% T# O
    谢谢,算法应该没问题,就是最简单的线性回归。
    ; s; X- _6 a) k& l我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    7 D! T- L- e1 a6 z3 r$ o1 q8 }% [+ r4 ~! M$ H& o; N& e
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。4 d0 @, o% h) c( k* e( R: \  o

    $ e( ]* |/ ~% p; W1 M7 s或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    / f* J: ]2 {: _/ N/ q2 L9 ~
    老福 发表于 2023-2-14 22:000 |- U* O- n, E% s: W, u- G
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    & K3 i( J+ T7 T2 w% ^' Q
    / q+ r0 L: D& V  B: }, p或者把b但的起点改为1试试。 ...

    $ c8 t! D, n$ {1 c2 U7 T* V0 N$ ?$ @. H
    你是对的。
    0 f4 v+ L5 F# d去掉了随机部分+ w$ d+ ^5 c+ d) s* j6 z( i0 B
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    2 `/ |" y1 h, p# z. Q* Oy = (x*27+15).reshape(-1)1 E* m9 G& X9 e( y6 {2 Z1 W& O% r

    * `$ A0 G8 L6 W  M' u循环次数加成10倍,就看到 b 收敛了
    + @2 Q; `4 R# D( O- ^* E% ow , b& i3 q& {) Z* ]5 p& p0 {: v/ C7 }
    27.002620697021484 14.826167106628418
    7 E; V9 E$ t3 g, j# U2 g2 o2 d2 Q/ {: K6 k# `  n
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-6 08:21 , Processed in 0.057969 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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