设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    8 C: ~3 k' [- G4 z! V/ a- m0 a: j
    为预防老年痴呆,时不时学点新东东玩一玩。9 \4 Q9 J3 ~% @" p
    Pytorch 下面的代码做最简单的一元线性回归:& A5 L- v( T; }7 E$ C% ]
    ----------------------------------------------! a- Z1 a4 i- e: W% \. L
    import torch4 y/ E6 T. d0 e0 ~7 J+ L. ~
    import numpy as np& `. H8 T' C3 T# b
    import matplotlib.pyplot as plt
    ' J9 O. e, f! |* x  _# p; Dimport random) ?6 H% N, L6 f$ A
    7 d8 r, j( r9 V3 _* i, ]+ }3 H
    x = torch.tensor(np.arange(1,100,1))
    $ o9 ?2 x$ t( A, _+ e& Hy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    % I' C4 H  ?2 d# p5 @, e6 s8 o6 A) q2 o, j
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b2 M' x% D' O1 O) v$ y% h( C
    b = torch.tensor(0.,requires_grad=True)5 f( N% F1 j- H7 _1 U( V0 S0 D: |' z

    , |& W6 o" X1 o3 g& H5 eepochs = 1009 q1 C+ W8 H- c1 v0 j: t- W

    * m2 J2 _6 f; {+ n/ b  t" klosses = []# C/ d1 a3 A! j
    for i in range(epochs):& @( y1 h/ q  O" L* H0 e2 ^* x
      y_pred = (x*w+b)    # 预测
    " y6 ]8 G) k. S  f% B8 u5 l" K, ?  y_pred.reshape(-1)
    - S/ @% ^/ ^7 @ ( v' M- C+ O4 a7 F* N* j+ j
      loss = torch.square(y_pred - y).mean()   #计算 loss. T* g2 V. Q; z: G/ D3 j
      losses.append(loss)/ K& ^+ n3 h8 W8 l% w% E
      % g9 G0 O0 K  m* G% I
      loss.backward() # autograd4 o- t$ ]- E) U" n) T  g, Q* I
      with torch.no_grad():
    6 T& l( k' J2 e    w  -= w.grad*0.0001   # 回归 w1 U" O: u- D- Z2 ]; d: r1 g" ?- \. j
        b  -= b.grad*0.0001    # 回归 b 6 C6 @6 u7 @$ \4 _2 j
      w.grad.zero_()  
    ; ]& k8 ]( F# W7 r7 h. ~  B& ~  b.grad.zero_()
    * p1 B7 m7 W) H4 K/ b+ _4 B3 O* P. ^5 S% C4 r8 ?8 p
    print(w.item(),b.item()) #结果+ M. Q; X: a6 B4 _4 w3 {) O2 j
    3 R; t% \! c6 r1 K  B
    Output: 27.26387596130371  0.4974517822265625$ c& ]& f8 q1 t9 z. ?& P
    ----------------------------------------------( D7 s- z  ?$ z- k
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。2 D7 U- r: `. w/ }1 X
    高手们帮看看是神马原因?. J8 g/ O5 |+ f+ N

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 9 A5 Y! l. E% Q2 w3 Y1 B- h; k

    / C5 G  t  D# I1 I, h/ s9 ?没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?3 }0 x7 ]% A+ V/ R* d& Q
    -------. R' }+ v4 L4 A" X% ^
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。8 m. D( X& t# `1 U( c
    -------# P5 B( e: r: A) m/ J7 U
    算法诊断部分,建议把循环次数改为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
    ) O  T8 i6 p" c* @8 n& H. O没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    $ y" [6 N3 p( ]: c0 ^-------
    $ ~. K6 Y" ]* y6 `7 l6 L2 G  t. u不好意思, ...
    5 a) X: T4 s% u7 Z' B2 O( J
    谢谢,算法应该没问题,就是最简单的线性回归。2 m2 F) x& b. D1 V5 p; t5 o
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 2 g& q1 D( W& Y! R0 ~
    雷达 发表于 2023-2-14 21:526 g! ^) l) x0 {# a; P
    谢谢,算法应该没问题,就是最简单的线性回归。; D* G  ]- w3 l' }& Z/ J. ]& k$ l
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    ' A7 R+ X. ?9 n9 _

    ( U1 x) _# o8 v; o$ K3 L: `刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。4 T& K) K. X* L+ r8 J
    2 B: D# B7 a6 u) L
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑   k5 c$ f/ r0 q) g
    老福 发表于 2023-2-14 22:008 n2 t9 f* ^0 I- s; [: v9 ~, D
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ; E6 K6 [; o! b0 T1 s2 w% l5 e" L( G0 m
    . j7 ^2 D& M: {+ m# n或者把b但的起点改为1试试。 ...
    ; l$ B% ?0 k9 L8 n& R9 }' x' I
      V. Z9 ]' a0 v/ o3 H4 ?6 ]6 n
    你是对的。
    ) V3 _# G/ E+ H3 F/ |去掉了随机部分  O/ C, U% n% Q6 i6 u
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)( O, Y! F- C0 E: H$ G7 d
    y = (x*27+15).reshape(-1): v  j6 _3 y' ?5 J1 k" V' [

    - }) ~9 E( `3 ^: Z8 y) G/ |4 P循环次数加成10倍,就看到 b 收敛了5 `; }+ H: V0 t, x2 R
    w , b* f. U/ s' s) D
    27.002620697021484 14.826167106628418, y+ o4 `8 k0 b$ s" a

    " T% C3 Q& X& p+ W+ j1 q! J8 E9 N和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-17 21:33 , Processed in 0.057884 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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