设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 ' o1 ?* O) r) [

    : x9 U) s2 b8 o7 [! l为预防老年痴呆,时不时学点新东东玩一玩。" b* T6 p  Y/ U  `- i
    Pytorch 下面的代码做最简单的一元线性回归:7 [* ~' Q1 n3 Q: M" L% U
    ----------------------------------------------) n6 |4 Z  u4 T5 j" j- S5 M
    import torch! c! O  ~- n7 {4 I# x* ]
    import numpy as np
    . j. @' G4 ~+ Z/ r; D+ c; i$ g$ N- ?import matplotlib.pyplot as plt# z) A# S+ F& {( M& s
    import random
    : a9 s  B+ _. N2 N" O$ U1 `. h# u% `( a
    x = torch.tensor(np.arange(1,100,1))% d, j9 }  C$ o( O  s' k  |" W( L
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15# }6 }( n8 d$ p3 w5 m
    0 G9 f! _( P% x
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b% I7 n7 n3 B3 S, y' v/ N
    b = torch.tensor(0.,requires_grad=True)
    , Q  u2 X" t" {; @& ]! {, ]. F0 i9 i. g$ W$ I) E  o
    epochs = 100" X  a, \% H3 d; T
    ! d6 X' y: E; s: X6 M% q
    losses = []
    ; [. {1 y) ?$ L* s' ], c& L9 mfor i in range(epochs):
    * q2 ^6 C2 Q/ M& n# S# u8 {  y_pred = (x*w+b)    # 预测
    6 D. e  e1 L' c, x, M& B( `3 G  y_pred.reshape(-1)
    / Z( f: j/ p9 ^: r . c: A4 u8 s( t% ~! W0 f/ P
      loss = torch.square(y_pred - y).mean()   #计算 loss; c: }' E2 p3 |( e
      losses.append(loss), ?5 R" O6 N  S5 u. D& K( \
      
    9 w# F- Q  ^" U9 \5 }4 c  loss.backward() # autograd$ Q1 S# G# i+ v; {- K8 M  b
      with torch.no_grad():
    ( T* d& l* q1 j8 `3 {- W; [    w  -= w.grad*0.0001   # 回归 w2 y3 H" t7 j5 m7 K& g  c7 ?  _# t
        b  -= b.grad*0.0001    # 回归 b 9 g) Z" L4 {3 b! L- Q, c
      w.grad.zero_()  # ^$ ^6 l& ?! s1 F
      b.grad.zero_()
    0 w! A. N( s# N) m) [7 s1 k% k( P; v/ Z. H7 X5 V3 |$ y
    print(w.item(),b.item()) #结果
    + D1 @9 k- @4 H  {  a0 Z, j% n
    - K  O  Z! s. bOutput: 27.26387596130371  0.49745178222656250 f4 L! D; }; s3 B
    ----------------------------------------------
    ! J; t0 n8 n# ]* e3 x最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。+ T# a0 J% [% _; i& z/ @
    高手们帮看看是神马原因?
    0 b  o, R9 f* Q

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    6 ~2 }. D* D; {8 [( N: z" D  L6 e1 a* w' O2 ~
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?  [, f$ U: O4 ^5 y
    -------
      V9 d  L+ c- c( f  ]3 b& E7 Q不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    , t; ^/ I  c! S-------
    . P* f6 ~* W1 q/ ]+ \5 j2 b, P算法诊断部分,建议把循环次数改为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$ F) K# i# q& i" [
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ; R. p% K( Q' i! V2 u-------
    # q0 e; ~: d0 N不好意思, ...

    * f& V1 w' ^& F" ]3 i8 c谢谢,算法应该没问题,就是最简单的线性回归。+ y: i1 {7 D6 V8 B* h( `5 e( ^
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 * m7 C; |9 j0 }5 U# {+ j
    雷达 发表于 2023-2-14 21:520 C* [) P5 n! P% W: s. K  I2 {  \
    谢谢,算法应该没问题,就是最简单的线性回归。! g/ E4 ?, F$ Y0 J3 W
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

      U; g; n; d9 s; Z: y- z3 B+ q3 ~
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    6 E  l/ M, N" e: b" o1 i7 M0 K' Q9 u( t+ D
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    / @$ }& v4 }: c/ V, F! [  [
    老福 发表于 2023-2-14 22:00. B3 O/ ~! f3 C+ a
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。3 k4 ?& }+ P) ?

    / r, _; r; @6 F) O或者把b但的起点改为1试试。 ...
    , f* K# e9 \, J; s& `

    1 c$ r1 a8 g( d  y7 |你是对的。/ K/ d! q  x: X- O* U" S. m
    去掉了随机部分7 K% K- G2 n$ v; J1 \8 I
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)/ H, C0 q7 ^) R8 S1 T
    y = (x*27+15).reshape(-1)
    % f8 z/ l! m% F9 I
    * A: h1 b7 Q! V$ j循环次数加成10倍,就看到 b 收敛了
    - z, M2 x, m1 X; `7 ew , b
    . y$ d4 b! ?6 L. P8 L$ \) _27.002620697021484 14.826167106628418
    7 }  C3 v9 \+ u9 Z, I( k( ^2 t1 a" f, k
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-20 17:12 , Processed in 0.061221 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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