设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 - Z+ \2 D9 o1 F& `# ~: s

    ; n5 d9 j. g1 L% P为预防老年痴呆,时不时学点新东东玩一玩。! {8 R2 d4 c8 ^: }" a
    Pytorch 下面的代码做最简单的一元线性回归:
    2 o+ u. C- f% t5 G3 E, {0 ~# n7 q5 n6 K----------------------------------------------
    5 \0 X2 n: s7 B" ~import torch
    6 R. K' n6 m3 ?6 Q) L* ?9 [import numpy as np
    2 v& X, w- Q- p  Kimport matplotlib.pyplot as plt
    % B' O  H& Z. L% U1 S% Jimport random
    % d* h; P% X5 T; S9 v7 }3 N9 t1 S: g( f7 |8 P
    x = torch.tensor(np.arange(1,100,1))
    6 Y$ t+ \0 u6 Y3 dy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=151 g* @$ n3 h0 d2 `

    & ^6 w2 x! r1 Z; B- Gw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    : ^! @, t3 O0 d  P. r- s) k/ G: u, Wb = torch.tensor(0.,requires_grad=True)
    ; K* D0 f6 d  Z1 e
    9 h2 Q0 e% x( K- Y, h* Z' m1 F( Fepochs = 100. s8 X$ P! F: d# f1 N  j) o

    ! y- v7 e$ Z# Q: i3 d; Mlosses = []
    7 s8 t. q; O3 e5 H" Ifor i in range(epochs):7 \- ?: w. j; h; v! ^6 s
      y_pred = (x*w+b)    # 预测' @8 a- Z+ N% {6 {# x* w1 C7 ~
      y_pred.reshape(-1)" c1 e" h, C: j8 T# h( ^

    8 y: W) Y$ V7 \! i9 y0 d2 B  loss = torch.square(y_pred - y).mean()   #计算 loss
    % Q- B8 l) m  Z4 H% q" [& G: E  losses.append(loss)3 _" x4 L8 l+ X5 j
      : P3 v9 ?# E6 g# O4 O5 b" l
      loss.backward() # autograd
    ' f+ S0 _' o% P, B* [  with torch.no_grad():
    5 B+ i8 t0 i. z& Z; k5 N! N    w  -= w.grad*0.0001   # 回归 w" ~% [' w- O" Q2 x" \
        b  -= b.grad*0.0001    # 回归 b
    $ J- G" p( M! A/ C1 @. F: N! X  w.grad.zero_()  
    + k8 N* U4 E' n6 [% J  b.grad.zero_(). t7 {. L8 d; U2 x- J1 [* A

    . Z4 m+ F0 v9 I& H; w$ [% yprint(w.item(),b.item()) #结果
    : n+ N0 z+ U$ G$ L% z  I  |+ t  b, f5 H
    Output: 27.26387596130371  0.4974517822265625
    ; J2 a2 C2 ?* Y* t----------------------------------------------, w$ {& |- U1 `: H! I
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。1 H, P2 T! [& R* f3 G* j+ |
    高手们帮看看是神马原因?# ^) {9 s5 A8 `9 {; q4 ~  T

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 ) p( b+ c' f! g. [- \6 |

    # e, J  G9 H# X% B- ~8 S+ U/ ^没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?8 T, |% h# K$ \- n: Q+ N, I9 q
    -------
    , U* I9 X( n' W8 o- o不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    7 _1 m  t- q1 R# s4 y1 _-------
    $ w5 t, y" _1 M, G, ~) J算法诊断部分,建议把循环次数改为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. a- C; {2 N9 s( c" k* V" g$ D
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?* C& K9 ^, {9 @& Z2 M0 {' M
    -------
    . M! L3 d1 `- l不好意思, ...

    ! |8 f$ Y" u' w3 S' G# c  L8 W) J谢谢,算法应该没问题,就是最简单的线性回归。& I0 n# o- }1 l! [  s& I* ?8 E4 g
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 3 `1 E% B1 G, ~. k( f
    雷达 发表于 2023-2-14 21:526 w1 ?) ~8 \/ @6 d
    谢谢,算法应该没问题,就是最简单的线性回归。
    ( a2 d, O+ H; v: U7 n$ v5 e! V我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    ' j3 @7 E1 g/ B* }& M: F& p  S7 k* [/ J( S! R8 J% y& `4 e' }* w( Q
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。, l/ W0 }. o1 E
    4 H6 x7 p: g; R; h# u: ?5 d
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    ; W' k' T/ M& P5 w% R
    老福 发表于 2023-2-14 22:00
    " w+ L: v* T+ l2 Q4 A: A8 P  a刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ( `! b+ k( p  C7 _: i
    8 n- ?8 ]. ~7 h" P# [+ A! ~或者把b但的起点改为1试试。 ...
    ( m) l+ }+ A( {( U' {
    5 S' u) M  t2 o2 {+ y
    你是对的。
    1 q* I# V4 G6 q& |- M9 @9 @/ f. G# u- W去掉了随机部分
    / q6 i6 _0 r8 j#y = (x*27+15+random.randint(-2,3)).reshape(-1)- @) E; v% @" N
    y = (x*27+15).reshape(-1)2 j6 ^' d& o/ _, h+ ?* C9 G
    ' e/ V  b* u6 G
    循环次数加成10倍,就看到 b 收敛了
    + S0 ?) w& P9 h4 uw , b
      W6 b% K5 s$ o. d27.002620697021484 14.826167106628418
    9 k5 z& Z( g) |& E* R3 G6 Z4 a% \9 a- m. Q8 `
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-5 11:57 , Processed in 0.062165 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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