设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 9 Q* L; ]9 ~# a5 D. U9 {

    + V' e" _/ S2 D8 f5 F为预防老年痴呆,时不时学点新东东玩一玩。
    & P$ Q1 x5 U1 V0 T8 C& L) EPytorch 下面的代码做最简单的一元线性回归:
    - I, p; ?- A$ A+ R/ y1 o3 S----------------------------------------------7 _( w5 ~6 g. j- m5 T
    import torch9 _, Q- Q* L) K$ D" |2 Y
    import numpy as np
    # ]- o! S# I7 h. l; Q/ |/ L9 Z/ Z5 Limport matplotlib.pyplot as plt; @8 M) h; e7 R- u4 a
    import random
    # z4 }& N+ m  R" _: e: v
    * i* [' X' _$ Y& f. Dx = torch.tensor(np.arange(1,100,1))
    6 ]6 W8 z$ p* ?5 fy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    9 f; `, ~& D- w; X( T* H$ r! q, O( H; m% A
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b9 b* |2 r0 V4 H3 s
    b = torch.tensor(0.,requires_grad=True)
    ; n! L) h9 k4 Q0 L0 G" j
    0 ^! K! z' @; t) A' y. ?5 X' jepochs = 100
    ' i" n6 O8 _, c) Z
    , A. J5 c6 ?8 c  glosses = []
    7 K# Q- o  V0 b3 l4 x% Lfor i in range(epochs):& Y" r" i! F* p4 r. Q9 W; Y1 A
      y_pred = (x*w+b)    # 预测
    * h$ ^) @9 x3 }3 W4 \  y_pred.reshape(-1)0 r* c: K+ ?2 Z- N8 w
    ) M5 W- S2 U/ o5 l1 h- D1 \, O$ `0 r
      loss = torch.square(y_pred - y).mean()   #计算 loss% i, w# M  k; z, d: I/ _' V
      losses.append(loss)
    . S# [  t% M% ?& ?  
    ) M* d# R$ d8 r, u" w  loss.backward() # autograd) l, }9 c4 |  p
      with torch.no_grad():
    9 P: K& t3 D2 Y7 p' k    w  -= w.grad*0.0001   # 回归 w0 P8 |) N7 x; d6 b) @" Z
        b  -= b.grad*0.0001    # 回归 b
    ( }( O# o4 b' G/ x8 ?  C  w.grad.zero_()  ! X; a. D% y+ V$ [8 \3 X1 @. r$ y
      b.grad.zero_()$ x4 o/ C; b6 u+ u# o2 W
      d0 h! }/ r; q, m1 U4 U
    print(w.item(),b.item()) #结果
    / i6 {* x6 n* ^7 g2 \! P- I( X# K, [/ E. U
    Output: 27.26387596130371  0.49745178222656250 f7 L6 o1 {, Y( r7 Q
    ----------------------------------------------
    1 @- c1 A; ~' U( P: a最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。5 l. q) \/ Z0 D' M: R: S
    高手们帮看看是神马原因?% _, b4 Q$ k' A& v

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    & @4 Z2 G5 a* Q- b6 q" `! {  n. N1 j, k2 D
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    & N0 r) ?  q1 h  y-------! o- f  t* F9 P) t. v- J! U: t( ^$ M
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    5 h1 {; J% y4 l% \7 o/ D; T-------
    ' W3 n) ]9 G3 o0 W2 J算法诊断部分,建议把循环次数改为1000, 再看看loss是不是收敛。有点怀疑你循环次数不够,因为你起点是0, 步长很小。只是直观建议。

    评分

    参与人数 1爱元 +10 收起 理由
    雷达 + 10 谢谢建议

    查看全部评分

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    板凳
     楼主| 发表于 2023-2-14 21:52:57 | 只看该作者
    老福 发表于 2023-2-14 19:23% o! C; j* {6 O1 m
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    6 A' Z* ]% v6 T3 `-------% l* u+ M7 Q7 Q( v' ~
    不好意思, ...
    1 d( ]) C, q- h" J; u$ `1 r
    谢谢,算法应该没问题,就是最简单的线性回归。
    / Q+ W7 P6 T( ~# B我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    " l0 b- o; S+ Q" C/ [; _/ {4 \
    雷达 发表于 2023-2-14 21:52
    " f5 i- S4 Q* L# b$ J: A, N3 A& U' k谢谢,算法应该没问题,就是最简单的线性回归。# P7 ^9 D6 }. O1 z  P. j
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    5 }. C. y6 V, i: |% x
    5 l$ H" e, q9 j  D- A3 E7 y5 B% n5 T( ]
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ( _4 k; H4 s' n. {$ N4 r
    8 D( M6 b/ `1 H: R3 v, w. t- m$ `% V或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    4 z  Q  q; V% h* l9 G& }
    老福 发表于 2023-2-14 22:00
    2 N8 V9 S. ?9 W) I1 d5 h* [刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。. p* h  p3 H4 W% v2 p% s  L- ^
    , l! P2 F# y% H2 j/ S
    或者把b但的起点改为1试试。 ...
    & m/ q8 j; S: Q* y. \8 H' G. T
    & S+ p* B0 X, z. J
    你是对的。  h) Q. ~- V: x$ I
    去掉了随机部分& l, S4 n+ _  p7 v
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)" k- u9 l! C  E3 F7 s2 ^- x& J
    y = (x*27+15).reshape(-1)
    6 D4 g. ]& q  c  }8 E$ s/ ], ?" S* ^% y
    循环次数加成10倍,就看到 b 收敛了
    ( S% P' I+ W9 U- L6 bw , b
    0 c& Y. h/ ~/ w, l& k9 T4 K27.002620697021484 14.826167106628418
    - E( t7 d! P& t  Y
    . e1 a& q  A* S  `* q和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-5-24 21:31 , Processed in 0.033148 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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