设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑   r6 i/ u  d$ |) Y3 ?# R& V0 e

    " v6 k' X  ?- V1 G; k为预防老年痴呆,时不时学点新东东玩一玩。
    & E% p9 h6 u5 Y! q9 oPytorch 下面的代码做最简单的一元线性回归:
    - Q3 \" W! j' s5 Y# p8 T----------------------------------------------% ^; D0 N' {+ G
    import torch4 X2 f+ Y8 j! f2 l
    import numpy as np
    ) i! A, d2 }( s5 d9 ~" X/ I$ g2 e$ kimport matplotlib.pyplot as plt) |' p4 u: j+ p  F: L# T9 J. B
    import random# e, C$ D0 s$ H+ J% [+ e
    - X7 k- P& m. v6 L" I
    x = torch.tensor(np.arange(1,100,1))
    8 s' v! n$ A7 F* |+ m- ey = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    . D7 k3 ~; D$ r6 M  ?) a" g$ @- I$ ~9 ]% ]$ f: {0 W
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b: X; h5 T! _# G6 c
    b = torch.tensor(0.,requires_grad=True)
    2 i- p: Q" _* H# e
    / Z! N3 V( ?5 b. P: a/ N1 eepochs = 100
    , t4 ]1 z2 R5 g0 Q+ Y' Y( D1 V  m% ~* x% |+ D9 @$ g. I  W7 x+ I# V1 p
    losses = []4 t+ v) h8 {; l4 |' d9 \# ^
    for i in range(epochs):1 n! c1 \" a  a  G0 ~+ X: `+ {
      y_pred = (x*w+b)    # 预测, U, ?3 e% d, e, {! f1 j
      y_pred.reshape(-1)
      F; @9 m. D# v. c2 ?
    5 V3 G# ]4 M& S6 Z# g4 c$ ^  loss = torch.square(y_pred - y).mean()   #计算 loss
    ' \1 v% T- m( b$ C9 h3 j  losses.append(loss)) w* {% V' h- v, m
      
    " u$ ?% S( E( U+ u8 l  loss.backward() # autograd) X+ ~7 v4 f4 Z7 S9 P: W6 L1 a' h! j
      with torch.no_grad():
    ) t7 `* j9 H; `    w  -= w.grad*0.0001   # 回归 w4 d) Z9 A. N- e( x2 X" r
        b  -= b.grad*0.0001    # 回归 b
    & W+ z! S" a' A# F  w.grad.zero_()  6 z9 x  K: c) b) {
      b.grad.zero_()4 R3 e5 G  h5 i3 `' C8 i& C; W7 i9 q
    ! T- H; d/ |  a5 z' Z' g
    print(w.item(),b.item()) #结果
    6 \/ n5 F( U! C( T" t2 s# |3 R6 M* q- X2 f0 z  e* P* x) z
    Output: 27.26387596130371  0.4974517822265625
    8 Y- d6 Y# W, Z; e0 q----------------------------------------------
    ' w: |! t0 _7 s+ q% B  p最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。" ~' ~- h$ D5 t9 l
    高手们帮看看是神马原因?
    - F6 C  x. l4 B; c

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 0 y% J# ~' o; d+ G3 N. L

    / f: j1 a' T# ^5 s; p1 y8 w. R- B5 u没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    % r& H$ K5 Y5 O6 }- }" }5 g-------2 F, q5 f8 m0 B" ]2 R
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。+ L& ]1 k' N5 W
    -------
    ' s; ]; S3 F5 H& o% 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) _! V/ ~( N1 b8 [) ~2 W8 |; ^6 R
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?: D# M2 C  |9 ?& {4 k- j( t# @
    -------7 L( q8 s' W# K$ \+ H
    不好意思, ...
    9 ^/ A* U3 X) k' K3 M# Z' `- s2 g
    谢谢,算法应该没问题,就是最简单的线性回归。4 j/ L! P( @$ U0 {" ]5 U7 h
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 ; g5 |, N1 b& a5 T- W4 [- ~
    雷达 发表于 2023-2-14 21:52
    " x5 a+ {4 }" [- K5 Z谢谢,算法应该没问题,就是最简单的线性回归。- Y8 w, D% m" }  g( M+ a( o
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    : S. k2 z: g0 J% t: a. W$ e( N$ |

    : X0 W$ v/ k/ N( ~: P刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ) ~$ |% s/ u0 D+ R+ B5 Z) a" L! g4 q; u
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 + Z3 ?- z  S6 s( T4 y; j- O# j# N
    老福 发表于 2023-2-14 22:00
    - C5 W+ w: q/ L0 k5 |/ P3 V9 T刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。; A/ q7 S0 B0 |" X
    + ^) s2 f1 r+ R) B8 y
    或者把b但的起点改为1试试。 ...
    . }) y2 C7 M& @5 R& H4 {" }. `' g9 X) A. U

    ' [' I+ {% F/ P6 P9 G: k7 o你是对的。7 K1 a! x: C- ~, }& V" N& X
    去掉了随机部分& K+ H2 \* a% a
    #y = (x*27+15+random.randint(-2,3)).reshape(-1). K1 I' z+ p' j4 v8 r/ C
    y = (x*27+15).reshape(-1)% d+ h* X- ~$ x+ u

    * q& l4 _& P* e5 s  s  b循环次数加成10倍,就看到 b 收敛了
    8 _) x' T; m# T! W' Jw , b
    , [  i' Z3 S; Y" b" S' R27.002620697021484 14.826167106628418  ]$ |8 }5 `& ^! N
    ; x' s. x( N5 t6 H
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-16 22:28 , Processed in 0.053759 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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