设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    7 c. R) k- H& }& U( W$ Q( n# t& k' e
    为预防老年痴呆,时不时学点新东东玩一玩。
    ! p* M& i! M, h7 c8 P5 E9 BPytorch 下面的代码做最简单的一元线性回归:
    ; L& L/ f& f. }& r% l- C* O& Z----------------------------------------------4 t- O& n- S# |$ F5 V
    import torch
    3 j) R2 x. C/ e- }* s* Himport numpy as np
    * q7 e: i5 g  t% M* u: himport matplotlib.pyplot as plt/ {" [( @% s. j
    import random
    $ n+ p) l* h, S! M0 f* x% D! Y) @2 R0 E  b! K
    x = torch.tensor(np.arange(1,100,1))
    + K+ s) p. D: ?( E0 ry = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=150 f! r, v* x5 t4 h3 f

    - C/ R6 s; _+ U- @) _9 x1 Uw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    / @: D: L" F# t0 u' J7 `: |0 I& y. m& qb = torch.tensor(0.,requires_grad=True)  O" b1 o$ K) D$ k
      U% E! ~! X& l9 n3 y/ F/ h
    epochs = 100& A$ ]6 }# {2 P  a8 P# U

    : b% x/ `/ K- g: \7 klosses = []7 v$ {6 y8 @& k
    for i in range(epochs):7 z& w1 `2 G' B' y1 H) y$ {
      y_pred = (x*w+b)    # 预测
    0 w4 z6 r& T2 H  y_pred.reshape(-1)
    & `& h4 V$ S" x- X- h
    $ P% T9 |3 W% k* u' |0 j% E  loss = torch.square(y_pred - y).mean()   #计算 loss0 o6 {$ ]8 k4 N+ ^- m
      losses.append(loss)
    ! \- H8 T6 L: g2 F; B& J' B7 D  , [' n( f2 ~1 ]8 v# K
      loss.backward() # autograd
    4 P6 o2 {; s' P  with torch.no_grad():$ b" g4 F2 F; G. Z$ x% P5 t
        w  -= w.grad*0.0001   # 回归 w
    , ~* o/ W3 B0 t* T2 B    b  -= b.grad*0.0001    # 回归 b
    9 w4 q; ]: Z- Q6 G/ l& n& D% J& g  w.grad.zero_()  
    ' h, S0 f, D+ I! G4 L9 h# ?. x- @  b.grad.zero_()
    5 o" h: {$ a+ Z
    $ l, @0 }! }% X- |6 a0 H# Y  Uprint(w.item(),b.item()) #结果
    3 K2 N* A5 v0 f/ A5 \4 B+ c
    $ [, @1 o8 U- t5 C- g/ C+ vOutput: 27.26387596130371  0.4974517822265625
    7 ^2 ]* U! T3 E9 l2 z----------------------------------------------8 {  ~' `' t4 _2 e- U- _3 h
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    ( c% d8 s/ c% [+ j" t高手们帮看看是神马原因?% k5 d$ x! G& g( f

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 # Z/ Y& n, N/ N8 w7 G, @! B! u
    + f. e* @) v! ^6 \- X
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ( p9 q* ?, ~9 q# d8 J8 S-------
    / `' g5 f: s& _5 c" g1 i不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。0 ?" |. i4 J1 f6 C5 y' S+ _7 D" w
    -------
    4 r4 f% h3 p$ |$ x* H算法诊断部分,建议把循环次数改为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# u& u% [+ Z% T! K6 `- p
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?! C# p  s" j+ k6 @! U: S
    -------$ i- [; [. d8 w; f8 ^1 Z
    不好意思, ...
    7 a3 N5 C. P5 r
    谢谢,算法应该没问题,就是最简单的线性回归。& C  |+ F% h+ \& O; y
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 6 Q& Z( J& h( ~! w' \$ b2 i* E" i
    雷达 发表于 2023-2-14 21:52* [6 B. B& }+ v6 q: r2 I" E( k
    谢谢,算法应该没问题,就是最简单的线性回归。
    % d4 e( i5 N* C# c我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    : q6 D, D. e0 p( s- a, t* V. s" Z* h5 g8 K8 ^) K! L
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    : n# w: T9 a8 `9 F& G
    5 \' Q" e9 V1 r$ ^5 [7 S7 s或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    $ t+ _" `9 w0 _  L% \& g, k! w
    老福 发表于 2023-2-14 22:00  j* C+ x, j" G) `: ?- L5 H
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。: L/ [5 f, L9 o: z/ {

    7 l9 }3 E* q: y或者把b但的起点改为1试试。 ...
    - ^/ e* d! l$ T) L
    4 i, N: I3 M6 i5 a" K# N
    你是对的。
    ! d6 T# g' ~% x8 O去掉了随机部分  M/ E5 o) b. `  o. N0 }
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)' I3 Q! W9 ~8 u2 v; Q7 ]
    y = (x*27+15).reshape(-1)# a# O2 u+ G% |+ x4 o% a
    , _6 C4 O8 h! ?. S. H; i
    循环次数加成10倍,就看到 b 收敛了
    8 Z4 u4 L, f& n) G& p4 ]w , b
    : {6 s& M1 ~3 E" \7 F3 I0 S7 X27.002620697021484 14.8261671066284186 |; q* z9 J2 S6 A, x# \4 ]1 ]

    / C; x6 }5 z" V2 b9 Y9 U  M! @和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-7 05:57 , Processed in 0.027802 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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