设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 : i, I8 O6 k, E& p& E

    : X* Q0 W- \4 F- ^/ C! ]0 j为预防老年痴呆,时不时学点新东东玩一玩。* A3 C8 y/ ~) I1 v- t
    Pytorch 下面的代码做最简单的一元线性回归:+ Z2 l* z- O+ Z! F" T
    ----------------------------------------------! ^3 Q8 |; n. X, C
    import torch0 G9 h* V* G7 W3 r3 W- l1 B. c9 \
    import numpy as np
    ) c2 B$ M3 J  ]7 m% @+ Jimport matplotlib.pyplot as plt3 G: i. b3 j" d0 P
    import random
    # y& X+ @- l- l  ^
    . ^4 m) a" b0 w' Xx = torch.tensor(np.arange(1,100,1))
    / Q, S$ X' L" qy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    / `; y2 m4 z3 F3 T0 r1 Q. n
    : w7 z& H. ?. G! q# s/ ^9 W0 n' Hw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b4 ~* o1 B7 o0 D( N  t
    b = torch.tensor(0.,requires_grad=True)3 q4 M' J) r( R! y: [# ^
    " b9 Q7 c. o  s. }* U3 J6 e5 N
    epochs = 100
    8 c  a7 q& X4 `4 K0 f
    ; N% Z6 c' C# Xlosses = []3 \6 r% X/ ?# D' N, I" S
    for i in range(epochs):2 P- y* ~- w  a& B+ D
      y_pred = (x*w+b)    # 预测! G/ V7 x. F* R) E% Y7 N, Q
      y_pred.reshape(-1)
    # W% t% s8 [9 U9 r$ ]
    2 J$ \# c6 ]- L9 e  loss = torch.square(y_pred - y).mean()   #计算 loss/ B; ^. w5 T1 E% K5 [/ r
      losses.append(loss)" _% n& P) E% q2 s8 r
      " n6 U: |: x8 s9 ]
      loss.backward() # autograd
    ( L( z0 z! `2 x" I  with torch.no_grad():
    9 Z; k9 X5 v2 h- r4 S, r6 Z+ W# e    w  -= w.grad*0.0001   # 回归 w2 G# v8 X. W/ @4 i
        b  -= b.grad*0.0001    # 回归 b 3 Y7 Q, i9 a, `4 L0 v
      w.grad.zero_()  
    % e# R* F) `$ w% y) y  b.grad.zero_(), ^0 y( p8 x4 p8 M) v3 d
    / g- b  {- V& U, R
    print(w.item(),b.item()) #结果0 d. `( |. [5 g5 _& m2 k' ^
    * ]* Z7 T. x  u  D
    Output: 27.26387596130371  0.49745178222656253 `& C! h9 w  V" R6 ~# H
    ----------------------------------------------# x2 {! [! b$ e9 l" r1 G2 t0 B
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    2 W' E7 I: f; B0 w9 q) E高手们帮看看是神马原因?$ Z# j( O" p' V7 G0 C, `

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    8 A( G* f2 l! W  r- q. M& T  U, G8 X2 V$ v& r) t
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?/ i7 A4 ?$ S  u; x' J9 e& l3 `* V2 x
    -------9 a, ^- q) [8 W! x; _; @
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。) _+ m2 h/ G% g- s3 y) c
    -------% I8 K. r9 \- u6 @4 x) f
    算法诊断部分,建议把循环次数改为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:233 ~% k. e7 {" |! M
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?; N) ]& ^* u! z6 L4 T+ p! V
    -------
    # ]! q. D1 ^) n  Y. S& d0 U. A不好意思, ...
    # _* u# K: f& |
    谢谢,算法应该没问题,就是最简单的线性回归。
    7 G* p8 k( P0 L/ `* G% q我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 2 v  m* S8 _. r* T0 ^% \: `- a& x6 s
    雷达 发表于 2023-2-14 21:523 L9 V0 m, F: e4 B3 B# ]
    谢谢,算法应该没问题,就是最简单的线性回归。
    2 w* c' d+ o5 X; n5 ]2 @7 H我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    ; `4 t! F* t' e7 i$ b0 g; q* S

    ( H" a7 Y! F( D' U! ]' X刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。! J" k% n3 B( A, }% ^
    , V& K$ _( ]+ S' u
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    & Q+ o& I  e6 O' B/ Q3 N
    老福 发表于 2023-2-14 22:00
    # u" v& o" b8 e2 Z9 E! P" z4 l$ ?刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    * C5 w7 O* z) u8 H. k$ S* B" s
    3 [% M1 G+ F  ?+ o/ W' d或者把b但的起点改为1试试。 ...
    ! T; G4 K; e7 m5 Q; T- t2 h
    ( f4 d4 d7 r$ O& [6 I* R) `
    你是对的。
    4 \! e$ ^. }$ x' c& b0 X% Q去掉了随机部分
    7 s: C: u) i) A( b0 G% C# O#y = (x*27+15+random.randint(-2,3)).reshape(-1)& \! ?# n8 |  g' R8 I
    y = (x*27+15).reshape(-1)7 S) _8 V) _6 [: c9 [2 a/ h
    * w1 S) ?$ f6 c4 X2 `1 q% x* V
    循环次数加成10倍,就看到 b 收敛了
    5 a9 u+ i3 B! t& Dw , b
    " c+ v, m+ v5 ?27.002620697021484 14.826167106628418
    6 F( g# `; T) z8 g/ J3 W! v% {; K$ h1 X1 z3 ?9 ?
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-18 06:24 , Processed in 0.060877 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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