设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 : L0 ]  b* f3 I2 c( q( v( i

    / n, A! }) r% [* ^3 x! M为预防老年痴呆,时不时学点新东东玩一玩。& W3 u' x/ @( C4 \) I0 M. R7 X! F
    Pytorch 下面的代码做最简单的一元线性回归:
    2 l' ~* Q4 e$ f8 e' I5 F----------------------------------------------
    4 ?1 I  @8 B: ]% m: G: Himport torch4 v( i3 I6 ?  v  m# [
    import numpy as np
    8 n) `  v' g' p+ E0 T4 Zimport matplotlib.pyplot as plt
    5 b4 Z, X2 \/ `3 P- F0 F, _: Aimport random
    1 ~$ ?! a- k; F# N  W+ Q1 h7 G" i. e6 H' U! l
    x = torch.tensor(np.arange(1,100,1))
    / u* l! O) b. ?& {3 @& d/ Uy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    $ s4 \+ J4 Q1 O* b' ]  S8 y
    ( d( }1 X/ p) {0 c6 Nw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b9 q2 S2 E. s2 ?! D! j3 U  M/ K, h
    b = torch.tensor(0.,requires_grad=True)
    8 s( X6 R" U* t) C# L9 Z) @/ D9 M. Z
    epochs = 100) n  h6 k- J% r- f( ^1 g8 H
    1 `  W/ }/ c% E5 e& h: I, ?* Q
    losses = []
    % C5 k# Z: d. L+ r1 {1 w. Lfor i in range(epochs):
    0 j* W, a1 Z" |9 V' T  y_pred = (x*w+b)    # 预测3 C+ p1 \/ d5 {# B* k+ Q7 H) _1 P8 R* V
      y_pred.reshape(-1)
    0 \8 v+ y2 O% Q) f& r$ n " |9 F/ S  u$ H8 @; O
      loss = torch.square(y_pred - y).mean()   #计算 loss7 t% W, |3 V7 J9 q* C
      losses.append(loss)" z. B4 M- J3 N' c4 v% `, n
      
    / i5 q  a5 ?1 C) K4 f3 ~# U5 j) ]  loss.backward() # autograd
    0 h, A( z6 e( C% n+ M& U  with torch.no_grad():6 T. D$ j* x& R; K% H6 v
        w  -= w.grad*0.0001   # 回归 w# Y3 v& T# r: w* S- s3 r& ]
        b  -= b.grad*0.0001    # 回归 b ! }: c) J# n0 t
      w.grad.zero_()  # h1 N- V" N  z8 j: g
      b.grad.zero_()
    7 l; D4 |# U+ D) Z* M& p+ E5 }7 \8 O) v, f
    print(w.item(),b.item()) #结果
    ' ~) z5 {7 M1 C  U. }
    & n" ~, w- I3 q# w" OOutput: 27.26387596130371  0.4974517822265625. u, H9 c% O+ b; x2 D# c" {
    ----------------------------------------------
    8 T/ _" h2 b1 O4 I! p+ D7 ~最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    1 ~' Y9 Z1 N& a7 c3 k, X! C# r/ h高手们帮看看是神马原因?$ R8 y& @( y2 C4 [2 G1 }& ~

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 4 Z5 J, E) U3 v/ \+ B' ^
    3 g+ p7 i+ v" y6 p. v  c
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?' P: E1 u/ {) {7 S7 Z+ G
    -------; Y, N" u6 L; v
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。: I: K- a7 {" T+ @# q+ l: W
    -------
    / B; Y  {7 R( O9 [- @算法诊断部分,建议把循环次数改为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
    9 q. ^# P+ {) }9 u没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    6 E* {' x: K" U& Y9 N-------  Z; g7 Y9 A0 k( Z% y
    不好意思, ...
    4 R) x+ b) Y0 z3 M: m) Q
    谢谢,算法应该没问题,就是最简单的线性回归。5 E, ]' n, S* e+ ]" A
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    9 @! B' L- _# d; U% v
    雷达 发表于 2023-2-14 21:52
    : N) O; Z5 [8 s谢谢,算法应该没问题,就是最简单的线性回归。! ~+ B- ]- w. E
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    . S2 `& n* E3 j$ }7 |4 S5 T* j7 N" C; s
    ! n. W% v1 F2 w( v7 r
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    1 a; k& h/ R4 W: V: F* r7 N/ L/ }% B$ }: X* m* f: [
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 % t- e3 A! a1 I" {  _
    老福 发表于 2023-2-14 22:00
    . V- Z' e3 A. M2 H刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。+ P% L6 q( a! b, Y$ P5 R
    , Q6 O* V8 p4 z; e) l: s
    或者把b但的起点改为1试试。 ...

    : s* i  x) Z' n$ B, f: z& X+ j- E  [0 u& ~
    你是对的。
    " y# n; _7 {( y8 n8 v去掉了随机部分
    1 _* @, a& i: u+ U+ p  X8 Y$ L3 I8 F#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    . H/ J$ v7 ]' @" jy = (x*27+15).reshape(-1)+ w. H  B1 a" N8 C, ~) c

    3 `0 P6 P2 w* u: B; |( n循环次数加成10倍,就看到 b 收敛了6 z. g/ [3 U5 w' w0 B% r
    w , b: q% T9 x# K9 ]: Z8 [6 _, Q
    27.002620697021484 14.8261671066284189 u9 d$ o1 @+ r2 @5 K6 D  I! z
    ( o) {" |1 l7 w5 y6 w' u$ S
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-20 20:59 , Processed in 0.086496 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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