设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    + k, E: W$ C) K
    : P# ?% t4 z2 b6 e  I/ G: X为预防老年痴呆,时不时学点新东东玩一玩。
    6 J9 Z4 r# \" Z6 IPytorch 下面的代码做最简单的一元线性回归:
    ( e3 F$ |) T' [  e, L4 J& U----------------------------------------------
    : R7 a" \. p2 W! t1 L# L4 bimport torch
    , W: T  H8 f& ?/ O/ }3 iimport numpy as np2 ^/ ^, \4 P0 S) i- u
    import matplotlib.pyplot as plt. }# u; ]$ a# h! [; b9 h
    import random
      V& d  N; U: {  h9 v) ~# a
    - m, \  ^2 ^3 I) o" m8 W' fx = torch.tensor(np.arange(1,100,1))( q( p6 c' [% S# R* ^. e
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    0 R( U9 X' D, e2 s5 C$ B& P" f  R- d; ]4 h% |+ }
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
      v+ L1 G$ S7 Z9 r  F( t0 l0 k3 eb = torch.tensor(0.,requires_grad=True). ^4 O: ?+ i# E* N
    # w$ W! y- \7 l, g- X% Q4 c
    epochs = 100
    $ L# {, U$ R' q# \" H& F5 U2 Z+ T& N7 _3 m' Q+ P; A3 Q
    losses = []
    % ]! o) y: w7 A1 q4 A& v' }( ifor i in range(epochs):6 A" Z# l: M) M/ T& m
      y_pred = (x*w+b)    # 预测
    , O: Q) n6 K, D* k1 l  y_pred.reshape(-1)$ K/ r. ?7 ~' m( i
    - \) X$ F( u  ]: ]0 }* Y
      loss = torch.square(y_pred - y).mean()   #计算 loss
    3 Y6 v9 z0 a& Z9 O, G( Z  losses.append(loss)* O; n. y3 {# J, x
      / E3 w9 {! A' N* I( `2 `
      loss.backward() # autograd4 h- ]5 s4 z# p
      with torch.no_grad():6 E' u! I2 R% l
        w  -= w.grad*0.0001   # 回归 w
    - T/ I) Y$ o5 ]$ D3 I9 f6 K    b  -= b.grad*0.0001    # 回归 b
    6 @; f# j0 X  b9 S& y  w.grad.zero_()  
    , _, ^8 D$ \5 R$ k  b.grad.zero_()
    . ?* Z# S7 h$ `0 o2 `# ]
    % M/ n+ V  p1 e7 Uprint(w.item(),b.item()) #结果3 U* f* @9 \: I9 f8 Z6 G; I

    2 {, R# |0 ?! H! s9 o: n! Y, aOutput: 27.26387596130371  0.4974517822265625
    - {; J' w& y- T2 |+ v5 r----------------------------------------------. _7 P8 C! ]6 q" K3 r9 a5 p# l
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    5 Q1 K. E( L& J! `- S0 y高手们帮看看是神马原因?
      b- z7 m! V8 p3 K

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    - w7 R! @% v$ Z( }* G& ~' g7 }$ h8 }0 S1 g4 o1 _
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    & Q' n6 y% ]9 n& i. U- F-------
    : d7 {4 ^" ]0 B  D) A不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    4 D3 I0 I3 x9 m! \: j8 k" L-------3 l$ J. _9 y: s
    算法诊断部分,建议把循环次数改为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& E( h3 _- o/ W. L' {$ J
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    + @5 R) n$ r8 u- g# l. E1 W-------
    ' f6 Y; }, S5 W5 h& U不好意思, ...
    : j6 K: X9 _3 ^
    谢谢,算法应该没问题,就是最简单的线性回归。
    - J9 m* v; {; ]  V. U我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    & m/ ~5 \) Y, _: E0 t# ^' U
    雷达 发表于 2023-2-14 21:52, {1 w; \/ I' [" L  m4 Y
    谢谢,算法应该没问题,就是最简单的线性回归。$ S! s" j8 a2 l8 n& L
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    ) ?5 |, x7 m8 T/ a
    + x" Z6 F" P" G+ `' a刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    1 F! O/ B- C: f& h3 p9 P& L5 h0 P* @, v4 c% h
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    ' ^2 P5 `5 t; a2 W9 c( R+ b3 ~
    老福 发表于 2023-2-14 22:00
    + B$ S9 Q' X2 R) x9 H刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。8 x/ w8 {  o' ^0 v7 s  v

    & R0 I0 P. i3 Y# B或者把b但的起点改为1试试。 ...

    8 ~& [. w( {( ~/ E
    0 S) j. D& k: J5 ]) o! C你是对的。4 a: c! |2 q) i; ^4 q, ~
    去掉了随机部分
    + |) u- F  u; C% ?" L#y = (x*27+15+random.randint(-2,3)).reshape(-1): A! O. ^$ m5 ]& q6 i" ?9 A( k
    y = (x*27+15).reshape(-1)
    ' @: u" V7 U* }
    , N# f% e2 ^" I( b; i4 ?% r循环次数加成10倍,就看到 b 收敛了& e6 n( b1 i+ h4 P
    w , b
    / u0 J# ]: Q/ t  p6 d! ?- m6 }( x1 ^27.002620697021484 14.826167106628418
    , U1 O5 f6 x6 f* g
    5 L3 h# z# S. u2 k1 `" J和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-24 02:20 , Processed in 0.067693 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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