设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    7 x9 {& x2 J, t$ N
    7 z, p' o' N$ l! t5 U* N为预防老年痴呆,时不时学点新东东玩一玩。9 y5 e" B; _9 \! q6 {
    Pytorch 下面的代码做最简单的一元线性回归:& z7 R2 y# `2 X  T6 a/ _7 a( v
    ----------------------------------------------
    . r# b* j" E$ J: `import torch
    / D( Z  ?/ i$ W+ o; h, q3 Pimport numpy as np
    8 ~1 d8 ]; k# u+ J  Wimport matplotlib.pyplot as plt
    ; B/ R/ o' v2 B7 ]# q4 j' V- Eimport random  D) L1 R1 O+ @; m8 D. V4 I9 U. ?8 |; d

    3 P/ c5 z, o; U, {9 Wx = torch.tensor(np.arange(1,100,1))" H8 N% R6 g1 p& U, P) U4 F
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    0 B, R) j2 q$ C9 v, @, Q7 z& v- R  d3 ~! Y5 j
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    3 G  [6 Z) w' R& F, D% Nb = torch.tensor(0.,requires_grad=True)7 L: P/ @( J5 [8 {
    9 t7 _( J! _' Z& K; I2 o
    epochs = 100
    & H$ v1 _2 `% ?& h$ }% X( b3 R( |; e( a8 W0 Z9 H& S
    losses = []
    . R6 @, z/ D# x  U; }! u, `8 Efor i in range(epochs):; n6 [( z. D+ ]; q* z( E" I
      y_pred = (x*w+b)    # 预测
    6 ]) f2 V' J% q3 c* h, T  y_pred.reshape(-1)2 S1 O  c- _9 ?/ W
    - G# ^4 w6 n+ W; r
      loss = torch.square(y_pred - y).mean()   #计算 loss
    ) {1 X8 p% o/ _( F  losses.append(loss)7 h7 [9 {. [9 [) g$ N& N! k
      
    2 @4 e! a% x' `( T9 o  loss.backward() # autograd
    0 M3 _" S' H% C0 C& Q3 J% B  with torch.no_grad():
    7 s( E# T$ y8 i3 p( u% u& q    w  -= w.grad*0.0001   # 回归 w
    ) m. ~" y0 ^- w    b  -= b.grad*0.0001    # 回归 b , K+ t4 [3 [8 M& a) o5 m! X
      w.grad.zero_()  ; v( j5 A6 f% |* Q
      b.grad.zero_()! q7 [1 \5 g& \1 @. E

    # Q/ y2 H* E' {$ @# u! j  l1 V$ Bprint(w.item(),b.item()) #结果
    3 J9 S5 P5 d4 z( o  c$ `, s6 M, x6 T' K! d8 s
    Output: 27.26387596130371  0.4974517822265625/ x+ U5 X8 _/ E) D% k/ T; C' S
    ----------------------------------------------6 h% C3 S; c1 V, v7 Q
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。8 _" L$ m3 l, V$ m0 w1 N3 u
    高手们帮看看是神马原因?% q1 d  K6 v( a  Z

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑   b% d6 K/ q% [9 A% \# z
    + g3 o* i9 @; f6 b$ j" |4 L
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?2 ?, |3 v; Z+ g( F6 \0 n/ L
    -------8 W! A2 |+ ?+ s3 h9 w. a' w
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    4 V2 ^" q0 G- \% S9 S7 B-------
    " W& f* L) R' Q- @算法诊断部分,建议把循环次数改为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:239 \6 V+ q: Z8 J$ _# F* E/ \
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    / N  w8 {3 s& U0 Z2 y( _-------) K% m- Q# P+ V* U& x; q6 n
    不好意思, ...

    & D7 T$ c; |: _+ C* E1 H谢谢,算法应该没问题,就是最简单的线性回归。* }* {  Z6 G1 Y9 o* k* j7 S
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    4 _; Z1 N$ H/ j5 F. @/ C
    雷达 发表于 2023-2-14 21:52
    7 A& u( n/ L2 b# w. Q谢谢,算法应该没问题,就是最简单的线性回归。1 w  N! }9 s: l# b1 [. A
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    " F! v3 H: m7 c1 }7 C* G* g1 h
    & A% C2 ~  j; Q( A" Y( X) \刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。% t" M) C( i! r

    / L" p( T: g2 s; S8 z0 Y  A. Y或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 % _  R- `1 k8 T
    老福 发表于 2023-2-14 22:00$ N+ I2 \; b$ p% y
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    / c7 {8 E+ u$ a: x
    ! R7 Y: k: U4 w( \" t1 }" k或者把b但的起点改为1试试。 ...

    ' X) m. B+ g( k# ?) h6 c3 }
    $ ]7 Y% L2 ^+ I1 E& H/ p你是对的。  i& `9 j9 ?( k) Z6 W
    去掉了随机部分3 P5 m/ _. J9 a. T; N
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    1 g3 f" m0 n; r# }7 V+ L7 oy = (x*27+15).reshape(-1)
    1 q9 Q# O1 Z* `0 O3 f7 Q. O
    4 ~& m* C4 k1 P% n! @0 Z: r2 K循环次数加成10倍,就看到 b 收敛了
    1 g" g0 T* i4 q0 w' A6 d  ^w , b4 ~/ L& ^1 b$ E3 j
    27.002620697021484 14.826167106628418
    2 r/ {: v8 `9 {& g3 @. L( R8 j) `% L+ O( v* \! W% A
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-5 23:09 , Processed in 0.055622 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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