设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    6 B6 l2 M9 F1 c# n, C9 i( h* h" b1 e
    为预防老年痴呆,时不时学点新东东玩一玩。
      v2 g  l& S% R( B( {9 p, G' X0 HPytorch 下面的代码做最简单的一元线性回归:
    5 }/ y- S3 R+ {( P----------------------------------------------/ B) O$ M: w/ ~- b9 [8 u7 p. i
    import torch; x4 U: B5 D& r- T4 I  J+ X0 p
    import numpy as np; Y7 ]# b* M, n
    import matplotlib.pyplot as plt; d& S. \2 _0 i. P! a5 Z% V, B
    import random
    ) s$ {& z& U; @
    ( ~* W' e( u0 I/ U/ d. E  J- Ex = torch.tensor(np.arange(1,100,1))& k! |* K9 h6 I4 L6 A7 Y
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    " D) t# A( j- {# o% q
    8 B* s& R/ i, t- u9 lw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b; a4 p" ~0 w, ]3 S  u! z
    b = torch.tensor(0.,requires_grad=True)
    , F" f$ F8 Y# \( i9 ^/ }
    6 d2 \* M: H& p/ p# B3 Wepochs = 1000 e% |4 q  F7 W% p# h' G

    " K2 [9 X, F1 h' V+ I, b& alosses = []% D; n: W& D- n- T# o" T! F& `! w/ k+ K/ V
    for i in range(epochs):
    , [( P! m9 H* N, `  y_pred = (x*w+b)    # 预测7 d* y! f$ ]$ y9 I8 e
      y_pred.reshape(-1)6 @/ L( V! J6 n. G
    ; c" {4 }0 t& w2 g5 G: g. [- q
      loss = torch.square(y_pred - y).mean()   #计算 loss
    ) Z  I# F  D3 O+ l  losses.append(loss)
    ' g* D2 ~" s+ L$ z7 @# ^  * L4 V% D6 G1 S* j% H
      loss.backward() # autograd
    6 R) [/ J0 A# O+ l  with torch.no_grad():% C* f2 z* ^( s4 I  G: K
        w  -= w.grad*0.0001   # 回归 w- t9 s) i# a" t  x( `6 f
        b  -= b.grad*0.0001    # 回归 b
    # D0 L5 F, b& ?5 G  w.grad.zero_()  9 s: A4 W3 L( _7 ^3 [
      b.grad.zero_()
    # B' [4 e/ y7 `/ c) e
    + A/ w0 i9 a$ g4 H9 ~+ v+ {: pprint(w.item(),b.item()) #结果1 I0 T- n. K) Q) Y7 w7 w

      ?" K: y1 G9 s, v: ]Output: 27.26387596130371  0.49745178222656258 a; O. b. y) m' G0 L& g8 P
    ----------------------------------------------7 h5 L$ a( b, ]: k- l( H
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    5 ^: y8 p+ F1 y  p高手们帮看看是神马原因?
    , c4 K- S+ F& Q

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 7 o9 V: r3 N: A" \! r

    4 w, q) g1 M* I0 U8 ^+ H# f) f没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?4 V  D$ i. y7 h. K, l8 B
    -------- U5 L7 @- y7 Y3 {1 O
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    9 R( V+ R) Q7 S# ]-------
    3 O/ T# u) i% C算法诊断部分,建议把循环次数改为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. ]% h3 e+ p" P) l% M  T
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?5 V3 `2 S- I6 t0 w8 l
    -------8 I4 a1 F& S7 B3 ^/ |. T
    不好意思, ...

    5 v) Y1 |0 I* x7 D谢谢,算法应该没问题,就是最简单的线性回归。2 u( q2 G, L5 g/ f. ~
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    ; ^* y( C& _+ z
    雷达 发表于 2023-2-14 21:527 G/ O2 u) i" F
    谢谢,算法应该没问题,就是最简单的线性回归。- q  M! o2 w. F
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    % q* O- N2 i. q; X* b0 N5 R4 f3 B- A. x
    ! @: S. r* a7 p
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。8 K9 S+ R, E% j( L9 V
    / Z" b* a( C1 S3 C8 p! F* v
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    / w9 U3 u& \  \) n+ Y
    老福 发表于 2023-2-14 22:00
    ' j# ]9 a4 g) _% ~刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ) j. L: g$ `. `! Y$ j
    , K3 D3 J3 A1 |或者把b但的起点改为1试试。 ...
    3 |- E: w  `$ A2 A! v  z2 l1 _' ^" i

    $ |- C' h' u+ |5 A# \' T你是对的。; Z; n: M/ W* g
    去掉了随机部分
    2 f' w& @& `% L) V0 {( e#y = (x*27+15+random.randint(-2,3)).reshape(-1)6 b) `% p: t+ A% o
    y = (x*27+15).reshape(-1)
    , s$ N6 H7 ~, t% }/ j( W1 k' e% H: s8 T  p$ ]
    循环次数加成10倍,就看到 b 收敛了
    6 a$ @) Q1 F; T+ s" y# \w , b2 H. n5 i+ Y& r2 h  m/ _
    27.002620697021484 14.826167106628418
    7 x* W: {. Q# P. Q
    , M! w  \& R0 p( j8 ^  Q( u' P8 B; q  T和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-7 19:51 , Processed in 0.035768 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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