设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    , t$ q* G: o# @. ?1 B8 O6 Z- x7 J
    , V% d$ Y/ U& `3 K为预防老年痴呆,时不时学点新东东玩一玩。
    & N/ }  @- c2 O6 C0 N; XPytorch 下面的代码做最简单的一元线性回归:" Z. e/ i# N, k
    ----------------------------------------------. a! n% V* C8 G& Z4 ?% ]2 R( ?2 O1 a
    import torch
    1 O5 Z  D  V. z7 |/ z4 dimport numpy as np* X1 z! q& \7 i2 l( e3 {
    import matplotlib.pyplot as plt
    . s# X' _& Z2 }  L6 c# r& aimport random2 _, u+ q' n* a. j) Z7 d
    - A- d' I+ A2 q  a
    x = torch.tensor(np.arange(1,100,1))
    % D4 {9 z* V) c- B" `y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15' \$ m" w% J! N9 a2 J. E

    # P" r5 \+ i  _, `, Ww = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b2 T+ K$ C  s8 ^7 O
    b = torch.tensor(0.,requires_grad=True)+ E* s! F7 _6 P" o1 d2 }$ [
    # n1 ]& S, u) V7 t) P% N- X
    epochs = 1008 W- W7 x, q8 \. {
    $ h  t. k! p5 l3 W$ H, K
    losses = []' `8 r1 ~4 c6 q  V: A& F0 i6 X
    for i in range(epochs):
    / B( W  q( e/ R' J+ _0 \. j. ?  y_pred = (x*w+b)    # 预测
    6 X7 J! H* `% @; E" A, J( Q3 a  y_pred.reshape(-1)* o$ l2 v' o7 D* n+ W) ^

    + E& Y% E5 S/ V. L' I; u  loss = torch.square(y_pred - y).mean()   #计算 loss
    6 g' a& f* U3 |* b0 @  losses.append(loss), R, v3 e+ H1 t  k7 l; B
      
    4 M4 _3 Q8 \" b" u& Z: U1 g& p5 S  loss.backward() # autograd
    9 u0 I% e9 ~( |  with torch.no_grad():& o! v4 Z3 A$ O1 }
        w  -= w.grad*0.0001   # 回归 w
    3 f4 W  C1 J3 f5 |6 }+ `+ j$ O    b  -= b.grad*0.0001    # 回归 b
    ) Q% K) Z8 p% D9 v: D  w.grad.zero_()  $ D; Y9 D- Q" G& u$ ~
      b.grad.zero_()5 L/ Z/ @; P& Q  N& y
    % m! D8 u1 `' T, d
    print(w.item(),b.item()) #结果' d8 l1 t0 M' o0 e( L
    % e' C8 y5 T0 _* _3 a5 E4 o
    Output: 27.26387596130371  0.4974517822265625
    1 b8 t4 D0 G" E8 y% l$ _----------------------------------------------
    & C% p: n2 T  X5 _0 ?最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    : c, R6 G8 g* T5 Q0 V; k: g高手们帮看看是神马原因?
    1 f6 S7 i: z  i* M- V

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 6 w# J0 ?$ E& p' r% R* u# |: d
    0 K) ~; A7 u5 E0 A) t6 [
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?4 n+ u5 ^( K0 U# j) u  v3 w6 M
    -------
    # J6 p+ l* k+ h- v7 J$ Q2 B: @不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    8 u# m0 h& l- b/ ^-------
    2 `' q. X- q, m; P: b  y算法诊断部分,建议把循环次数改为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
    . B; r+ V- n* o& x没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?7 u) d; Y; x! G$ k0 H5 B- d5 T: m
    -------5 t) N0 z1 |. C0 A5 P
    不好意思, ...

    ; h6 _+ n$ Q6 W  M( f谢谢,算法应该没问题,就是最简单的线性回归。
    % ^& a  X. I" F7 _' I我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    ; z% u" b* o; B3 S* H0 ?' t
    雷达 发表于 2023-2-14 21:522 D) s, N$ Y& G6 i6 n2 ^
    谢谢,算法应该没问题,就是最简单的线性回归。
    $ e+ n- t$ X  u2 N8 g3 d; s0 c我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    4 s* s, P! O% G
    / e8 x( p1 \+ y
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ; o% y+ c. ~1 W: U2 l* M
    ) q4 S  m5 t- f4 `6 [8 i或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 . ~* q4 x# k& `! _& S* |
    老福 发表于 2023-2-14 22:00$ H+ H8 j+ z% a( Q0 I
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    1 w8 e7 n4 Q4 w6 m6 G  F
    4 Y. |/ f! p( W! d3 }6 U或者把b但的起点改为1试试。 ...
    $ \. K+ b% a, z7 v+ {
    . P2 u9 s# f7 g- l+ D, f8 {
    你是对的。
    $ I3 S- O: x- P( Q! h- ~6 L# J. }去掉了随机部分0 _+ K; ?" O& u# p" a
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    6 }" M! I% {7 e# Z1 {y = (x*27+15).reshape(-1)/ E* `1 E6 f, Y+ g6 H

    9 O" h0 v& J% r) ]循环次数加成10倍,就看到 b 收敛了
    4 j5 Q3 |+ e. O7 J1 r, q, l: Lw , b
    % o) G" }' L4 o* `, d* h27.002620697021484 14.826167106628418+ E" r6 r" _  m6 ]( a

    7 V: O, B: R/ v4 @9 \和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-2 19:08 , Processed in 0.057159 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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