设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    5 J1 y# `4 W" z
    / m. B6 J# g/ a" ?为预防老年痴呆,时不时学点新东东玩一玩。
    & N1 e( \; A8 p2 G: o1 `' L/ v: CPytorch 下面的代码做最简单的一元线性回归:
    8 W: f1 q6 L& x- |0 t$ P" r! e----------------------------------------------0 \- i( ~" r3 X4 [' d, M9 Q
    import torch
    ; g+ Z9 _1 r( Y, Fimport numpy as np
    - k) \* E9 J5 z% S3 Y2 ximport matplotlib.pyplot as plt
    ) J' V% c7 {" u( _import random
    3 r8 O+ E) T( |) U5 q8 F  E1 A0 d, Y& E) ]$ E' ^* X
    x = torch.tensor(np.arange(1,100,1))
    - Z+ T% N2 ~9 x. Py = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=158 I. g4 Y& E6 r& X8 j' v* L! H$ W
    / E8 g* n7 d3 d* Z5 a
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b" ]2 f6 L" e% l
    b = torch.tensor(0.,requires_grad=True)" J: U9 S4 z# U! C7 p! b# R
    4 T5 Q0 n8 ?5 z$ d6 z
    epochs = 1008 k1 H/ j) @/ n: I# w( v5 I

    , G; ^5 f2 O- A9 N5 o! t" elosses = []6 i  k; I) P- S4 d( {0 N
    for i in range(epochs):
    5 M. c$ Z( \& G+ D4 W  y_pred = (x*w+b)    # 预测
    % p  z, z# }* g. U+ z$ L  y_pred.reshape(-1)
    , A' l  r9 d; E# e5 q. }
    - K0 R4 E0 J$ F  loss = torch.square(y_pred - y).mean()   #计算 loss# K0 ?' s& D% F: ~9 \
      losses.append(loss)4 [/ [, W& `1 V- G5 H
      6 o6 r  v6 o  @1 e1 ?
      loss.backward() # autograd
    ) O3 i9 T9 q, G5 c4 s( C) x) @2 |  with torch.no_grad():
    % S& i! s% m2 H- T* Y& \2 U1 `    w  -= w.grad*0.0001   # 回归 w% C1 J& l/ o9 w# W( ~
        b  -= b.grad*0.0001    # 回归 b
      R1 p: O+ q1 V+ L+ v# ~4 Z' O; U  w.grad.zero_()  
    . ^9 N" ~  _2 p. J, R7 W! x) v7 ]  b.grad.zero_()- k# j2 n) d0 |2 e

    $ h) o- x' ?; x4 q+ Pprint(w.item(),b.item()) #结果
    ) a+ y! X/ _, Y2 f* B/ \$ n% Z& }, q' \" r
    Output: 27.26387596130371  0.4974517822265625
    . @8 B2 J1 _. Y6 a* L----------------------------------------------. q. z* o/ B. p$ r* Q
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    - o1 P$ W+ G' `4 w9 I- g9 g* @# i高手们帮看看是神马原因?2 i3 `8 d. U. w" i4 R

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 2 V9 H$ y( A# |0 p- [& F3 X
    : M4 w2 Q  l: ?4 u$ y! e5 Y6 _
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    / s% k3 K: b- p, O9 N7 _* z-------
    4 c. x6 a( W3 {$ h' a( b/ F不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    % z! d3 M3 H. K" L) {1 u' D: }-------
    " p0 n- A5 T# W7 X$ r算法诊断部分,建议把循环次数改为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 Y3 {4 O! ?1 O; r# \
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?3 Y0 K( X& u+ X. N/ s
    -------
    0 J. ]' \% _; k! f1 v/ f  n, E不好意思, ...
    2 k6 u/ j7 \: {) h7 y/ r% I: \6 i
    谢谢,算法应该没问题,就是最简单的线性回归。
    ; @" t* ?( q' \4 b* p( T1 A我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    $ w, A3 b, R" C7 m
    雷达 发表于 2023-2-14 21:52' _  a2 E; m/ b  Z# A9 g
    谢谢,算法应该没问题,就是最简单的线性回归。
    0 F' j3 K7 s; ]! _7 t* m# c: u我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    1 F5 Q. F# J. B0 D3 [
    6 J4 T* ]: d: K0 f9 A% y2 m: j
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。  v. `; l5 p/ ~. A
    ; d: r: C# i% M' O5 \
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    - c5 F& M3 `0 f9 b, _$ r1 W
    老福 发表于 2023-2-14 22:006 j! U# S3 _; n# w$ E  I' y
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    2 O- Q; N. t/ b6 A4 t2 p; l/ h: ?: q% Y* F1 `: @
    或者把b但的起点改为1试试。 ...
    + u+ l& ?' `1 G4 `

    7 D: s0 F, z" w: t你是对的。9 F" X8 Z6 b; H! M; z
    去掉了随机部分
    , e. `. }7 X: g9 K#y = (x*27+15+random.randint(-2,3)).reshape(-1)8 X: z% Z% t' D. n9 L
    y = (x*27+15).reshape(-1)4 W/ S3 S  H7 P. X1 `; I
    % N( ]( o# M4 R( s1 @
    循环次数加成10倍,就看到 b 收敛了
    9 O: e! [4 r5 F$ g* g0 e% C  xw , b
    / @& B7 h) L$ l& C- E& ?27.002620697021484 14.8261671066284188 k; v! z+ G# r" ^1 o2 k- w1 F! ^3 Q
    " f) C$ c7 Z9 S( X5 {$ B8 m
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-4 21:30 , Processed in 0.058706 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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