设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    ! h" |8 O  v2 T/ I+ c6 `7 @
    & z. ]) N: q- L为预防老年痴呆,时不时学点新东东玩一玩。; \7 p6 j- q$ W% Q6 r6 k* R
    Pytorch 下面的代码做最简单的一元线性回归:
    9 X# V5 R9 W! E+ Q5 K' \0 k  m----------------------------------------------( g9 e1 z& U- ]( [0 Y: x; ~
    import torch
    % s. u6 a3 }" J# u7 p, w; W3 Iimport numpy as np
    * |/ E& L$ o9 F/ X1 \import matplotlib.pyplot as plt
    - r6 I0 Q. T$ ?+ q( o3 K2 E& aimport random
    ! i: b7 k- i$ B; _+ O& o+ K
    . N7 y2 s5 P& z" m- ex = torch.tensor(np.arange(1,100,1))
    # J0 ]7 i* q) y4 {6 E1 Z& x4 Q4 }y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    # w# f% p* F) \, ]
    . C% F* j% T9 mw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b# K. ?0 u1 e9 n1 r8 I
    b = torch.tensor(0.,requires_grad=True)! S# s$ N% n, g4 N2 D6 ]6 a

    9 e+ y& d# K# T! T# Yepochs = 100
    - K4 k: y( s' g* s8 y' `6 E& g2 x5 @" l, X9 L* y5 @! T. E1 U
    losses = []- R2 P: W. A. k; f) X) g
    for i in range(epochs):
    % Z# L* P, z' _8 ]; N8 D  y_pred = (x*w+b)    # 预测1 s+ [. F) `  @9 |8 }; W9 L9 n, L
      y_pred.reshape(-1)
    ( K7 A7 H! ?. @- f' ^9 t ! T# L: H2 m$ B! U5 w' k- o
      loss = torch.square(y_pred - y).mean()   #计算 loss& i0 ]) s" T. ]
      losses.append(loss)6 ^" Q8 N+ u4 U1 _2 T0 s
      
    " T+ ~, }( K) X  loss.backward() # autograd
    & `1 [' p% I, X# J( y2 _, }7 ]8 U  with torch.no_grad():( f) R$ U1 X* _* I! t5 F- T8 }
        w  -= w.grad*0.0001   # 回归 w  F- V+ ^" t: H4 U4 O
        b  -= b.grad*0.0001    # 回归 b - `1 f+ Q$ S* N5 ]0 M3 `, D2 d
      w.grad.zero_()  
    8 J- s! ~$ i) d# m* @  n. ~  b.grad.zero_()
    ( |1 @4 Z8 S3 c% L' l3 Z5 c4 f6 ^7 d/ P
    print(w.item(),b.item()) #结果
    , v4 T5 k. c  o; h7 @7 `
    , E4 n" Z! M0 p/ H. c. Q. r4 iOutput: 27.26387596130371  0.49745178222656255 P7 M! C4 A2 J3 c
    ----------------------------------------------) I* E7 ]3 G8 i' ]/ Y2 O
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    # R3 L/ s0 O% Q9 I7 e# r/ W6 s. R高手们帮看看是神马原因?
    4 P; r8 E8 \3 U& I* X

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 9 n5 j, \/ g5 x- g: A  T4 E
    % |- W4 }  N/ _. O, p$ N
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    1 o) F% b/ U: d0 R0 |& ?-------
    ' I' p; D+ y" H2 B不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。% I: E/ r( `( O
    -------
    0 h9 p5 |: r( G+ ]算法诊断部分,建议把循环次数改为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& N- j, o% u3 g: a0 g
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?6 o; n# `1 \' ?% Y0 U/ S( N9 n
    -------- {0 E1 p, M, r  z) `
    不好意思, ...
    , j0 ]$ d* X/ M& y
    谢谢,算法应该没问题,就是最简单的线性回归。
    6 [6 \1 A: X- d0 R我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    . v2 e5 v) C: ~, P+ J$ B
    雷达 发表于 2023-2-14 21:52
    1 D9 T: D. k5 d5 \: _8 m1 B0 r谢谢,算法应该没问题,就是最简单的线性回归。' f5 b# o- r' Q9 ?. {
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    # {" Z( I4 _, k. {
    6 B$ n- T" A0 b6 c) |
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ' c. i) k& H" k" |  O
    8 t( e1 m. N2 }  S, ^3 X2 W6 ^& Z或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    - f6 X, r1 N. ^/ J- }& v6 S0 z  Z
    老福 发表于 2023-2-14 22:00
    * V, J7 W; N( O: g$ |( C4 x刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ) `9 t5 _' y3 R1 j  ~4 G7 L% B& L* ~9 X% `& F5 g) N8 |
    或者把b但的起点改为1试试。 ...
    ) ?( E. m# z' ?4 C0 q! i2 w; `4 h
    0 b9 d  D4 |# ?' Q8 N# d
    你是对的。
    3 J" |7 |. `" F0 m. k2 M去掉了随机部分
    & B& u3 R8 G4 B) j' e& i! u#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    : l8 D; D' V/ ?! U" H% \/ U9 {1 `5 u2 ]y = (x*27+15).reshape(-1)
    : q2 I6 B5 F: q+ m8 n& Y" c; u9 x
    3 n6 f  y. v2 \5 ]" v2 n循环次数加成10倍,就看到 b 收敛了
    7 x1 z) D  P' e3 z) I# Ww , b) D/ o5 F: Y! n' ]0 W: z
    27.002620697021484 14.826167106628418
    6 y) s! f. G0 w0 N
    * I; z7 W# w, I8 U和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-15 00:20 , Processed in 0.056730 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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