设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    5 C# z' O& Z( Q/ }" B) h
    ) k1 g# m5 c! `5 Z2 N/ C/ u为预防老年痴呆,时不时学点新东东玩一玩。% Z: Z! q: J0 [
    Pytorch 下面的代码做最简单的一元线性回归:
    ) N8 a, {8 `7 ~  Z: V9 o9 u( a1 c----------------------------------------------* d6 g* ^  f$ _3 X6 m4 ], ?4 a
    import torch% o; E9 T, v' p) v' p, G% _
    import numpy as np
    , o4 ]4 h6 g6 Dimport matplotlib.pyplot as plt
    % \$ U+ R7 _5 B( {7 Rimport random  A6 G% I) {6 `3 d0 ~3 \1 p
    5 g; K: ^* e6 c& [6 L  c4 q) f
    x = torch.tensor(np.arange(1,100,1))+ {  k: |3 u3 @- C( h! j% X) _% u
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15+ c; r% F& d/ W' w! P

    4 l; l! c$ H. _1 E) D2 |! B- ww = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    # b* P0 t7 B6 f; n! w4 b- E: db = torch.tensor(0.,requires_grad=True)8 J5 z  W& Y  m5 d$ v* X# u
    + x: J5 r9 J* d1 S- d
    epochs = 100. `0 Y7 S3 ]2 Y% Z# k5 b

    - n; X2 Q$ N8 C- ?) olosses = []
      Y' E. f6 ?( z: L: F0 Xfor i in range(epochs):
    ( x% {: h. _; A. ^/ U1 I" Y  y_pred = (x*w+b)    # 预测
    ) P3 @+ f2 s9 A  y_pred.reshape(-1)
    8 V5 m' j  U4 ?8 F! X7 e, b
    # p5 @, i8 s5 g2 `4 i  loss = torch.square(y_pred - y).mean()   #计算 loss
    ; C9 H$ `  b" G2 _  losses.append(loss)- `5 G5 R* V0 [& L- g3 s
      
    ! m4 e) K* {, `1 b9 H, F  loss.backward() # autograd
    ' S- @3 [% ^! E' f* \8 L7 K  with torch.no_grad():
    & {& a* J! R" d1 _& E    w  -= w.grad*0.0001   # 回归 w$ v# c: U$ `) J) B$ f0 M7 c' L  j5 \& w
        b  -= b.grad*0.0001    # 回归 b 2 {+ \) T/ ~& u% K# E
      w.grad.zero_()  
    # I. K' V: d- p  ]- W7 }  b.grad.zero_()% `4 p* N) I6 E1 N

    ; q" Z2 i4 f) Mprint(w.item(),b.item()) #结果
    5 d: V9 I6 {) c$ j
    0 V( \) S$ B9 E! Y, d4 GOutput: 27.26387596130371  0.4974517822265625
    $ N& y& F0 V) H! D6 g9 v7 T----------------------------------------------0 i% q2 N2 A, H" j- H* @! d" H: c
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    + ~: A, Z5 p' x! n高手们帮看看是神马原因?. @- w0 t. F+ U7 i$ w* E1 k& I

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 & o  V* @; q: Z; _

    / q* ?7 S( j2 m6 p没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?+ d9 R* j% _, B/ A
    -------% h0 k8 [6 h& D2 |& @* p
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。6 C% w. _, H, f0 s( W% [5 {
    -------  C- v1 D: L2 a2 R! o1 L
    算法诊断部分,建议把循环次数改为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 a) `0 ~( E  `1 o) F* M没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    " N* h" k8 {' f" T2 S. ?. n-------
    ; U. ]. G" O; F3 z  D( R不好意思, ...

    9 g+ j9 [' r2 ?  m2 [: r- ?0 K谢谢,算法应该没问题,就是最简单的线性回归。4 w6 C+ `& W! g& H1 S8 t
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    $ i: v! u& W' v" @8 L
    雷达 发表于 2023-2-14 21:528 ~6 }! l' E) R) Q
    谢谢,算法应该没问题,就是最简单的线性回归。& j) U% P4 @' y% q
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    / q9 J  y+ O3 y* @% I+ K
    : {0 j, ~* I" m: |刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ) d/ ?! |3 X4 T) u
    + X2 a9 `+ `; s. r5 P或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 % G) v; i0 O6 G* V2 y! R* B2 n9 v
    老福 发表于 2023-2-14 22:00# g' W$ m. V4 o  f
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。+ E" g; E& i& c% q8 R3 z

    ) U+ H! B2 U8 t/ l  \( G) \或者把b但的起点改为1试试。 ...

    4 r; B! M: E1 |$ h' C) d: q0 |. y# f6 v0 c9 E
    你是对的。
    % D4 u% x8 S  K/ t! g: {3 }7 \! n3 l3 |去掉了随机部分
    ; h; b9 ]: v4 ~4 w#y = (x*27+15+random.randint(-2,3)).reshape(-1); m  h5 W1 Z$ f" u* Y, B- V
    y = (x*27+15).reshape(-1)$ @# M7 y' N' E5 i3 U' ?6 Z
    ' B# @- M2 j9 |, p1 ]' s+ v, L( h) O% I
    循环次数加成10倍,就看到 b 收敛了+ Z8 J# P/ ]% R1 ^9 H  B
    w , b$ J7 Q4 V$ A' d; {; m5 G
    27.002620697021484 14.826167106628418
    ( F% W, t7 O" r& \& I
    2 E* h8 d; S& x% f* s0 X和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-30 13:40 , Processed in 0.061689 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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