设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    - t6 B1 G! w) A2 w) @' P2 w( f( m$ l8 B, y
    为预防老年痴呆,时不时学点新东东玩一玩。
    , r. |0 G; F% N" N/ ]" j9 u' ~' iPytorch 下面的代码做最简单的一元线性回归:
    * j( |: Z) g, [" @: N8 m( U----------------------------------------------
    $ U6 A! F. b/ y! M* y9 \( ^import torch0 @: y% ^0 I5 ~, b
    import numpy as np
    ; y' l0 h  V  v% L; C+ pimport matplotlib.pyplot as plt
    & g- g9 R/ m0 ]* Y8 ]7 U: X& Rimport random
    - I) J" p2 H# E) O- V/ d' T7 k3 M  {$ J9 C; Y* i, A, O
    x = torch.tensor(np.arange(1,100,1))& {6 e- U* j( ?2 K* y9 m
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    ' {7 w# Z! F# [2 E8 b7 [: g
    7 \1 p: l0 h! Jw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b0 M# H0 O* W7 d
    b = torch.tensor(0.,requires_grad=True)# M: u+ q9 p" N3 D. X" [# B' j

    % }$ l0 E3 D7 ~* `2 Q# a9 |1 o9 S& Cepochs = 100
    , W. \7 a- W# U; X5 `7 \/ ^* x, t: [3 z4 h& `$ {
    losses = []
    * s/ }$ v+ I, |: Ifor i in range(epochs):9 p3 W, h- M4 T6 B- ]
      y_pred = (x*w+b)    # 预测
    " p: G2 z+ M( U3 |3 d0 n4 b  y_pred.reshape(-1). [6 K9 [! j" V0 w1 M9 M

    5 X$ C# Y! q/ `& \! L6 d7 Y& }  loss = torch.square(y_pred - y).mean()   #计算 loss: z, x8 r7 D4 H, P' m; a( t8 T
      losses.append(loss)8 e: D8 G9 m8 ~+ P  K
      ( s2 J$ u  a: s, K
      loss.backward() # autograd
    2 c- U% Y& R* p6 H  with torch.no_grad():) o1 {# ]* p. s, S) F1 M  |
        w  -= w.grad*0.0001   # 回归 w1 H- [/ ^; h# Y2 L; o( h" Q
        b  -= b.grad*0.0001    # 回归 b % d; L+ V3 w, P* f' Y
      w.grad.zero_()  9 l% h9 ^' r$ t, n# Q
      b.grad.zero_()
    ) a) R) F; u/ O4 L( C) R" B+ S; @; H) v7 Y  D" a# G1 f: [
    print(w.item(),b.item()) #结果
    5 }1 l3 }( i5 E* |2 y2 n# Q' V/ q/ m$ O
    Output: 27.26387596130371  0.4974517822265625
    + s: @/ H' ?, N& S# ?4 \----------------------------------------------
    ! ?9 N0 X7 m9 ~9 r: g最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    / I7 J4 c( g0 H& I* j3 W4 g# u高手们帮看看是神马原因?' W, i- Z! ~+ N( V/ I7 K

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 . S! `+ y7 y' ^. z; W$ |

    " V* l, W2 o/ F9 o. M" W没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?% P# A) v/ f, I+ n5 t
    -------
      [- c( }1 T3 i4 n. O, z不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。4 ?" x! P9 z  F8 X/ u
    -------
    , n7 ?$ l7 k4 F; }* V1 g* h, z算法诊断部分,建议把循环次数改为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
    * D% f8 ?# q6 o; h# f8 {没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ' o2 j/ N. u7 A: {  Z  y% ^$ s9 ^-------
    1 Z2 _' e2 ~5 N8 n# w1 A5 y6 g不好意思, ...
    & h2 J/ J) m/ M  v; a
    谢谢,算法应该没问题,就是最简单的线性回归。
    4 x/ _4 B! M6 u! ]  v$ L( B" h  @' f5 F我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 - _4 m1 L* p/ z' H
    雷达 发表于 2023-2-14 21:52
      |8 i2 d6 B& L8 A  W% ?谢谢,算法应该没问题,就是最简单的线性回归。
    . z' N6 q' D$ f( f/ @5 E我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    8 C' x( P$ U, P. d9 y! g  _) e8 m

    . I3 Y' k, |( }4 ?刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ( _) j. Z# a& K5 O5 N* X( O& x" y# V& u& R% {3 t9 ~* M5 n
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    # K& |' F8 _: C, S, a
    老福 发表于 2023-2-14 22:00
    ! D! e# b$ ^) z& {6 l( a0 S刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ) U0 ^. P3 ]8 J! F0 o5 S  \7 A1 G3 H7 E. R& w/ C
    或者把b但的起点改为1试试。 ...
    4 S, J+ d& ^, v* c( l& U' F* s1 p
    $ d! R1 e8 P" l, O& @$ J6 @& }- d
    你是对的。) V+ |) O; U# k. F0 L  X1 K
    去掉了随机部分2 v- q. v2 \& r, R% E# v* I
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    % |3 F( G) I% R( L. Cy = (x*27+15).reshape(-1)
    & o7 K/ x$ h4 v- d* y: T
    ; L/ f4 {9 s& A: b/ C6 a9 c) \7 |3 `循环次数加成10倍,就看到 b 收敛了
    - w$ ~5 T5 K) }7 g% W; @9 Sw , b
    3 V5 R5 J2 R9 ^) P: w: X7 C" Y27.002620697021484 14.8261671066284185 B( f( j3 R0 C  v
    3 j2 m" m; P% J2 j: s
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-19 00:42 , Processed in 0.061986 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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