设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    ! J! m) a5 y) D4 G  G
    . _, L5 ~& Q: o2 Q$ K" @为预防老年痴呆,时不时学点新东东玩一玩。
    0 O, v) z  E  O- ~, R# hPytorch 下面的代码做最简单的一元线性回归:$ u; [/ Q( ~) Q/ B1 u6 G1 _
    ----------------------------------------------
    ) @% ^- _2 l! d  y/ Ximport torch
    . a% x1 B( L7 B/ @6 aimport numpy as np
    & F& I) d( j  c& T4 Timport matplotlib.pyplot as plt
    ) c4 \( T; C9 k' M, B; V5 zimport random
    2 z- T9 N9 [5 A7 J! }$ a3 o8 }
    : p- K. B  G* J* d! ^! U, r+ Fx = torch.tensor(np.arange(1,100,1))9 i- a( p% a& F: l7 i" {3 v. H
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    1 u; {2 i6 |7 A# {! P1 v, w* V
    9 e3 Z6 }" |9 x; ]3 R. e, Cw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b6 c3 ~7 }. R6 e& n  h3 ~% n
    b = torch.tensor(0.,requires_grad=True)% `. Y  h& [$ t, e# y7 ?1 I/ p

    + U9 n7 k5 t1 U) u! yepochs = 100. g8 x1 Y! p( x& d1 X$ D2 d9 [

    ! s  k/ S1 l! ]. ?2 ^3 Slosses = []* u# ^9 @9 u1 t  o, _/ b- b$ v
    for i in range(epochs):! J; p- N8 x/ z6 Q
      y_pred = (x*w+b)    # 预测
    $ ]3 X/ W# y- ?/ y0 T1 x8 l$ e' E  y_pred.reshape(-1)( U' d1 f9 ^% B/ F0 x
    + ?4 d, A4 x# V5 A1 Y
      loss = torch.square(y_pred - y).mean()   #计算 loss
    8 |) v1 j3 l. C6 i6 g4 ?  losses.append(loss)
    6 D! \) \6 {8 Q) J  
    / E" x; F& o9 ]8 T  loss.backward() # autograd
    " c3 E& A9 U' U  |  with torch.no_grad():
    9 D  ~& ]! q9 K5 j, d5 \    w  -= w.grad*0.0001   # 回归 w
    : ?* }* `% ]% n8 }8 l    b  -= b.grad*0.0001    # 回归 b 8 A* N. V$ Y! o
      w.grad.zero_()  , P4 j' l7 s9 f2 t. W; _7 F+ F
      b.grad.zero_()  ^) t7 X& X4 {4 m; O3 w" ~
      O" F& @+ u6 p
    print(w.item(),b.item()) #结果
    0 o4 `; d1 V. s% _$ H
    . ~8 y& d/ W/ S7 ~" V" N6 DOutput: 27.26387596130371  0.4974517822265625
    $ \& ]% n( o2 Y0 l$ j----------------------------------------------8 i2 _2 Z, w. x& [
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。2 I* M5 ?8 |2 x7 F
    高手们帮看看是神马原因?
    7 `9 g6 V- g# b4 J7 z5 x/ L! W6 \

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 : S# E, K1 Y3 E* x  P
    % F  g& \( h# t4 A
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?: ?: d! N' r$ T6 X) j  Z
    -------( \, D" }5 M& D9 I4 p% M
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    $ G) M1 z2 d) E8 l-------3 u7 t( E4 _: S* m2 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
    3 c1 ?9 X& \$ Y6 z6 ]没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?4 \' U* K0 {8 s- c( S" m0 `
    -------1 F' M" d* R2 W( G; e) B) J3 Y
    不好意思, ...
    + v* R$ J4 {6 z
    谢谢,算法应该没问题,就是最简单的线性回归。
    ' Z8 _$ L: ?! H; F/ F  m# B我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 9 g3 w! X/ s, W1 z7 K& k
    雷达 发表于 2023-2-14 21:52( A( O, _4 Q& U- z
    谢谢,算法应该没问题,就是最简单的线性回归。
    5 G. @8 q" y4 A7 t. t+ ?3 J我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    1 _9 _& u4 e8 ]/ W, @
    4 ?' @+ z9 t" ~+ D! g5 F- N) f
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    . E$ T% u9 V& ~* Z/ V! X3 b( u' `9 l# Y9 M( N: Q& T1 c+ {
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 , e6 {! J( g7 r# T; y
    老福 发表于 2023-2-14 22:00
    2 d$ _5 r$ e! i/ t) T刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ) ^5 L$ Q8 q  B" @+ I% X6 O, p0 Z7 L* A; U+ W, g" ~1 z  l
    或者把b但的起点改为1试试。 ...
    0 t+ {, k8 e- q3 t( [
    ! S: S6 A2 I( ^( P1 T
    你是对的。: T3 F9 i/ J' H! p( A3 S) y5 B
    去掉了随机部分
    ' U% v4 a1 R: m#y = (x*27+15+random.randint(-2,3)).reshape(-1)4 R0 ^- a& q* ~- F2 \9 O
    y = (x*27+15).reshape(-1)& ^) w; D  ^2 N! q* v- K6 e( i) B

    & ], w1 ]$ Y/ b! P循环次数加成10倍,就看到 b 收敛了# J7 [" R* o5 `: l
    w , b
      d* R3 k4 w( b4 X/ M" [6 M27.002620697021484 14.8261671066284186 G4 g7 y+ a: ?* s. m7 h

    * A6 u1 G. z; w1 T& t6 ?和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-31 01:01 , Processed in 0.065468 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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