设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 - ]( S# X5 r* t/ }  R1 L5 F. h" n& C
    - [7 n$ b$ K, j
    为预防老年痴呆,时不时学点新东东玩一玩。8 b: v! t  q, v) |  B
    Pytorch 下面的代码做最简单的一元线性回归:+ p$ D2 D9 m7 U! p! D
    ----------------------------------------------
    8 ^: I4 }! S$ u, u3 _import torch# D$ a% \. K( B5 L
    import numpy as np
    6 L- p. N" ?- a9 U2 d) o! jimport matplotlib.pyplot as plt4 W. M& Z& T2 _0 G: j4 _
    import random
    5 B1 g8 q9 G* K: v4 Z: i# a
    ! I8 i9 W2 ^9 Q" l& Z6 T( ]- Hx = torch.tensor(np.arange(1,100,1))
    3 g) Q$ C( O% Q7 ?4 \& Ry = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    9 X  p; M2 q0 k% Z7 e% F) Z2 [2 @# y& h* s, E- t9 f, w! P
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    ( c3 [( W1 v4 K' u. P6 @  v# b. Xb = torch.tensor(0.,requires_grad=True)
    " w" T. R! _8 j5 p  n
    ( U/ E( ]/ e% H- F8 m4 _epochs = 1003 _2 ]  L* W- C. w
    + E, u* ?3 B. k- k, j: m" E
    losses = []5 |0 u& p& ?1 W. w9 `" [, w
    for i in range(epochs):
    4 g( |$ t' @5 [. k+ f  y_pred = (x*w+b)    # 预测
    / P6 N7 o0 P9 }+ O1 j  y_pred.reshape(-1)
      X* x% i! ~1 q9 `/ k
    ) r& a" `( q- o3 p6 L, D4 ?1 V1 J  loss = torch.square(y_pred - y).mean()   #计算 loss" e- m4 A2 I; S  g5 A0 X& a
      losses.append(loss)
    0 G) Z! B7 v4 C7 ^5 z# O  U  5 A+ m: U3 W. [( |, ~8 C1 M
      loss.backward() # autograd
    7 V9 D  ^' ]/ m5 s( B$ I& ~+ A5 t  with torch.no_grad():8 J; O1 [+ p: o) k, J
        w  -= w.grad*0.0001   # 回归 w
    2 z9 F: Z2 c6 Q. g. V) s    b  -= b.grad*0.0001    # 回归 b 6 W, p$ M3 p( A. J1 e0 k$ |
      w.grad.zero_()  : ~5 o. [" R# P
      b.grad.zero_()' d8 D6 p4 q$ f1 v  ?

    % f2 w7 n  n; uprint(w.item(),b.item()) #结果
    ; [! r) j& C( T: w' J
    9 q% L7 b/ {# R4 mOutput: 27.26387596130371  0.4974517822265625
    / }; i. e* h1 P/ W* ]+ s----------------------------------------------: y$ p3 F% K) |2 Q$ k
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    - e% J/ f/ M/ y; m1 n) u/ S高手们帮看看是神马原因?
    3 ^% b" \. O' l% V4 X

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 & q0 Z0 s2 c# D( `* I. Z$ ~7 s
    ! w! T# i, C# k5 [
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    + N' h9 M1 }# x8 o: ?1 O5 a9 v( Y-------2 k  d* `, j& v2 Z4 ?
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。8 f! o4 U# W0 ~+ h
    -------) S% R+ z2 G- }! j) Y4 ]% n
    算法诊断部分,建议把循环次数改为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:235 H, |' p: {+ S3 |" j, j& U* g! @9 W4 c
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?. {  n- _' d8 q8 X3 c) k3 i9 q
    -------) \0 U# Y% x* U- _9 s) L  G
    不好意思, ...

    8 E% k  z$ f! a1 p9 M谢谢,算法应该没问题,就是最简单的线性回归。
    % i* {6 d) \4 @, D/ y我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    # Z. C' Y$ p  ~; o
    雷达 发表于 2023-2-14 21:52
    ; a3 A  ?: P( \) `: S. ^7 e2 }谢谢,算法应该没问题,就是最简单的线性回归。# J$ b* {  l3 B+ L% ~; u. s
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    ! Z# E9 l, P/ k" q! H. D# T! b
    6 o* @, E# X* B# p1 a2 K刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    6 C( {: m. i4 }$ E1 b0 l% @4 x2 c. ~7 k$ T; B
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    0 w! w) {. [2 L: p* K/ D
    老福 发表于 2023-2-14 22:00
    - e& @: A/ i9 d' A4 e# |刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    # N  R9 j! e: v6 |( u" ?; q5 g' K% H( b* f
    或者把b但的起点改为1试试。 ...

    8 c3 x. R  y- a' a6 A0 `0 m' ]& k$ K, H
    你是对的。* t; r7 t0 _. i5 {/ d$ W# ]2 o
    去掉了随机部分% g! D( i5 c' z3 R1 b
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    : t; o( J9 Z, \5 V. zy = (x*27+15).reshape(-1)$ X1 Z! _# ]0 h
    3 U% m9 i' c9 J0 G$ I. M7 i5 Y3 {
    循环次数加成10倍,就看到 b 收敛了. E3 Q3 y0 r$ \! y) n8 T
    w , b  |& D" H3 R3 [0 Y% h
    27.002620697021484 14.8261671066284187 w2 W7 p$ b7 b$ {3 e

    ' C# }, A  ^) \3 y& w和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-10 22:04 , Processed in 0.064691 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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