设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    5 y! `5 a; f- I3 K, w* ]* }/ N
    * f5 a1 u1 a3 t+ P$ k9 \) y为预防老年痴呆,时不时学点新东东玩一玩。
    # E  p! ?0 B0 y' Q3 [Pytorch 下面的代码做最简单的一元线性回归:' i$ A( J# G0 }
    ----------------------------------------------% k3 X2 N+ s* d4 U9 b
    import torch
    4 \' D# z6 B' \) p# x- }import numpy as np
    ( o' z. N7 L6 b9 c- f9 [3 `import matplotlib.pyplot as plt# R1 n3 z! Z9 ^/ W; @% k
    import random) ]' X% o' D  w- ?4 c) p

    * w* \: Y9 B8 H6 I( Ux = torch.tensor(np.arange(1,100,1))
    2 ~! P! ?: C0 Ty = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=156 T  z9 \: z" ^& B+ ]# w
    / O! K0 ?  M$ e9 Y. I! \
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b' D7 Z% Z% n* ^& B
    b = torch.tensor(0.,requires_grad=True)
    / g2 B; k. z' C$ Z1 }
    $ h6 }. F/ K( q3 h# ^epochs = 100
    * B/ O! C' ^# W& U+ }. Y3 r% k! I. A- A: v4 Z6 @
    losses = []
    ; t8 ^2 H* ]$ d) S3 v; Y: {7 wfor i in range(epochs):
    4 N. H; v- \4 P1 R5 P; n8 Q  y_pred = (x*w+b)    # 预测: f/ \3 y" i% w# I5 S- M8 ~
      y_pred.reshape(-1)
    ( `' q' F1 z, w0 r. r
    8 Z5 X) C* _- \- Q2 y7 j  loss = torch.square(y_pred - y).mean()   #计算 loss, `1 i) F! M5 r  i% ]
      losses.append(loss): z( |5 i. U) G7 i; L
      : p7 t9 L" i  x; x8 s
      loss.backward() # autograd
    0 K+ c$ J' o9 i6 O0 g# f2 p/ W  with torch.no_grad():) e' q. ^; H* H* z: N/ t
        w  -= w.grad*0.0001   # 回归 w
    7 Q& X8 j% A6 c) b) [; W% r# d3 ?% X8 L    b  -= b.grad*0.0001    # 回归 b ' L- V! q  S! v8 t% v
      w.grad.zero_()  9 V8 {, }( b! O# c5 W
      b.grad.zero_()
    9 l9 Y' Y! I) Q# {9 Z/ @( j8 R8 K
    print(w.item(),b.item()) #结果
    6 ^+ q$ p6 C6 M* e3 r$ a4 E) C' J
    Output: 27.26387596130371  0.49745178222656259 H/ J1 ^2 n: z2 ]8 v9 ]2 `
    ----------------------------------------------
    * A/ k4 L! @5 L% T  p最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    ; Y4 X" a6 ^5 b: u高手们帮看看是神马原因?/ |6 R9 F* Z* v# k' S

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    $ b* k5 A3 ~+ F. O. K% }3 |
    , [( @8 m0 @! O没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?; x/ x& D* d. s3 W2 u
    -------
    0 h: t6 n/ I8 _% O& ]! u2 i& g" Y不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    - Q) J0 e& n- T: o& f-------
    $ W( r0 N3 Q( ~/ W算法诊断部分,建议把循环次数改为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
    0 Z7 [& P7 v6 M6 r- M& a- t没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?4 l' V3 g  N7 s: [- x1 q
    -------
    " y# d4 {5 n; H0 l6 [1 ?, r不好意思, ...

    5 y  u0 O: l! H谢谢,算法应该没问题,就是最简单的线性回归。
    7 L) |" N4 I' L& O- Q+ \  h我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 4 w- O5 s  m  |* L
    雷达 发表于 2023-2-14 21:52. Q1 d7 B; G( B, A
    谢谢,算法应该没问题,就是最简单的线性回归。7 }) s3 ^4 v0 Z( Q
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    ' r: q% X$ P$ a" ^9 h' v9 A) l+ o
    . H6 T( `- h: V8 K
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。0 u$ Q' n+ J1 m( U
    # H$ C1 V% v# S9 ?
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    ; X- d) H8 u, ?% Z; k/ ~6 m# @0 u- x
    老福 发表于 2023-2-14 22:00
      \9 y! K6 ?4 F9 R6 I' v: a* Y刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。7 w: F! n6 d% T/ F+ a7 u4 r4 W

    ! S; Z, K" ?, u( [3 n/ J# P或者把b但的起点改为1试试。 ...
    6 H, b* S6 ]" A- u: z
    ( }; Q. u; J6 r5 V9 E, Z; u/ F
    你是对的。
    ' @" K- p6 x9 ~) R8 H# o) w去掉了随机部分
    / D$ l. t% C" ?9 [#y = (x*27+15+random.randint(-2,3)).reshape(-1)# ^  e2 h1 y1 x: a" n1 a
    y = (x*27+15).reshape(-1)
    5 ?. s) p2 L( f& ?# i5 J8 c$ {7 t, ^( {- {6 b% Q' _2 k& [
    循环次数加成10倍,就看到 b 收敛了
    - Y6 l2 _+ K3 u+ |3 \w , b9 a, H5 }3 |0 y
    27.002620697021484 14.826167106628418" I; X  N9 v/ D+ v

    2 E+ m0 _- J6 x! W5 e# Y和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-21 02:31 , Processed in 0.056719 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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