设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    1 Z. Z- `4 I( g2 R; j" S4 G/ w3 c7 P  g  {
    为预防老年痴呆,时不时学点新东东玩一玩。
    . N/ F+ e5 a: H( X9 }8 H5 }Pytorch 下面的代码做最简单的一元线性回归:
    # K- g0 C6 w: b, S----------------------------------------------
    5 ?: N0 `3 n6 L9 O/ ^' k7 @import torch
    8 ?' [) f4 t* o5 M  E% b! Uimport numpy as np3 N# h+ ?4 `) @; e9 P1 f
    import matplotlib.pyplot as plt
      g7 ?. n8 b% n: C4 m# simport random; C3 u5 j1 t4 o3 r; r, H* O
    ! T0 V" {+ x+ _2 N; z
    x = torch.tensor(np.arange(1,100,1))( F/ O# Y+ j: W; B- M' J
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=156 m1 Q2 ^7 ?$ L$ a
    8 o7 M1 c" k* ^+ ?, B
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    6 K/ i4 u$ b* J$ [/ D9 k8 Rb = torch.tensor(0.,requires_grad=True)
    3 M  C" [0 _/ j* `/ w3 \; y3 @5 t, E' _5 o/ ?* A) b8 h
    epochs = 100" X8 f5 C6 v* n( p# a# _( @* o
    4 ~) P+ L! [' z$ s# g
    losses = []
    & ], F" k+ x% k, M6 S7 P. zfor i in range(epochs):
    * R: K& x1 x+ k' V/ A' q$ D. ]+ q  y_pred = (x*w+b)    # 预测
    * z6 G7 X# \! q. M3 |  y_pred.reshape(-1)
    % p5 ]2 ~, Q# I  R' w
    # W% w- `8 b4 f5 M2 h" u" ?& l0 ]2 h5 F  loss = torch.square(y_pred - y).mean()   #计算 loss  v' x5 t5 o! F4 i# `$ E% e
      losses.append(loss)
    ' R: n+ Y7 k3 A! t* O' M6 o  
    # ?, Z. E+ Z' W# l6 o% g& l  loss.backward() # autograd0 _' B8 \  ?! ~2 T
      with torch.no_grad():  S. w5 g# T' }4 J
        w  -= w.grad*0.0001   # 回归 w
    % K% R9 U3 I: V1 L; K    b  -= b.grad*0.0001    # 回归 b - B$ h( N6 Y, {
      w.grad.zero_()  ! m$ @& D5 s! K, f* n
      b.grad.zero_()6 V: J: I7 y  L2 I
    % T5 u6 I, z% w9 @2 M- g
    print(w.item(),b.item()) #结果5 S  ^- X/ n4 Q8 d: j1 j3 {6 O

      e$ ^5 _; O8 b* T. |Output: 27.26387596130371  0.4974517822265625
    : u# N# z' v7 Q9 J7 V# O----------------------------------------------
    7 l0 z* F7 p- \& |6 Q1 d! A8 y% H最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    . ?' P! }0 b# c$ ^/ C  p: d% K* [0 K高手们帮看看是神马原因?" X' Q/ D; M  u( E

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    ) O* m) F* j. B: Q# A" T
    + v  O# [/ i' r, u# W没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    8 b% T) }( v4 g9 I, y-------/ a2 ^1 I) w) }
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    4 m' I- b3 i  m, n-------
    1 r/ {/ a: o4 S2 _算法诊断部分,建议把循环次数改为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
      q6 B8 H7 J8 h1 W+ }5 }没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ! h4 d; V2 A0 I5 ]-------, O2 f% D- P" u
    不好意思, ...

    % n) |& D4 L7 f0 G谢谢,算法应该没问题,就是最简单的线性回归。
    : t  @% E) n; }我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 + o/ d; Y1 X" Z6 s0 U* h0 y
    雷达 发表于 2023-2-14 21:52- A8 X+ j$ S! L; x. ^
    谢谢,算法应该没问题,就是最简单的线性回归。
    ( U8 n* ^2 C6 {* e# t) L" ~我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    ( n9 h. c) H! [& b) g* y5 l2 q

    / j( w' S  X1 K0 \% k刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    , V  D2 ^- H& B0 o: s) C
    / _& h) o' u$ u" ]( b0 B2 L  N# t或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    5 a  {: p6 v% {9 D7 w  B0 M" U1 i5 B
    老福 发表于 2023-2-14 22:004 `  N7 j! M: a. o: r- {* x
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。4 m. z7 i; y! Z! e6 b, |

    2 L5 Q- @# \- w  o: ]; |/ O或者把b但的起点改为1试试。 ...

    3 q% S/ a! \: p. o$ k8 T6 X6 a" m9 h+ X! P9 }+ Z
    你是对的。
    ' w; ^& E: l) R; S( S8 y去掉了随机部分5 _' N. f. a/ U9 l! S. s$ m5 d& ^
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    % n6 X; |$ R" {5 gy = (x*27+15).reshape(-1)4 N2 y4 @& {; y

    1 D) j7 }2 @- D! |! s% k* N: e循环次数加成10倍,就看到 b 收敛了; ?: l; m6 [) Q- c) X' F) Y
    w , b
    % o% ?' u  l: t' n5 h/ l( O) J: W27.002620697021484 14.826167106628418
    ' c2 C$ ~2 R6 M; ~% n3 w3 J& N. L% U
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-28 06:25 , Processed in 0.061847 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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