设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 6 z( z7 M5 B- G1 O% F4 k
    + m) s2 `6 p5 ?+ q
    为预防老年痴呆,时不时学点新东东玩一玩。% V- ?/ n: k2 A% B9 T9 w; X1 W
    Pytorch 下面的代码做最简单的一元线性回归:/ G$ L& @2 s) g+ E1 p
    ----------------------------------------------
    * H! }+ s' B7 vimport torch" {9 ?6 e" v- r: C: r4 z
    import numpy as np* L9 m* W& N+ }
    import matplotlib.pyplot as plt
    8 f4 C" {. E1 _" j- p5 q% uimport random
    ( W9 Y# J' X  k- @8 f/ l  c' a( u5 G- y5 S
    x = torch.tensor(np.arange(1,100,1))5 E! e, B3 w7 n0 `2 r: U; v
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=156 X' D( S+ D* E# x0 ]" @
    ; c2 O% M6 R3 V0 T& y; n
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    * ?! D% ?7 s- v) A! kb = torch.tensor(0.,requires_grad=True)" X$ _, r2 g' R! q$ z3 F5 |6 U

    $ c; h+ a0 m3 P3 _1 ^epochs = 100
    4 Q; g! o# {. N  i1 w( J4 H  q4 Z4 I3 T; W6 b% Y2 ^7 q. i
    losses = []
    ! S7 F  U" G* y& e! D1 Dfor i in range(epochs):( X: ~+ e' O, e) D4 R+ R
      y_pred = (x*w+b)    # 预测! T) I( k0 T; T/ ^! e% y4 S* L: ~
      y_pred.reshape(-1)
    $ w6 {! C. P5 ?7 @& q5 H  m 6 {# _% ^) l8 ^! V1 E9 P8 V$ n6 _
      loss = torch.square(y_pred - y).mean()   #计算 loss
    4 c+ R( _# T, N* P( C( f: i$ |  losses.append(loss)
    8 i, a2 F" r5 ~# g0 x  
    ) o' H  c/ ?2 I" k- X  loss.backward() # autograd3 T1 }7 ?) b: K0 g5 r9 s: z
      with torch.no_grad():% e$ a# l* J; w
        w  -= w.grad*0.0001   # 回归 w
    5 P2 X7 K- o* ?    b  -= b.grad*0.0001    # 回归 b
    3 i# w6 K5 m# N( X1 @  Q  w.grad.zero_()  
    8 Y- `% G0 T& r) I$ h' \# H  b.grad.zero_()
    # w7 t& z4 R" _" P; O! O- f0 ]! f% O7 N) X9 h0 ?( w# @* f3 S& Y
    print(w.item(),b.item()) #结果
    9 {) ^. v, A% L5 S' S& G
    , a4 x9 h1 e+ D" tOutput: 27.26387596130371  0.4974517822265625. \6 C% }- A3 D6 i$ `
    ----------------------------------------------6 u2 y: [# p5 \, s% O; X
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。+ R1 Q1 e; f, G
    高手们帮看看是神马原因?
    # u# L, ~5 O( Y7 l, E

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 ' \* S- z$ {& L; p6 c4 {
    % f( `" R4 t/ G2 N4 `
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    2 {1 A- L2 J6 ]' g0 w0 b-------+ d$ Q5 c6 ]& Z; ]4 x- l0 l
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
      v5 j# @/ x7 `9 ^) i+ g-------
    / q0 t" X  s7 I2 C. J0 M1 O) o算法诊断部分,建议把循环次数改为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:232 T8 l9 Y- {8 S* R
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    / x% v& a3 w: ]- x$ j: S, y-------
    ' J& W2 S) G1 Q. Z% Y7 u不好意思, ...
      ~; y% u: ?& Z
    谢谢,算法应该没问题,就是最简单的线性回归。1 p# ]& m. d4 g$ I6 h
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    2 K! D) N5 t% v' f0 S2 r( v! x
    雷达 发表于 2023-2-14 21:52& A8 d; G  V* {1 G' ^+ s
    谢谢,算法应该没问题,就是最简单的线性回归。7 h( U9 H9 d1 j3 e+ S
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    " T7 O& J( l5 T; b! ^
    & k4 l  P+ `/ r7 _* R
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    : u+ S) e8 s2 S' V" i* F- T/ {1 O+ x3 T6 d. r4 I; S
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 8 W$ y1 m$ z+ {! J' D. a) G
    老福 发表于 2023-2-14 22:00  x! c. k: @; e- Z1 C
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    * H$ W7 V2 Q4 O' b/ I& V3 x& W4 u% G
    . z2 y4 ~6 G( T; Z或者把b但的起点改为1试试。 ...

    5 S# Z: g. p/ Y7 V$ ^. w! `! j/ g/ L! ]- C9 {5 R) l3 G
    你是对的。
    % J; P* ], W' j6 `9 W( z去掉了随机部分
    $ w; b% @2 c6 o: c' g# \#y = (x*27+15+random.randint(-2,3)).reshape(-1)' E; c' a7 ~2 w
    y = (x*27+15).reshape(-1)5 L; I8 s  ?# N$ @4 C4 p1 v7 d
    4 Y7 T- G0 s1 \" j- r. r' J1 \
    循环次数加成10倍,就看到 b 收敛了
    2 m( m8 o; _# E" H8 W5 Yw , b7 _& O3 y/ x$ I* r
    27.002620697021484 14.826167106628418) `! d! ~# q$ g8 @/ V

    ) L  T) ~: }+ F  X' e和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-2 18:30 , Processed in 0.055524 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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