设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    / S/ o- A' u7 z- R5 U. Z9 |+ m5 u. N& J; Q. A5 X
    为预防老年痴呆,时不时学点新东东玩一玩。/ T# A) L8 G' A
    Pytorch 下面的代码做最简单的一元线性回归:( D4 L4 C3 N" [  r- O5 j
    ----------------------------------------------9 w1 }% j$ }5 P, K8 R
    import torch" C* L, ]% `8 z3 q9 g; R  \8 N
    import numpy as np
    5 N3 a; K: M$ Iimport matplotlib.pyplot as plt
    # t, L0 q9 \! Q5 C) u  a) Yimport random
    + |& H" T  \( X8 N  Z7 Q; l2 [# @6 |  {# t$ V; ^' z" V. C
    x = torch.tensor(np.arange(1,100,1)): b! r; K+ w9 b7 C% ~3 N5 j2 p
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    9 P' W- i- M( y6 n& V& E
    2 y2 K+ o  [" `w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b# j5 ^8 G2 A; M, Y
    b = torch.tensor(0.,requires_grad=True)
    3 t  T/ P, @( \3 [% B/ S+ a5 N% w: F- [' O, p  b2 G' h  v
    epochs = 100
    6 c+ R4 ]$ D8 s& k, T. \" v4 O% Y4 r) e+ P$ z) A( T) z
    losses = []
    $ v: w# g/ b$ t4 E1 t8 v1 rfor i in range(epochs):+ p2 A, E0 z$ `2 ~* R4 @+ Y
      y_pred = (x*w+b)    # 预测9 I9 t; z+ y8 u
      y_pred.reshape(-1)
    3 z# p5 ~8 V( N8 U9 p
    ; q% |; M0 p5 L# U9 w: G! l: J2 \  loss = torch.square(y_pred - y).mean()   #计算 loss
    9 m4 l$ j5 X6 c5 I, L  losses.append(loss)
    ! b6 \1 {+ ~8 q8 m/ `  
    ! m0 q( f) F$ p6 B8 J  loss.backward() # autograd
    8 ?6 N) c2 M# b+ C. D- W& }* J2 O  with torch.no_grad():2 l: f3 p/ N, ~. ?0 {
        w  -= w.grad*0.0001   # 回归 w
    - x2 x8 q/ i8 y0 g" \3 Y    b  -= b.grad*0.0001    # 回归 b
    5 s8 o% ?7 R8 E$ t1 \0 l* `* t  w.grad.zero_()  
    0 f+ P. ]" i4 K% M; g2 _  b.grad.zero_()0 v4 q5 [/ A: A& H/ v
    6 \0 d5 z9 n' D# K  p4 R2 h
    print(w.item(),b.item()) #结果
    * N0 n2 d0 z/ a5 b' g+ B9 O  @& P. {7 l* m* z2 V* r
    Output: 27.26387596130371  0.4974517822265625
    , c* q6 E1 B) g4 ?4 B# Z8 D& c----------------------------------------------* Z8 B3 a# W  H- |* ]; B; p
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    3 t5 ^8 W% L  y5 o( f高手们帮看看是神马原因?
    1 a6 t. {( M& w

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    ( ]0 a: \# a" _% e6 e. m( ~: t8 m) m9 n% s/ T: U% k" @
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?/ x3 V* W/ ~) b& v% u( P
    -------
    / t/ h) h* r  k; {( Y7 a不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    : @. ?) q* @/ u4 N- U-------3 ~) K# z1 X3 \  N' c
    算法诊断部分,建议把循环次数改为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. W4 s% d+ w2 E5 ~! v& o
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?$ F( `$ G8 \# b+ n- q4 M* w
    -------
    - a/ K6 h4 x$ y: x! |不好意思, ...
    " i1 D9 x- f" S6 R0 ~5 H1 M. Q! L
    谢谢,算法应该没问题,就是最简单的线性回归。# n0 J: {# {1 g, G1 O
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    0 t  ^! U& `" I& _) u1 c2 d
    雷达 发表于 2023-2-14 21:52
    % e6 g8 ?8 }/ h) [6 _2 a; z谢谢,算法应该没问题,就是最简单的线性回归。5 I  L+ q3 ^) q6 A, s: D: E$ o
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    , s6 a4 Y% Z' P8 K5 p- p7 e

    ! M  e: A$ i+ @8 b  R/ n' g& J刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    - t. w) y( z- h
    2 F+ B, D$ ?* ?! I或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    1 a" J( l6 D* E" n' b% j1 i
    老福 发表于 2023-2-14 22:007 u- h! t% Y+ Z
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    6 B5 e4 q; `: y# |
    " S. R% J+ |- |" f6 U- B$ e7 d或者把b但的起点改为1试试。 ...

    ' x3 _/ R* J  k* a% z) {3 x, p6 c# o9 c
    你是对的。
    ! B' [0 E8 V: m1 ^去掉了随机部分3 j. g! L% r: `7 d& Y" |
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    . d; a3 t" W2 d* q2 Q/ H9 _y = (x*27+15).reshape(-1)
    & s2 d# j$ f7 W% _) e+ G) F
    + V& _% D" e5 q- e4 ?循环次数加成10倍,就看到 b 收敛了
    % d* f: J: v2 V: D( |6 Uw , b# l4 x  X9 J* T1 d1 ]9 {$ G4 v
    27.002620697021484 14.826167106628418
    2 M$ S* U+ Z6 s4 ~: S: k
    $ Z$ X) q5 h8 i0 |9 A" R和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-5 17:58 , Processed in 0.057337 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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