设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    ' a' N  m! m. k( }6 U4 [; S5 y5 m- ~2 G5 M6 V' c! }
    为预防老年痴呆,时不时学点新东东玩一玩。
    " W& F' T# i' }- cPytorch 下面的代码做最简单的一元线性回归:
    " H5 o. o" H' b/ ^, s. Y----------------------------------------------
    , M7 Y! d, ?& a$ nimport torch
    2 J* W9 J9 K0 A+ eimport numpy as np
    % C* c, h9 T& b( Gimport matplotlib.pyplot as plt3 D( o) W, |5 t; M& E
    import random: h7 A2 W: z9 t9 f
    0 o: K& A2 o; F# g+ m) B* N
    x = torch.tensor(np.arange(1,100,1))8 v8 h* W; V. l; W
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15. c! c. u) c& v9 Q1 e
    0 \# x6 ^) k6 [* W0 M
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    4 {+ m9 b/ d0 ?* F7 }b = torch.tensor(0.,requires_grad=True)8 F' A; m' v  w4 c5 f4 z% p
    8 m* f8 [, V9 f+ Q5 |
    epochs = 100' m) _, H* C* l$ E
    6 V) Z5 Y2 s7 x- i; }" J4 H% G
    losses = []4 I1 R- w' i9 T; n9 v
    for i in range(epochs):7 R0 J4 P' _, Z' W( }' B: I
      y_pred = (x*w+b)    # 预测( r! f7 u* K# X# `4 \7 s2 ]: ]
      y_pred.reshape(-1)
    # U5 {$ ^* |( O & v/ ~! U+ L& N% o* c; O7 p
      loss = torch.square(y_pred - y).mean()   #计算 loss) `- X6 B- F+ X
      losses.append(loss)! h, p5 y' [$ `! K( b0 s* s; ?
      ' M0 P- @5 n" u9 J  j
      loss.backward() # autograd. a2 `* C5 z- U% R& [1 J
      with torch.no_grad():
    / e5 e3 N7 S$ L    w  -= w.grad*0.0001   # 回归 w, O  u8 a! m- E. D2 M: V* E) ~+ ~9 c2 u" v' a
        b  -= b.grad*0.0001    # 回归 b   l* m% t: N) k+ h4 k: F4 }; `) x! h  r
      w.grad.zero_()  0 W2 a/ }' I6 k6 p
      b.grad.zero_()- p7 V5 D! _- v) S8 l0 k8 i
    $ X. i( x* E6 n5 ?" y
    print(w.item(),b.item()) #结果& g* y4 z( h2 R
    6 y1 ?  H" L" @
    Output: 27.26387596130371  0.49745178222656251 T( K) X- K+ K' s# R7 K% j
    ----------------------------------------------% f1 c% s( J9 \  y
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    $ x' C" S+ b( C/ w/ m& T高手们帮看看是神马原因?& D& H% c  R' U3 ^" W0 Y; B

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 / _/ g) C5 z, O. j3 S. \
    3 ]+ p7 |1 W7 `  r4 V
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    8 k; \3 J2 k. x) ~-------: s' _  I2 N) y' U2 D% u; q7 N" E
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    $ I; m' }! |$ w& ~8 c+ N* F-------
    3 z% N! k( I0 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
    / ?. i* q& c0 h7 q2 y5 t' |' `没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?% T/ X9 n2 b- O! U
    -------
    / R3 k; ~  K9 H+ h" Y7 Q: f) P* H不好意思, ...
    8 r3 q: t+ Y+ q8 D; M2 I: |8 x% ?
    谢谢,算法应该没问题,就是最简单的线性回归。! g5 a3 H4 ~- Q; `% P
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 0 v& T2 u4 C* \0 R- Q( M
    雷达 发表于 2023-2-14 21:52
    / O7 w# C% a! h. V- H6 q" }谢谢,算法应该没问题,就是最简单的线性回归。# v5 V5 R  {( b$ Z/ a/ w" n
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    0 ~( P& @0 c0 d! K' G5 G, r- h1 ]1 O6 H$ J# o( v* U5 s: m
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    : M/ a9 q: ~: V. m- w  s" H1 J4 Z7 y5 D' `& {, N
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    " B" i" r9 j, u7 u
    老福 发表于 2023-2-14 22:00; F& i8 [8 }2 |- N2 t
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。: V$ c2 V: [8 j6 p* `: z$ p6 d

    # R8 P0 }* p8 c: p或者把b但的起点改为1试试。 ...
    / J( d, g9 D% @
    ( o, {9 U' r9 b! H) I- g& W
    你是对的。
    , _) Z& d+ ^% M  o2 E( Y9 z6 z去掉了随机部分
    ; ~# t, j" y4 d6 ~% F1 S#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    # G. v2 X; H( n: @9 Fy = (x*27+15).reshape(-1)
    " o; m/ }; z2 [
    . V! ?0 J) p  M6 F( L& l- N9 ?循环次数加成10倍,就看到 b 收敛了
    ! E' w1 o5 `6 a. L9 P: o; f) dw , b' `6 O+ L- {/ ]7 l: o2 q
    27.002620697021484 14.826167106628418
    ! ^, G$ k* l2 Y: o) h6 p# z7 g9 q, U" s4 M
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-30 14:05 , Processed in 0.056555 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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