设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 2 K$ r, a3 Q" t% I5 n0 y
    6 U$ i4 t, K9 T$ @* I; H$ c% {
    为预防老年痴呆,时不时学点新东东玩一玩。
    8 W0 s7 M) t1 zPytorch 下面的代码做最简单的一元线性回归:
    / B: A3 D3 `5 O) u6 A3 E0 F----------------------------------------------2 P! ^+ D: `4 h! R9 q) C" A
    import torch
    : B1 V, Y2 F4 G% i2 W- @7 w8 Aimport numpy as np
    ; R% j7 Z% c. ?' D, Z' M! A; n" a8 Oimport matplotlib.pyplot as plt/ ~; P1 G/ X, x1 F* K
    import random
    ( H* p" }$ e/ ?3 j, R9 _$ x3 J; I6 Z5 o# F. ]
    x = torch.tensor(np.arange(1,100,1))
    " b. D% y$ X7 c5 Y; M' Sy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    4 a. U/ i4 a+ E! p1 ~% ^' k) |; A6 T6 X
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b* n5 `  P- w9 G1 v4 Z
    b = torch.tensor(0.,requires_grad=True)
    : U9 z8 e! h& d8 h' H" T- I/ Q$ Q6 |
    & T. z3 ^1 q! M4 P& Z" h+ `epochs = 100
    / o6 h9 y/ G! i; B1 }' |' I+ e! \5 ~! a
    losses = [], \% D" L+ d" `' [
    for i in range(epochs):7 f- i+ d& l7 k- i; A
      y_pred = (x*w+b)    # 预测6 B1 ]$ |6 }6 f; W
      y_pred.reshape(-1)* p* y1 s) l5 [, y5 O3 [' x
    1 _, x1 S. k  e2 v; c: _
      loss = torch.square(y_pred - y).mean()   #计算 loss7 `; W5 t2 q! Q4 ?' r' d+ y
      losses.append(loss)) A5 Y% C/ }  L
        l$ j- ]% e& G
      loss.backward() # autograd
    ( d' Y5 ?! V2 y% k9 [) ]  with torch.no_grad():# Z; W# y3 c6 q
        w  -= w.grad*0.0001   # 回归 w6 |: u$ @/ S. l$ m2 E3 ~5 x
        b  -= b.grad*0.0001    # 回归 b 6 B: f( K: y+ ?$ W4 G
      w.grad.zero_()  0 a& X0 E: A9 ~# X5 T
      b.grad.zero_()
    3 `, x  }" [2 r0 k' Q6 m" w) ?1 U
    7 @, E# y8 p0 j( A. I/ `print(w.item(),b.item()) #结果4 H/ Y" O* }: k

    , P" z; p3 g/ W+ h6 s/ vOutput: 27.26387596130371  0.4974517822265625) B- ^7 l2 R5 H; r
    ----------------------------------------------
    9 r4 N. \1 w. B( Z最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。8 z" K6 r) F/ b( R* V$ T, b; k9 E
    高手们帮看看是神马原因?4 T0 _4 T" _9 F* k

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 ) M4 w. p& K2 k& q( p$ l5 M

    ; M; F: e' `' F9 {) F) Z. U没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?; m$ G* t5 h4 n- \# ]7 |0 P7 O
    -------1 z) K( m  I9 @1 k4 _
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    % Q# K5 j# g( G( `8 n-------
    : h& d' P* h* ~) r8 r; v0 u算法诊断部分,建议把循环次数改为1000, 再看看loss是不是收敛。有点怀疑你循环次数不够,因为你起点是0, 步长很小。只是直观建议。

    评分

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

    查看全部评分

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    板凳
     楼主| 发表于 2023-2-14 21:52:57 | 只看该作者
    老福 发表于 2023-2-14 19:23. n4 }' W3 O; ?# X* L" a- ?
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?2 g1 i" v: B/ @+ U5 F
    -------
    % q! g* J# D; ]) u2 P不好意思, ...
    # A- I% Q( D+ q  q& J& F$ v
    谢谢,算法应该没问题,就是最简单的线性回归。
    5 c! i, Y+ t+ R我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 + \" T; B5 `. \. Z& s
    雷达 发表于 2023-2-14 21:52# L/ Y6 F) q" O7 {0 L
    谢谢,算法应该没问题,就是最简单的线性回归。
    9 A9 @6 ]" s) p0 v5 F7 ~我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    . `9 t# |, _& M/ @: T
    ( k2 E: g4 d  \刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。) z  N/ g" z* Z! |+ ]( Z( {

    % _, f' h' T: @, m" Z4 C4 u或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    : D+ Z# L1 W; ^2 ?/ V/ p# {
    老福 发表于 2023-2-14 22:00  W+ c# V& ^( F
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ' w! n1 f. M7 y. `5 U9 U0 G& S' w$ d  B# M$ r
    或者把b但的起点改为1试试。 ...

    # r% D0 ^5 d- K; w$ [2 I! D4 u0 P
    你是对的。, m$ n0 }# g3 X2 B( z1 ]5 e
    去掉了随机部分; \7 }$ I7 ?7 ]
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    0 l' o% a' U1 X+ v9 `3 d3 [y = (x*27+15).reshape(-1); L3 z* R7 a) o. z- f7 {9 d
    & v& h' j% I5 N% ^) C# d8 J
    循环次数加成10倍,就看到 b 收敛了% i5 ^" t" z5 M. e3 |3 H' S
    w , b8 w! [' C' j3 z$ @
    27.002620697021484 14.8261671066284180 e4 `& A& k8 O9 G% I/ a5 y$ k! P
    % r7 o1 F. _1 `, D$ b7 S  _0 K
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-21 09:03 , Processed in 0.071297 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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