设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 * C; T% M! N( s& h3 y

    . ~/ E6 Z& Y" ]# B5 C+ q3 K为预防老年痴呆,时不时学点新东东玩一玩。" k4 |, N1 T5 r. ]7 K" E
    Pytorch 下面的代码做最简单的一元线性回归:
    . L. i, G5 V7 d. x: ^- c  n' z----------------------------------------------
    ( z' h% ^" I: F6 u4 [6 Zimport torch
    9 y/ C3 _( g4 H; E3 I! kimport numpy as np
    ( N1 r/ q% i0 G- vimport matplotlib.pyplot as plt
    & n; c: O5 T/ ~2 Y. o  Yimport random
    , U- T; @4 p" K/ U% @+ V6 K
    5 U( b2 d: ?, }+ L+ p8 Px = torch.tensor(np.arange(1,100,1))
    : T' M! W4 F6 q" D8 _  by = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    3 ?# Q( t; @9 I: I0 O( q0 U4 S* q/ I" \( B7 _3 Q/ o, B! F; J* `% _
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
      O( O4 ~: \$ ?! E. G* M% ]b = torch.tensor(0.,requires_grad=True)3 p0 o. M5 s, ~4 d
    . D+ v( ~3 L% n+ {, a
    epochs = 100' U  A) q4 k( U$ K. ^
    3 \/ y& o' u4 Q% M* i
    losses = []
    5 [  L# i4 V* m! X7 wfor i in range(epochs):
    $ S3 |4 _. e! G8 n0 b9 j$ J  y_pred = (x*w+b)    # 预测! N. s0 l9 i1 f/ G
      y_pred.reshape(-1)
    / r( r% b$ w' h5 f # e6 a* j6 a$ t% E
      loss = torch.square(y_pred - y).mean()   #计算 loss
    1 q5 r8 k& C& w% ]' a2 P/ J  losses.append(loss)
    ; e- p: N& i7 p. p0 s  
    " g3 r& G( D% d4 N  loss.backward() # autograd
    3 o+ d9 b" M0 L0 }& X6 K  with torch.no_grad():
    : S5 w; \/ J( T9 ?    w  -= w.grad*0.0001   # 回归 w( Q; t8 x1 m4 k! L6 X
        b  -= b.grad*0.0001    # 回归 b
    3 i8 _+ V0 h' U0 y& J2 e  w.grad.zero_()  
    # N: z, k+ Q4 l, Y# _5 Q4 N  b.grad.zero_()
    + L9 F; I/ \7 w9 H& @7 z) h/ H  {+ z8 I8 m7 O6 n. }' e1 h* g
    print(w.item(),b.item()) #结果6 b8 ~6 V" U$ J5 j* a0 N
    6 {2 K* ^8 P# A) z& T1 @6 ^
    Output: 27.26387596130371  0.4974517822265625
    4 T' S0 a: b; @% E----------------------------------------------, z0 I! O. M) b
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    " ~1 h/ n! e3 h3 K9 N: U高手们帮看看是神马原因?& A+ |, f2 `; d& L. Q+ R( n

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    * ~* L( d/ `( F6 S; i2 c: P) d, K& p6 }0 A5 q3 e2 a
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?: Y$ T7 D  r+ P
    -------
    / K5 L( I* k% d7 f, [不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    $ G" Q. K* |$ c9 X+ V-------
    & P" ~- o5 }: @8 p2 X% 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
    5 L/ K$ l8 s$ B5 q; C# N  x没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ; u2 J+ B1 g3 o* O; y+ }-------$ S  j+ B' \" d+ P1 T1 X
    不好意思, ...
      _, R( |: z8 k. w  I. d
    谢谢,算法应该没问题,就是最简单的线性回归。
    ) S2 B( J8 d6 o( o我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 3 @7 F# x  k) O# p+ i9 q
    雷达 发表于 2023-2-14 21:52
    " Y, D3 Y, D7 u8 _. S谢谢,算法应该没问题,就是最简单的线性回归。3 z5 F  j$ B% z) ^: H2 W5 C0 p* v
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    ; M1 T# ~0 `1 p! S, i' _- ?

    ' |: Z9 F  ]- f1 p8 }" K& ~刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
      \) d4 q, }2 E2 E# B: e5 t( q3 H/ P8 Q6 q0 @0 r  i: ]$ X
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    2 n2 {2 L0 C8 c+ s; q4 q. a
    老福 发表于 2023-2-14 22:00, M4 w7 e7 W% T
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。2 x6 \- }0 Q& x' {; h+ w$ C
    , Q3 K$ F3 I1 w$ s5 w. x! F/ X8 t, Z
    或者把b但的起点改为1试试。 ...
    # D& ~. h2 g! `8 ~; H  n' F
    ) S! E2 K- O4 ~4 e. _5 `- R$ @; A& v
    你是对的。
    # M- G: c8 y/ m; d0 m7 e/ }5 x去掉了随机部分! d' u* K+ ^. m& b3 z* f$ _* U
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)4 u  a" K1 \: P
    y = (x*27+15).reshape(-1). G6 F% L( j/ O; A

    ( c( f) ]" t+ M/ ^( [& {循环次数加成10倍,就看到 b 收敛了
    1 o" i7 {; o7 {  R5 Q0 [w , b
    5 c. G5 k+ M1 C27.002620697021484 14.826167106628418: D2 p' |. [7 `0 w0 W

    # I) C! o2 \2 w  e  r8 b和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-23 21:42 , Processed in 0.055435 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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