设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 $ s( R& q% y1 D( g9 ]1 d
    1 _" c) n! F# d3 M) U4 I
    为预防老年痴呆,时不时学点新东东玩一玩。0 G- {9 Q$ R+ A5 @  S1 Q% s& h
    Pytorch 下面的代码做最简单的一元线性回归:% r: l. |) w5 @* N$ k! K
    ----------------------------------------------
    . j) O: }0 q- u) j+ aimport torch1 ]; U8 _. P, u- N$ R7 j
    import numpy as np
    5 d; p$ ~8 o# T! z! p# n% [import matplotlib.pyplot as plt
    5 f) P. L4 D3 [import random
    , i6 `9 q) z3 `7 o8 ~3 ?5 r3 z  ]
      Y2 G+ Y# f0 Bx = torch.tensor(np.arange(1,100,1))6 r# y* F# {4 w% n' q  C# u% p8 O; @
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15: _3 g+ ?; E* I, P+ C* j
    + `: O' I0 A/ Z) H* F
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b' r6 c  F- y5 V5 U6 M
    b = torch.tensor(0.,requires_grad=True)# {7 T0 [: N3 p: {: z% W

    ) t2 `8 G2 e3 L( S1 g. g. N+ _epochs = 1000 G" Z1 n8 V4 T5 Y
    & E& K" l! ?  H/ J% I. [
    losses = []
    . Z' N$ R5 M& E: Ofor i in range(epochs):
    " D. G8 _& H) b; _$ v7 |! C  y_pred = (x*w+b)    # 预测$ {, f7 F# [8 L0 v8 S$ o
      y_pred.reshape(-1)2 X  C# v+ A5 b% A/ e: O

    1 F; o% o& G8 |' G  loss = torch.square(y_pred - y).mean()   #计算 loss5 N1 P6 J" x1 `  J% v- b$ Y
      losses.append(loss)
    7 x( y1 S* @) K4 w' O  $ J5 V! n0 D% E. Q# U5 z$ @8 ?$ Q' s
      loss.backward() # autograd
    & V0 j+ ~5 V0 M7 l! g  with torch.no_grad():$ w% G# G1 E' z/ b
        w  -= w.grad*0.0001   # 回归 w
    ' c, N9 j/ m3 ]3 x) ^    b  -= b.grad*0.0001    # 回归 b
    2 o" I" ~6 |: K+ n  w.grad.zero_()  " |6 X! {+ [8 S% u/ `7 S: L, [
      b.grad.zero_(). ~3 s+ `8 z6 ^) I1 Y$ I- G

    - `, t5 }* X8 ~# dprint(w.item(),b.item()) #结果
    ( H% ?$ e+ }7 V5 m  o2 P( d+ Q
    , W2 u7 b, ^0 b7 oOutput: 27.26387596130371  0.4974517822265625
    - E% R5 Z- j$ c9 B; P  V" T' |----------------------------------------------! y* T; O2 w0 M9 \5 T0 O  |
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。* @/ P, T( V+ x, h( i, U7 ]
    高手们帮看看是神马原因?
    $ k: w2 g+ B( K& Z9 [' a

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 + J/ |, d& ~. M& M% e% m! C
    3 P3 n; [) u% u5 W
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?* }% O: I" t- y0 [, Y! R
    -------9 u+ c+ U, [& E
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。0 q& R2 {: O/ f. i7 R5 y( C
    -------7 `1 @% c' V4 W/ W  y& k8 J
    算法诊断部分,建议把循环次数改为1000, 再看看loss是不是收敛。有点怀疑你循环次数不够,因为你起点是0, 步长很小。只是直观建议。

    评分

    参与人数 1爱元 +10 收起 理由
    雷达 + 10 谢谢建议

    查看全部评分

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    板凳
     楼主| 发表于 2023-2-14 21:52:57 | 只看该作者
    老福 发表于 2023-2-14 19:23& \  k" B$ u9 o; G4 r( z: z5 g
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    / A3 ?& T* q* m! D-------
    7 S, L- y2 y2 M8 i9 k不好意思, ...

    8 w# W. ?* _0 E6 \谢谢,算法应该没问题,就是最简单的线性回归。
    9 I; n# r; H* {, M9 B我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    / i* R/ k7 Q' E1 t( T: H. e
    雷达 发表于 2023-2-14 21:52
      V) J! W! Q1 t/ w谢谢,算法应该没问题,就是最简单的线性回归。3 N. h6 a3 s1 c/ V8 m2 s8 ]
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    - M9 n" h! b  r( c' l& o
    ' n7 h$ e  H# S" \刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    1 o, d1 O8 z- }3 `1 n& N1 J  H2 F0 |( {& _' I+ {2 l( U
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 % F3 X( D' z: S  Y! p7 F! H! {8 W
    老福 发表于 2023-2-14 22:00) n2 i! o4 n' B' }5 X7 q4 W2 p
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ; ^5 n0 ~# v" d. A% y
    ( n6 Z% }9 j4 a# e/ o1 J3 `或者把b但的起点改为1试试。 ...
    - G1 d+ D1 l! `5 F$ F

    0 L+ ?* n3 ?: y5 ^! B' X8 `0 t你是对的。
    . s/ [+ F6 w9 `去掉了随机部分! P/ g  z& v4 n! s
    #y = (x*27+15+random.randint(-2,3)).reshape(-1). C1 ?, E% w- M& L; U) A9 `; H5 ?" ]
    y = (x*27+15).reshape(-1)$ k1 g4 ]& [3 _9 X

    9 F1 l: H: _2 Y" C循环次数加成10倍,就看到 b 收敛了' e) J8 ?8 c1 I# T$ b5 R
    w , b1 ]2 J: M% b$ G4 j# q- o: q
    27.002620697021484 14.8261671066284189 _, ?. X# ~: Y. k5 G; p

    6 @' j8 a+ R6 b, H和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-7-9 01:58 , Processed in 0.047714 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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