设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 5 F. z0 `( R# V/ @
    : N; c+ I7 }4 L* y. v; q& d! j
    为预防老年痴呆,时不时学点新东东玩一玩。' A" m) N% ~" q! }; k: g
    Pytorch 下面的代码做最简单的一元线性回归:2 n+ a7 k) y5 f; M0 A* q
    ----------------------------------------------3 g  F/ P$ q3 h$ J. x$ ]4 U
    import torch; `& ?& H- M* Q. h& J$ r  k
    import numpy as np* v. U) L# k, l5 d! V/ ]
    import matplotlib.pyplot as plt
    - s1 P6 y8 ~: e* K7 A2 qimport random
    ' \& l7 j) K9 T# |! Z9 L
    # [$ Y0 Q0 P% \9 L* M& Bx = torch.tensor(np.arange(1,100,1))
    * x7 R4 v2 N" m* l# e! x6 ty = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15. ~" u# n# Z( x+ _* w' I: H
    . _7 N; j0 Z' y6 {3 W
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    9 G3 V0 m* h1 J* R4 Q0 Lb = torch.tensor(0.,requires_grad=True)
    9 y! @; x8 @! w- x0 q- u6 u( O1 ?5 ^+ a$ V/ _
    epochs = 100
    9 H6 k% `" j  U$ _9 Q7 F
    ; J9 s$ o" _2 z  O' ^% B, d+ vlosses = []  m4 ~( d, _5 l, H' V
    for i in range(epochs):
    $ N5 ~$ s: e/ b3 D  y_pred = (x*w+b)    # 预测
    3 R& Z; u4 I8 S7 Y0 g: }  |/ Z  M  y_pred.reshape(-1)- T3 G1 g. O3 _* [2 K
    $ T+ n& e4 R8 J; e7 d+ [% n
      loss = torch.square(y_pred - y).mean()   #计算 loss( A0 m7 x, i) H% r$ U
      losses.append(loss)% V) V2 |* U7 a. m" V
      
    8 X3 D, I, p0 B* U' N  loss.backward() # autograd. i3 Y4 d( ~* @9 T* h4 ?5 z
      with torch.no_grad():
    " [0 f; z3 |: R  G    w  -= w.grad*0.0001   # 回归 w
    & z1 M7 F/ W' t# `- W) w: M4 H    b  -= b.grad*0.0001    # 回归 b
    9 {  q* L* N0 \8 a3 p9 ^* Y  w.grad.zero_()  
    , I0 A. l0 W* s1 J0 y  b.grad.zero_()
    % s2 c& l5 m: f) p0 ^# ]0 a2 {
    5 S! p6 z7 b& Y; A. u0 f- qprint(w.item(),b.item()) #结果
    1 Z3 z( k1 v# R+ I5 J0 s& h3 _
    9 {. x% W: [: T9 R5 F# LOutput: 27.26387596130371  0.4974517822265625# \3 ~1 J$ A$ s' j2 _- j7 j( e
    ----------------------------------------------
    & f+ f; E/ X# g, E5 K1 X最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    / g; b' R; Z! j) V& A6 N高手们帮看看是神马原因?
    2 X: }- q8 S3 G  V6 C7 ^3 V

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 ' _, N) a& u: r* f4 K2 ^, b# h
    # \3 t! C# Y3 R2 V
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    - I1 W+ O9 W5 f$ Z3 c! g  R) D-------9 G6 \' J( q# [
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    : d9 N9 S/ h# @# @, V0 T6 G-------
    % A, l! {7 \* g1 H算法诊断部分,建议把循环次数改为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
    ) e9 Z5 Y1 s5 P9 X' E. X没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ( ^1 b; j. `' b2 u; X- V-------' h' s. `: H. n6 x" h
    不好意思, ...

    # Y' @+ I0 {+ h谢谢,算法应该没问题,就是最简单的线性回归。1 v: b' {& v2 ?2 r- ]/ h6 a
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    0 O$ Q7 z; m3 C9 q
    雷达 发表于 2023-2-14 21:525 t" q0 U# F2 O
    谢谢,算法应该没问题,就是最简单的线性回归。' o4 q1 ^+ Y- H1 U2 P" m7 w
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    . |- M3 T# z" o6 F# Z( I
    + Y! P. b: n( _* x刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    2 p' l/ R+ \8 E7 s1 h0 e8 b' L! y3 }* |  N4 t0 U( y1 X  N4 l
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 : E% @5 K8 [" K
    老福 发表于 2023-2-14 22:006 H4 F/ }  Y- y4 E; k% v2 U
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ( f5 f( W( \" ?( R2 I7 p! |) Z
    ! R1 X) ^& n7 X! L8 A2 r. i6 P, a或者把b但的起点改为1试试。 ...
    9 L3 Y" f9 \/ k% t

    $ H/ S5 j- [* H  p4 p4 Y6 D你是对的。
    4 A( h5 f/ X; v1 c- X! i* }& v5 a去掉了随机部分
    7 g5 K1 B7 m6 N" [8 L. L5 S#y = (x*27+15+random.randint(-2,3)).reshape(-1)% Z3 P- k8 |5 I% b& m7 h
    y = (x*27+15).reshape(-1)
    ( D! d) ~: ]5 z  n% O5 R
    3 E# r, t  o9 Y. g循环次数加成10倍,就看到 b 收敛了
    5 @8 {. d% |" T, ww , b
    3 L" Q7 c% Q6 I3 P27.002620697021484 14.8261671066284187 q0 Y2 N! k* [& D
    / ?# M7 g8 A' [7 j
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-9 12:16 , Processed in 0.056873 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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