设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑   h5 n1 r/ T4 ^) ^1 Q8 ~
    ! L0 c* O7 n$ _1 b' F% |
    为预防老年痴呆,时不时学点新东东玩一玩。
    7 f2 L  {3 b' v3 ]Pytorch 下面的代码做最简单的一元线性回归:; |' L' H  p' X& s
    ----------------------------------------------
    / E& ]; Z' @; S1 gimport torch) A& q) c( J4 H! ?/ F
    import numpy as np% i: g/ i1 O5 b5 z; ~( S0 Q* R0 u
    import matplotlib.pyplot as plt; M) v9 z3 ^  B$ c% [+ G
    import random
    $ q. W4 c% X. J" J
    ; m. P. [) w$ V, S1 jx = torch.tensor(np.arange(1,100,1))
    2 P! E, E# i9 m7 y& ?$ Ny = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    , t- |, a: C  e3 U$ b( p1 i
    2 s3 `0 w  l: V' B$ ww = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    4 g6 f3 N1 C* ?b = torch.tensor(0.,requires_grad=True)! M0 ^9 @1 g' Z) G2 f$ }* r
    3 N7 P. U: D1 _
    epochs = 100' `; ]$ H: s- a: s
    ) R4 y% C7 V; C% a
    losses = []8 k# v. L3 B6 |) D
    for i in range(epochs):9 Y% z3 x% I: ^* h. M$ b3 m
      y_pred = (x*w+b)    # 预测
    9 ^' c6 @! d! a& ~5 y  y_pred.reshape(-1)9 Y# A" f' _* `4 J
    7 }, U( ]) n8 |! G3 E, y: t% E( l
      loss = torch.square(y_pred - y).mean()   #计算 loss
    7 U& g: A  ?# C/ J' b* i! e  losses.append(loss)
    ! K; e5 x4 V% }/ T3 I1 v  0 u4 }" A9 s; b7 S6 _3 K3 B
      loss.backward() # autograd
    8 w* \% m; t( Z- a3 |; [+ m6 y  with torch.no_grad():; O/ k% D; }) \5 n- [0 \4 U7 l
        w  -= w.grad*0.0001   # 回归 w* j! ]  Q: O. Z1 o% G8 j1 l
        b  -= b.grad*0.0001    # 回归 b
    + d3 r6 |( T: W% @* a; H3 E  w.grad.zero_()  ( }: o3 }7 C5 f9 E# h& O  Z
      b.grad.zero_()/ |& f2 ]) s. ]4 i7 E& P

    - ?( u5 a* m/ o' N+ bprint(w.item(),b.item()) #结果4 s" Y. D( E* H6 S" q4 I

    6 c* ?/ e4 h. o8 s7 E  EOutput: 27.26387596130371  0.4974517822265625' Y$ q* R6 U& b* A) N; f: ~& F. \
    ----------------------------------------------
    + w5 W1 i, U' N2 c: [最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    / e* [  M& K+ j4 j; V8 B+ `高手们帮看看是神马原因?8 V9 Q; y! k: X: m# l% x

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    : h1 Z' o, v2 @5 v3 o; w1 E
    ) ^) ?4 J* @: J7 |没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?6 v5 V. S7 i  o+ E7 e
    -------
    3 N5 A1 j2 Y5 ?" r, b- L8 [9 U不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    % o6 T% f1 |3 u& N' a) X4 g-------
    8 `) M& n) }  k算法诊断部分,建议把循环次数改为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" t9 b- T! ^/ q6 r7 `+ {0 Q
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?" b9 @; y) ?: u  X! p: u/ ]7 Y; A0 m
    -------7 C" K: Q  ~# [" |7 W4 O
    不好意思, ...
      M) G! P1 S# V! ~& C2 J( n
    谢谢,算法应该没问题,就是最简单的线性回归。1 U! P- n; h$ q9 s, X  d" ~
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 * z+ _9 f  C. |3 G
    雷达 发表于 2023-2-14 21:52( R2 `$ q9 ]: Q. T+ M( V' H6 N
    谢谢,算法应该没问题,就是最简单的线性回归。. A1 t7 I& G( S7 e5 j. n) X
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    . I3 y$ _; Q' u+ H: f- F, E
    7 c0 r% }- L9 u7 B- J8 A# E  _  W刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。( R8 E0 o9 h$ J9 ?7 Z
      `/ W5 v4 Q( y8 T/ I* y' c
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    6 U/ ]6 I' l% i: J" V% x7 x
    老福 发表于 2023-2-14 22:00% Y3 o* [  h. Z$ \  Z
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。) R: Q0 p2 g+ I1 J: W
    7 v1 |4 Y' I  X8 [+ h4 _
    或者把b但的起点改为1试试。 ...

    2 v( M! P* S8 V6 }  N5 K. k0 B2 t; u) I" @: \: R
    你是对的。
    * {, ~* n/ x8 e9 A; a去掉了随机部分
    & J* o$ K: o7 U6 R4 H1 e# O0 O5 u#y = (x*27+15+random.randint(-2,3)).reshape(-1)3 B+ U2 Z, F9 a: ?( b) k
    y = (x*27+15).reshape(-1)
    / Q0 _: [$ L* i7 p, L3 W+ T5 T% P5 s* u, `$ g3 n/ z( @1 z7 ?
    循环次数加成10倍,就看到 b 收敛了5 G& P9 }4 Q3 _) a/ y: |0 k
    w , b
    & U# R2 D5 M' a: |1 V' U; B$ D27.002620697021484 14.826167106628418/ E. i' C8 h2 |. ?& D
    9 q  I9 F& M5 r/ h; S1 }8 r
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-15 10:13 , Processed in 0.058141 second(s), 17 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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