设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 4 z3 b: w& g3 X  N( U! a, Z/ `

    8 L5 M8 m% I& ]* E3 Q为预防老年痴呆,时不时学点新东东玩一玩。: Q$ f3 i2 \' p+ \* O7 j
    Pytorch 下面的代码做最简单的一元线性回归:& ^- {" }4 w. r+ f& e' P2 o
    ----------------------------------------------4 p/ j8 B  T$ z8 }) U
    import torch  D: \+ e- ]! }1 j- c/ q% ]
    import numpy as np
    : s# e; p' c  b) u& Ximport matplotlib.pyplot as plt' H1 C! Y) N  m3 H4 H
    import random
    + Z' {5 U# k5 t$ v4 r) z% H& @
      [  z8 p1 ^! v: E9 Lx = torch.tensor(np.arange(1,100,1))% q+ g8 ]5 w9 s9 ]* B
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15+ }9 B3 v, j; _" F; h

    2 @. u0 e! o6 h6 r  E, r% b  ow = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b3 R$ ^0 j$ F1 Q  }+ X$ \
    b = torch.tensor(0.,requires_grad=True)
    . q* U/ X+ |5 m+ V/ H, V% i1 ~! z
    : z2 Q2 c+ F: {! [4 Wepochs = 100" K) ?% l6 k7 `  o) @
    3 c9 E- p5 P( z, q- o  T
    losses = []
    & P2 |& h  k2 r& B; ]; kfor i in range(epochs):9 _/ x( \! ^! H' [3 u- \
      y_pred = (x*w+b)    # 预测
    ) E2 i! _2 W  f; T' R  y_pred.reshape(-1)2 I+ e1 Z3 |/ y5 g1 N
    ; t  q% S9 S6 v& @
      loss = torch.square(y_pred - y).mean()   #计算 loss! q* Y4 Z7 R" M8 F! k
      losses.append(loss)  U  _' g3 W* b# }3 ~  s4 u% a
      2 \! r* D6 h5 r. R' Z2 ^( J
      loss.backward() # autograd
    . V% {- ]) @+ @3 A  Q  with torch.no_grad():
    8 g9 W' Q# r1 |" ]/ ^# c    w  -= w.grad*0.0001   # 回归 w+ B/ `& R1 s  |: y7 `. B
        b  -= b.grad*0.0001    # 回归 b
    ! u9 i7 C" B# [0 f2 ~. M  w.grad.zero_()  ; |% S9 V: f9 C" r1 e, S/ t
      b.grad.zero_()) I2 g" K' j7 V3 N7 C

    7 B  i6 b5 M3 t  [- Tprint(w.item(),b.item()) #结果
    - x9 q- ~% I* a
    ! y% d  m5 E9 t- t4 UOutput: 27.26387596130371  0.4974517822265625% h" J/ ^" s7 G) v/ @( T
    ----------------------------------------------
    & P; Q  K, u6 [最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。( |- F6 h, c9 h7 E  P
    高手们帮看看是神马原因?
    & Q3 t  j9 y; t% K

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    # `. ]1 n0 a4 F! J. t: r0 G/ q6 N& q+ \
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    2 [1 d+ ]% T3 f$ W4 D-------* l0 _$ X' k' R
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    7 P& ^/ P) Q& R2 D' @-------/ e- D$ Y5 Y5 ^/ f
    算法诊断部分,建议把循环次数改为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" R( k6 b8 V8 l6 G3 [, g0 S
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?0 v: y" R. j: R3 s8 Q) S$ r
    -------
    ! T  ]5 P& p3 _* G' E( N7 n5 C8 Q! T不好意思, ...

    1 X/ @" a- |2 l0 q+ S1 O1 K谢谢,算法应该没问题,就是最简单的线性回归。- ^' A0 ?, N. B# y& m9 q4 B
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    0 \1 F  w" @+ R4 M/ G
    雷达 发表于 2023-2-14 21:52
    % S& \( S7 {; t( p谢谢,算法应该没问题,就是最简单的线性回归。
    1 M. Q4 ]; o# ~' D我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    3 f* I( I3 _( H1 S
    ' @8 n" X  ^" Y9 T! L6 h刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。# |) ?! d+ o/ v9 }
    0 k- O, q( ?& A1 }; s
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    + \  H8 V" L1 a6 O- g
    老福 发表于 2023-2-14 22:00
    - X4 K# d. L8 y, C2 J6 }. u刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    1 }- v, f8 z- Z- ?6 {
    0 M+ `5 |# H, {) {, i+ g. a或者把b但的起点改为1试试。 ...
    7 ]8 x" L$ W+ F5 G: D' I1 [
    ( Y, B) ~6 n3 {& g; t; T( q
    你是对的。; y. h+ [9 e# B& J
    去掉了随机部分* k* k# }+ ~0 T3 N) }. F! W. E
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)* f  Z0 e; ^) H
    y = (x*27+15).reshape(-1)9 D" ~, ]# t& Q# m7 h

    & ~% f- `: q5 q9 K* {+ i循环次数加成10倍,就看到 b 收敛了+ g: x% N* k8 U0 d) o8 C% R
    w , b
    . O" ^9 B: i- {( T# v27.002620697021484 14.826167106628418
    " S6 I9 H# t) p7 e9 I: T9 i# L3 @8 X  @& M
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-22 00:14 , Processed in 0.030947 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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