设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    & z' Z: l7 p: e( r# \. z2 X( I4 v( t5 G. @' \  |& `
    为预防老年痴呆,时不时学点新东东玩一玩。% |% `# ~% F" k+ |
    Pytorch 下面的代码做最简单的一元线性回归:
    ; V- w* b# X" v) g' R- l----------------------------------------------
    # ]/ j: ]9 `% I+ dimport torch2 y' g. ]8 f8 N. X! O/ }7 g
    import numpy as np
    ' n( I# s) G4 S3 Q& limport matplotlib.pyplot as plt
    , f4 x" @, m$ [! J( \6 z8 `( cimport random
    . v, a/ W# m8 E# A6 n
    : o5 k( j  I8 }8 O: H9 o) ]x = torch.tensor(np.arange(1,100,1))5 Q7 [! ]" w; r# `# y. q
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    5 o0 u% v9 k6 H; g+ \+ n! e  h8 u3 z2 \/ Y- X9 d
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    ( [  J9 B1 P! H; f( ^b = torch.tensor(0.,requires_grad=True)) \3 P2 I7 t" Z- K$ m. Q3 H
    " ^& j6 W+ d6 y7 i: Z; T9 r
    epochs = 100
    . Q3 A2 K1 ^; ^& F" [: ?# E  B6 f* s6 U% c
    losses = []8 y$ k5 ?2 C& ^: \+ y
    for i in range(epochs):6 Y; G8 E0 L  X; Q9 x( O. k
      y_pred = (x*w+b)    # 预测
    3 A% R1 h. m. n$ S  y_pred.reshape(-1)7 [0 z$ `: {" M% x) B6 }% k

    2 k* ~0 e; Z, V3 C: x) `* [9 s  loss = torch.square(y_pred - y).mean()   #计算 loss
    8 r4 ?8 o0 k- A/ {" ~  losses.append(loss)
    - s8 \8 ?* y1 h* K  8 A! c4 a/ o$ e  Z* l
      loss.backward() # autograd
    4 \$ r! w5 S7 [) x! m  with torch.no_grad():8 Y0 v$ S; m  m( l
        w  -= w.grad*0.0001   # 回归 w
    4 G( w" g0 J' \) E$ A; a    b  -= b.grad*0.0001    # 回归 b
    ; A& U0 N1 z7 t  w.grad.zero_()  
    . M, Z/ m' \; h& {5 p' S; B  b.grad.zero_()! Q: z0 |4 X6 S" G* A% q8 I

    . w. |. v  F  S# Lprint(w.item(),b.item()) #结果* y, \5 b5 G8 _# P4 M, D& N" G" ~: f

    ( [7 a& x0 C% F1 `" |5 N( [5 w; J! BOutput: 27.26387596130371  0.4974517822265625
    ) x3 X4 t5 m9 n& t----------------------------------------------/ k& v6 L# H& G5 e+ a6 ^; P
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    8 _# `0 j- D/ p高手们帮看看是神马原因?
    5 `& j" L* N; ]& U5 I% P

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 ( t5 }4 M. l- s" c
    ; ]# _. E! T6 M; Z! `" i
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    9 `0 x  z% @1 w4 P1 N6 q-------
    # }& b8 m8 y5 ~/ Y6 \4 m不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。7 t+ P7 ]3 A2 m' q& o) p! p
    -------
    & i4 }* u# O4 y7 ?4 j算法诊断部分,建议把循环次数改为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  ?7 w" {% S- r+ z6 y
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?4 h$ Z; W2 I. v
    -------
      S8 _% L* @. s% @' B6 g' z3 M不好意思, ...

    5 W. B: J/ P' q( t! f2 f) \6 k6 x谢谢,算法应该没问题,就是最简单的线性回归。
    ; X/ H. v# K/ E: v% e我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 6 g# L7 {; ], S; b! v& P; G
    雷达 发表于 2023-2-14 21:52
    ! I9 C# R* a) e7 ~* k8 R谢谢,算法应该没问题,就是最简单的线性回归。
    + w* q0 _. A9 k4 K2 g我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    : g, [' [% e3 [" b7 v8 P, K$ b
    5 R% t) s# ~& K刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。6 u. r( j3 ^! v/ _9 S2 V

    % [7 A% j  z: z0 ?; \或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    . S; t! V9 q/ V- e
    老福 发表于 2023-2-14 22:00
    % w+ V" U6 D$ ^+ Z5 F刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ) t) c  e3 p+ j) p" z5 i( J
    . {% d" N9 Z$ c; d或者把b但的起点改为1试试。 ...
    ' B  O# s6 H2 N. X# Z* d7 @- X% D
    1 Y. d: l; X% S5 {/ n
    你是对的。
    * c! c8 u& a. T* A7 r) e去掉了随机部分
    , f$ u# Z- [5 h4 |8 [1 \- D#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    ( r; p+ j4 Y8 t5 E5 }  d/ Ay = (x*27+15).reshape(-1)
    2 N' C. C" }0 _+ b* d- M5 u: K, I6 {" l& @1 `0 m& j5 I
    循环次数加成10倍,就看到 b 收敛了
    : L- X; p6 G5 v; b( mw , b
    0 w( R$ K  _; |5 V) b1 t27.002620697021484 14.826167106628418
    4 I1 O* v+ E  B( S
    3 c2 Q" y( Z* w7 ]: q) j# m和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-8 12:15 , Processed in 0.058390 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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