设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 # l: u) h: W- h$ _
    . [' w% F& t7 H5 b- y
    为预防老年痴呆,时不时学点新东东玩一玩。
    + e; p0 G3 V, u5 p; C+ G- W+ w, mPytorch 下面的代码做最简单的一元线性回归:
    2 V3 ~! k. A0 Z8 o1 b; c- K' Q----------------------------------------------
    9 B0 G) l2 [/ B0 M4 N5 Z1 B$ r5 ximport torch% `) K& J, L$ T6 c  i
    import numpy as np2 t% M; b) i6 @4 |2 |: ]& Q7 d; z
    import matplotlib.pyplot as plt
    9 z  r0 |$ k* k6 P% Qimport random
    + r2 K0 M% b; E( i  o6 m
    - S9 s5 i0 h0 c. z. m8 _x = torch.tensor(np.arange(1,100,1))* f' \; q+ X' N( }! g4 D* e: ^
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=156 m( h( M7 s1 i% B8 e2 u1 Q/ h
    9 k5 q; a1 b$ B& @! W: z
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    1 s% M6 o- b" a6 z2 Tb = torch.tensor(0.,requires_grad=True)' e% O7 H* t# u7 F6 S$ V1 U+ C
    8 n, D& Q7 m2 K2 `3 B- [
    epochs = 1005 M& A* [  a1 u8 u7 Q5 y

    + ^( y$ l0 f, v  n! I8 X, [losses = []
    # p0 B) \3 `+ V; J/ o2 Rfor i in range(epochs):
    7 M+ I) I6 \) C5 M3 Q- y8 N" ?  y_pred = (x*w+b)    # 预测
    8 C4 u) g( y# x  d8 ~4 U! C" Z( S: m  y_pred.reshape(-1)5 l, H1 N3 y1 n0 R& b( f$ }
    * W* V# k9 L) U9 G8 H- W) k
      loss = torch.square(y_pred - y).mean()   #计算 loss
    + ~" A3 T# I7 C9 I$ U+ [3 A  losses.append(loss)4 w# t9 y& x: \* `' d/ T
      
    - m3 w7 l$ Q6 P' U% F5 @2 i8 y2 }  loss.backward() # autograd
    8 }' E7 ]" c! c: M  q  M  with torch.no_grad():
    ) G. D5 \, X! S2 \( @& |# P  I    w  -= w.grad*0.0001   # 回归 w$ J( }/ w7 @8 E: a) ^' v
        b  -= b.grad*0.0001    # 回归 b 4 m5 c7 F1 ?) W+ }
      w.grad.zero_()  
    5 \& q! ^0 D( `  b.grad.zero_()) m. A8 o. s6 K+ s3 X& a

    ! w5 u0 v1 X0 R! @3 ^# A  Dprint(w.item(),b.item()) #结果" s5 d* ~6 q# O% |4 V9 `1 d: \
    . ?" i5 |$ c3 u
    Output: 27.26387596130371  0.4974517822265625
    - o5 K- q8 ?% l----------------------------------------------
    3 l  H) F# ], w' t( F最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。: h- k( P2 E9 \2 [" W; J
    高手们帮看看是神马原因?
    . k8 l& h/ l$ y/ g

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 8 ?6 J2 m: N/ n# \0 b

    ; F1 x4 k' i  K- S3 U8 C" M没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?/ a% p6 M) H' `
    -------2 ?# M" H) o6 S, x
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    2 r( t* L! [+ \6 B/ o6 n% I  D1 s-------- N* z( U6 S5 d9 [: X
    算法诊断部分,建议把循环次数改为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:230 i" }! d$ |! [4 q; K5 O' i5 |( F
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    3 {+ u' R% H5 T/ e-------6 B% X" \8 g9 Y/ ]5 L& @" b
    不好意思, ...

    - W- h% a% j2 a  F9 i6 y4 N谢谢,算法应该没问题,就是最简单的线性回归。
    " @; H% u& ~+ s3 B) c我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 4 G: S+ R9 W; T9 K: a: N
    雷达 发表于 2023-2-14 21:52
    / T. F1 e/ v! q" ~3 H& f/ M; J  K1 `谢谢,算法应该没问题,就是最简单的线性回归。$ P3 |9 h% z7 R( \9 R7 g5 J; W4 A
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    - m1 b" q' D8 G2 p/ b/ `
    ) E: C( Y7 T) H; c+ u" O$ }
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    , n! t- u5 Y1 d" |& c  B6 m- x% t  F1 m: `# @0 p
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 7 S3 M8 D; V  n/ l* `  d
    老福 发表于 2023-2-14 22:005 q5 l9 L, G1 Z6 ]2 E7 ^! i
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。( m4 K- @; b) b

    : ]8 V1 ^8 i/ i2 d6 B或者把b但的起点改为1试试。 ...

    & v6 D+ |" t2 D' Y$ g9 @0 ~6 K
    你是对的。
    5 T+ B. r/ B, U" z2 X1 d; d去掉了随机部分
    * U0 q& o9 B) `3 f#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    ' ^! [4 A, s/ p& Vy = (x*27+15).reshape(-1)
    9 n, N2 j9 [  ?# N% U8 }: j4 {# s/ c
    循环次数加成10倍,就看到 b 收敛了1 `# ?' f7 Q+ @+ H% A
    w , b# B5 }# J& x: E" `
    27.002620697021484 14.826167106628418
    % ^, d/ L2 @3 [, w! \
    % ?) i, s1 ]( t9 o/ F和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-12-31 00:38 , Processed in 0.028029 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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