设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 0 J4 ?' C3 f# K5 a- n: D6 c7 [% [3 i9 h8 Y
    ) ~9 m9 u6 B0 M8 i
    为预防老年痴呆,时不时学点新东东玩一玩。
    2 p2 D! O& G8 f7 I# A. OPytorch 下面的代码做最简单的一元线性回归:
    4 m, ~) ~% b0 f) f. h7 Y----------------------------------------------
    ) a9 L, A3 z+ @5 h# simport torch
    % H4 r8 e$ Q" Dimport numpy as np
    " `' N4 O: j. B$ w( X/ K2 _0 e8 Simport matplotlib.pyplot as plt
    ( x# s% ~* X9 N. n5 D3 O. C! uimport random
    3 c: {& I" y! S4 {4 k( @
    3 k, f' p  M+ N: w7 o8 E* Z) I. Gx = torch.tensor(np.arange(1,100,1))
    3 x6 g. n& ^# [& z) L9 dy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    0 o  {- r; B& K+ O3 r
    & f8 ]% J+ |" {( ?w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    7 e8 T8 d" y* g- {7 K! J, Y7 Lb = torch.tensor(0.,requires_grad=True)  n9 M. S6 {- E% ]

    ' s8 D+ a3 O9 q# V9 q/ W% P. k' q9 Bepochs = 100! T6 X& z2 Z: z2 l! X
    0 P# C3 {4 x6 j2 b( n! [
    losses = []
    6 p# q1 |6 q, A4 N2 V" {5 @2 T+ vfor i in range(epochs):
    ! }5 ~# r, h1 m7 |7 X+ v" C  y_pred = (x*w+b)    # 预测# K3 P+ d6 W5 r# q4 U' ^
      y_pred.reshape(-1)% G7 p' y# u  O+ e# h
    2 M) T6 U- w% s& j. [9 E
      loss = torch.square(y_pred - y).mean()   #计算 loss
    ; E& G: w$ [; X: w$ y' ~# J  losses.append(loss)8 m% r- v+ Q( A3 I7 T3 }! \2 ?) D
      8 v* B" s4 J2 j9 B) j: T! E
      loss.backward() # autograd
      [/ j) y9 z( T9 k) t: `# t  with torch.no_grad():; r! F. f- f5 j1 W" G" |
        w  -= w.grad*0.0001   # 回归 w4 L% r0 Q$ u$ [1 V
        b  -= b.grad*0.0001    # 回归 b ( X; l1 Y4 F0 r) E' Y3 w: S' _
      w.grad.zero_()  5 m7 M/ L2 K6 W  e! V) X) S% E
      b.grad.zero_()
    " {0 [7 k' A6 i% |. @$ G# u7 z. }* D8 n! [" y$ I  V, o
    print(w.item(),b.item()) #结果
    1 A% F2 }9 h0 m8 d3 Y
    $ ?1 l* @7 k  u% k5 BOutput: 27.26387596130371  0.4974517822265625
    ! U4 u7 g% ?( D8 O) @5 g/ z5 a----------------------------------------------0 H2 Q7 |( u3 A/ e8 L. {# m
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    " k7 `- d% M  |! `2 ^高手们帮看看是神马原因?" ?, c5 n+ C; q# L

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 , [8 S( H2 f6 o2 l# `# A, ?
    3 o0 z! S( U1 w1 D9 n& W9 P
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    0 U: G0 y' V1 B: W8 W8 u-------- W8 E* ?" }% G+ }. w
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    7 h  P. L+ M0 N' H. h( c-------& E6 |4 O6 j) ]- j
    算法诊断部分,建议把循环次数改为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:236 z1 y" w6 c9 ?( u
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?6 h% g$ ^! J6 K7 q
    -------: L) B& c7 C# ^' j, f5 {+ e0 Q
    不好意思, ...
    1 m: ^3 k7 P* n; C2 e5 n) S
    谢谢,算法应该没问题,就是最简单的线性回归。
    3 A7 j% G( P0 s$ j  B我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    : p, o: l$ Y: z" _
    雷达 发表于 2023-2-14 21:52# B; \0 \7 F4 _7 x. N( k4 `$ _, A
    谢谢,算法应该没问题,就是最简单的线性回归。
    3 [7 Y. N' ?0 E" p  J. w7 d我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    . }2 }8 W5 n) [
    3 s+ u4 I1 i% x: J
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    : w; Y) ~4 A: y( g( k, `: Z
    1 `* t1 }7 ]' m& ]! Q- y或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 , ?* |2 }/ B1 H6 ?& J+ O* s
    老福 发表于 2023-2-14 22:007 W) F$ [4 T1 O. R- {% U( I) [) Z
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。- r! L& M5 N) u- U4 Q2 [) E7 c% H
    / g7 Q& g/ D, s) [3 N
    或者把b但的起点改为1试试。 ...

    . l4 v1 Q: |$ X, a8 b7 x/ t3 d2 u' F. `# ~
    你是对的。
    5 g; x1 D, y( z+ |: o去掉了随机部分' E: F$ d# s: d- d. C% c' ^
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)' u, v) M' [& e4 M
    y = (x*27+15).reshape(-1)
    ; q% O- w/ c$ x* L, I
    1 @4 k: q  c& `+ s) ?# u+ a* m循环次数加成10倍,就看到 b 收敛了; O( ^+ z6 x+ @- v
    w , b; y; ^( K9 C. k4 f9 Z2 b+ i8 H: U
    27.002620697021484 14.826167106628418
    5 o$ J+ ]* ^1 {" y  t8 f4 v# K  y+ ]/ \" u- E. v
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-10 04:40 , Processed in 0.057316 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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