设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    # v. k( s" V+ L) T
    # z& }0 N; X( y为预防老年痴呆,时不时学点新东东玩一玩。
    3 F0 ~( U* m+ C2 z4 jPytorch 下面的代码做最简单的一元线性回归:) {* M0 L! m) z: ]0 A' b
    ----------------------------------------------# v- U+ P+ K3 Y+ Q* R3 H( |" [
    import torch
    ; P( b* @3 J) V# H( Q0 n5 }0 P) o! Mimport numpy as np
    ' C; ~) I) {7 e# n& Nimport matplotlib.pyplot as plt8 v6 ^9 w* b" p* p; M0 r
    import random- A- z! J+ s# M/ K& B
    : \- |1 L6 x! j
    x = torch.tensor(np.arange(1,100,1))
    6 H6 N6 [8 T9 P  E5 n  f2 I! Ny = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=157 h/ g6 ]7 g* Z! I4 }

    ! v3 x; t) G; S% G9 Y4 fw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    ; W6 }+ F4 b% f" G# \) m% L, G3 fb = torch.tensor(0.,requires_grad=True)9 k' p+ A, E2 E
    ; J) G: I0 W. j0 S% N# V" t
    epochs = 100$ t. J0 S6 C+ Y5 z) I

    : Q( _- [/ [6 Y5 r/ P) ~  E* Zlosses = []
    3 d) {9 I; y1 M' C- tfor i in range(epochs):
    8 n1 o  Z2 i& Z. Z  y_pred = (x*w+b)    # 预测( E* [5 T  ^. C, k8 O! @
      y_pred.reshape(-1): ]6 b2 R$ w0 y( T# x

    & d# g: b$ s$ m3 r  loss = torch.square(y_pred - y).mean()   #计算 loss" }3 B" f# y' |/ D/ n, t2 f
      losses.append(loss)  k" v/ H- u, i' O- w& \! Z1 f. b  b" T
      
    * U' i4 A. J% g* u+ Y& ?9 q  loss.backward() # autograd( O8 {5 T- w0 n
      with torch.no_grad():
    / n- D& S- o" M$ l  P' t$ C    w  -= w.grad*0.0001   # 回归 w
    4 E7 X8 e% F8 I6 _4 V9 Q  `    b  -= b.grad*0.0001    # 回归 b : i& T. c4 r3 i8 }) g8 w. Z
      w.grad.zero_()  
    ' n7 r7 C" }$ @3 Y' K/ D! E! c  b.grad.zero_()( @, g4 I4 _7 U6 j& i3 [

    $ M( ]0 H% @; A4 Pprint(w.item(),b.item()) #结果
    3 h4 K! R/ t$ q& O: ]  x2 b" X+ j% }4 d8 J1 W3 U7 b5 L$ X' w( s" B
    Output: 27.26387596130371  0.4974517822265625
    & @- _/ \3 \5 D) K) _----------------------------------------------
    ; l/ s5 t: m3 H5 D, u# w最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    * q9 \, k9 G* V6 {2 K/ v高手们帮看看是神马原因?( g1 I$ a0 a9 C" r4 j7 P& `  I

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 4 T  D! X7 B! d5 F" k7 Q

    2 o4 g. C% x1 z) n没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    2 H5 y5 j' C& `2 J0 |  K' M-------
    / ]. Z5 ]* w  d- \不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    7 ?3 Y" q) [6 z/ h5 U* g-------! z) H8 o3 X: {' k$ W3 N) F0 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
    ' P8 Q5 E+ B2 ]! X$ q3 G: }& t没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?% f1 W7 o9 {4 Y. z0 d) H- }
    -------5 t6 K5 v3 J% E/ D/ p: h1 ^: N
    不好意思, ...

    + r6 ~1 N" M" {2 ~/ i% h2 N1 a1 h9 d7 m谢谢,算法应该没问题,就是最简单的线性回归。% _! i- g) c, [: b: M; k( o
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    # D; S- Z8 U" f$ O! M
    雷达 发表于 2023-2-14 21:52$ n. K& l- _4 A: |
    谢谢,算法应该没问题,就是最简单的线性回归。
    : E: \  B* R& G& I我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    7 P, M; ?4 G2 g. `* m# G; d
    + |2 j3 s4 C/ E# T' S# y刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    $ a. p6 S7 g9 E/ w1 \+ n, a: }  J$ t
    4 r2 v% j0 V/ L/ n' E7 t; Z7 ?或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 ) y# t  O- b/ v; l
    老福 发表于 2023-2-14 22:00' R. K) ~( {* [( i8 w% i& S/ a
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。, O; r% {/ m' x$ {( D1 m/ D* `  \

    9 r$ \( n- l" U/ y或者把b但的起点改为1试试。 ...
    5 S$ C8 b% a" l1 \
    6 q5 u. H; r5 E/ a, k
    你是对的。  ?, Q9 F% e& B
    去掉了随机部分, D! g% ?2 T. p+ G8 M" ]
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)  C. i  u+ n4 j, ]" t2 K" R
    y = (x*27+15).reshape(-1)" T/ \+ \) ^6 d' o" o# v/ C5 m! g( f) G
    ; a/ i6 }" t" m" Z  \  E
    循环次数加成10倍,就看到 b 收敛了9 s3 q# F! N6 c& E; ?
    w , b
    ! a2 Z% p+ l1 i7 a% f4 V27.002620697021484 14.826167106628418  a' j1 b* O$ T8 B/ ]% g5 Q# e7 ~- v
    3 c8 Q" G2 E: `( W6 U4 }
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-29 19:57 , Processed in 0.058441 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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