设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    6 F, B. r. h7 I: ]: N' A; w* S2 V4 Y9 j
    为预防老年痴呆,时不时学点新东东玩一玩。
    ! t. k0 e9 J% k) FPytorch 下面的代码做最简单的一元线性回归:
    % k. U: c! R" {----------------------------------------------' ]1 B2 r% M, X2 U3 D8 o
    import torch/ D! d( G2 i* Z; p  R  V, r
    import numpy as np
    & Q7 O0 ^9 M: o. Y+ e7 Kimport matplotlib.pyplot as plt. r) u# \! P4 T: I
    import random
    2 o/ G$ ^) L9 y8 C; c0 `( [- b" m2 N* R8 l# U/ [- ?2 |1 k1 ]
    x = torch.tensor(np.arange(1,100,1))8 W* \+ V. ]2 u8 p
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=156 _  P# X+ h  L# r+ e# c5 Z2 Z" |

    ; j1 j% K$ P* i# u; u# |w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b* {* _' B$ Q" B5 p' f
    b = torch.tensor(0.,requires_grad=True); K5 L1 \7 T5 J& r( q, R. y

    3 B6 T8 w+ x; }0 cepochs = 100
    % M! o' W7 e- N9 }" q% G. p8 q+ {+ I, R6 I
    losses = []! n1 e) R/ w+ G3 X6 b
    for i in range(epochs):6 R6 @4 h, `  f# b) M0 j7 ^, P
      y_pred = (x*w+b)    # 预测
    8 x4 Z2 Z3 K) q& c  y_pred.reshape(-1)
    8 \% b# |0 P3 n8 I3 F3 c8 k + ~: h7 Y1 d2 b' r2 v1 E, f( |
      loss = torch.square(y_pred - y).mean()   #计算 loss
    2 O; k  g) i! j9 x2 M" s( r  losses.append(loss)
    ! V2 W1 m& J  j1 o, o0 H3 K1 v, Y- B  
    7 T* P5 D6 ?  a. p/ M  loss.backward() # autograd
    1 v2 V& X. t  p% j8 ^  with torch.no_grad():
    ! H: V1 |0 ^4 ~0 W% B    w  -= w.grad*0.0001   # 回归 w
    & I. ~9 y5 p" f    b  -= b.grad*0.0001    # 回归 b 3 s0 E' C/ D$ G% l6 x
      w.grad.zero_()  
    - H/ m1 x( l. X7 J" s$ ]  b.grad.zero_()8 P2 W  |, V# X
    - t! \+ v  G* d$ R4 y& S- y
    print(w.item(),b.item()) #结果
    1 R! K7 V9 s" r2 Y6 U
    0 @. ^' A: w. v. wOutput: 27.26387596130371  0.4974517822265625  u% l. ^8 ]/ a3 X% h0 h) t& n- _
    ----------------------------------------------
    " j4 P: H% w2 E$ n3 r0 I最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    6 S+ p2 k4 u* v6 K- d8 `; h# s) B高手们帮看看是神马原因?
      P5 ^2 \' R$ r5 R

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    * [' n' W9 [. l! Y6 N# Q6 g7 C2 [, W" H7 [8 y  g1 d
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?/ Z4 o2 ]& z: i: m
    -------# S% `7 L3 i' U4 h0 d7 H
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    7 [# C+ z/ u0 S( w, G+ T-------
    ( t; r- n$ J9 ]) R2 i* [( t7 R算法诊断部分,建议把循环次数改为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:234 Z( m" G  a! n! M! f8 k" [7 \
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ' Z# h, r3 d$ g+ s-------+ X! C( G5 ?. ?7 m" f* ]7 w) e
    不好意思, ...

    ) G- p; T+ a" M3 B' l* P谢谢,算法应该没问题,就是最简单的线性回归。
    2 p7 K& g% `# ?4 Z- A1 j& T  }+ B我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 9 i0 ?* z  c4 Z6 |3 m% a% k
    雷达 发表于 2023-2-14 21:52
    ' k$ ]$ B9 L# P& A% m1 C/ f谢谢,算法应该没问题,就是最简单的线性回归。. r9 m3 B% F$ o. T* D7 g: {
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    # Z' f* E$ G& x0 F$ i3 y6 q2 b
    ! y. i& ]) c' E, y) N
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。5 t; F- T) |" Q& V( ~8 [0 v' D

    ) _& t' A% b5 y$ `1 L或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 0 h0 K9 J7 _- B- [
    老福 发表于 2023-2-14 22:00
    ; ^8 H4 G9 P0 y* o+ I# M1 f刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    6 v9 \7 }+ j( q0 V( D4 R. R0 f/ n+ J8 p3 Y2 L6 N
    或者把b但的起点改为1试试。 ...

    2 o) k; h7 T8 `8 F  L' ^
    6 F1 ^- ?$ b8 E你是对的。, C% h) S; O0 L4 {2 T
    去掉了随机部分! w8 f1 G4 K  G) Q
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    0 ]) H# [6 y  G$ j4 g* dy = (x*27+15).reshape(-1), g6 N8 i+ r  ?9 b3 {2 N
    4 U4 D' v9 G+ H: Z, S2 L
    循环次数加成10倍,就看到 b 收敛了% g+ q1 H3 T( m3 o  s3 X7 a
    w , b
    # @; s# B9 j1 ?- v5 D  B27.002620697021484 14.826167106628418
    1 ?8 S: l8 e, C' ]
    4 C* s: a# Y+ d, v- }5 Q; F和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-17 10:04 , Processed in 0.062373 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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