设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 6 J* S& O: J: b% M0 j
    # y1 }5 v$ Z7 j1 h) M$ {
    为预防老年痴呆,时不时学点新东东玩一玩。
    % T. S( q! v' r9 QPytorch 下面的代码做最简单的一元线性回归:) ^( y5 E3 y. r9 C* ^  M, p9 v# W
    ----------------------------------------------
    5 d; f& p; c) J; o$ C" wimport torch4 c3 b1 }6 ?. N$ L
    import numpy as np
    ; p7 ^+ G5 ^  ^import matplotlib.pyplot as plt! v# M0 e* T3 @
    import random8 e- R* f' t( @1 ~

    % c: y% a4 K/ E) [, R" |, Yx = torch.tensor(np.arange(1,100,1))' c  g# }/ [  o3 G! v7 l/ [, \
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    % f! Y5 u) Y* u) [  [9 j8 A& Q. N8 w5 [. Q1 \! O: u: N2 t
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b0 Z: k  L1 U3 q' u$ e; N
    b = torch.tensor(0.,requires_grad=True)
    - }* C; ^. Z% E( [
    & j+ P# w2 ?. \% F4 L( {, ]1 aepochs = 100
    * h8 |% R9 N5 ?
    ( m# B/ Q. J5 T# ]  ?losses = []. V7 x* c3 n6 P2 X
    for i in range(epochs):
    1 b: s9 k2 y; G1 e5 d3 O1 ^! R  y_pred = (x*w+b)    # 预测
    + O9 `* Q, Y  t* ]6 J8 o/ Z. S1 [  y_pred.reshape(-1)- D3 u% V' R+ z; V

    " C, v  q6 J( z) I  U& ~  loss = torch.square(y_pred - y).mean()   #计算 loss8 a' c: R* |; p2 j
      losses.append(loss)
    $ |. T" Y: c) \5 ]. q3 F. X, P0 [3 _8 f  
    9 G. P0 f$ _" s4 I4 x! c9 }  A  loss.backward() # autograd
    & [2 i4 p9 W- a! y1 z1 x/ I8 I# Z  with torch.no_grad():
    , ~% U6 U) t& T9 y! M    w  -= w.grad*0.0001   # 回归 w% ^) B, q" j" ^9 P/ V
        b  -= b.grad*0.0001    # 回归 b ' I- O+ U# l/ e
      w.grad.zero_()  ( F. r/ T7 }  I- L) i  P
      b.grad.zero_()- \4 ^  _  S& n" u; N, X! _9 u* [
    " I, \% P$ g7 ^/ B
    print(w.item(),b.item()) #结果
    ! t& l4 ^* U+ w$ ]7 \4 l
    ' O6 N- X  m6 Q7 UOutput: 27.26387596130371  0.4974517822265625
    . C8 d9 M5 P: G5 Q  Q$ B----------------------------------------------
    % n! V3 `% v0 F& O8 \: r最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    & S) G. F. ?" Y/ q高手们帮看看是神马原因?
    4 x- Z8 x% ]% _+ A5 J

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 ; g: k# r7 S0 Q) Y' s

    6 K6 c5 x) P. l; C, q+ R( C$ S没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    : S" e" ]7 u( G: z; C; }7 M- A7 }-------
    & [2 u1 q  n8 G2 b; [不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    % w( c5 H7 I- e+ \" ?$ {6 p-------
    5 W& F/ U  J  m3 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, b: [) b& u  D7 x  f6 h- s6 {
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?+ |1 n" \" g7 o$ Y4 _
    -------
    5 U$ @* |: v& D不好意思, ...

    $ p* n3 u1 U) \  O4 _8 q5 s* Z+ s谢谢,算法应该没问题,就是最简单的线性回归。. n# k: W0 n. n
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 ; n* i- @2 ~( O/ G' Q" Y8 v
    雷达 发表于 2023-2-14 21:52& v2 e3 b5 j. o. f; i9 U
    谢谢,算法应该没问题,就是最简单的线性回归。
    " G9 O) M, \2 S1 D我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    / t+ Y$ R, \; f- @8 T/ a% F, n4 n" _! {. p+ [/ u3 G
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。5 ]: ]& g$ u1 n5 q6 I
    . E5 M2 ^! @' C- O- ~
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    ; K/ }: K& J4 _
    老福 发表于 2023-2-14 22:00* F' B- r7 N' g3 b
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。! V- O1 b' o' ]5 Z3 }8 O7 j

    3 ]# G3 a5 u, t1 T. q或者把b但的起点改为1试试。 ...

    ) [) [! b$ N7 o$ [4 `, l- E, q8 G4 P( |) N
    你是对的。
    5 T" {$ m( m, b' r& f- A去掉了随机部分$ {% p% v. ^  \2 n- [  Y
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    ' l2 P$ S, x( o0 [; vy = (x*27+15).reshape(-1)+ `2 p( o0 N" R; G0 l# L. G% N
    ; y- ]0 ^0 p5 k% s- A
    循环次数加成10倍,就看到 b 收敛了
    1 `7 V' v2 u7 uw , b
    8 p" {" e+ n# k7 @$ T27.002620697021484 14.826167106628418  i% ]6 |# E$ [1 K% X

    8 z% `( U- r" d. M5 B  Y( _" ^和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-19 18:53 , Processed in 0.066405 second(s), 23 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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