设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    0 X6 a  g1 r0 ^2 o3 B! e8 V( u
    8 J) T9 b- S" G- g+ q6 v为预防老年痴呆,时不时学点新东东玩一玩。9 d# Q# [* A' b, n! S9 |6 R3 H
    Pytorch 下面的代码做最简单的一元线性回归:1 E! @4 ^6 B  r! o. x' h' m5 b" \
    ----------------------------------------------
    / G" O- G& O# c8 ximport torch% D( ]7 g8 [" `1 O8 v/ W% ?9 ?  C
    import numpy as np
    ) ~; m1 P4 C% \' o2 L( }0 _& Cimport matplotlib.pyplot as plt
    8 ~/ I4 }# @" Iimport random
    ; [( ]* F, I: \- m" n. q( i1 }0 ^7 X9 H% N. C& z" d
    x = torch.tensor(np.arange(1,100,1))( T- e4 u; V0 N7 M# M, r: u
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    9 W9 d" \+ j0 V& W& o$ O; ~7 ~& A- g
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b. _* J; \; Z" V3 F
    b = torch.tensor(0.,requires_grad=True)/ C: n3 l' o6 v) k3 \* ^" k$ c

    5 T: H2 A2 y: Q# F0 I. m" [epochs = 100! w5 K/ h% `% J

    ) |- V) J) D6 U( ~6 L8 C( Xlosses = []
    & Z' ]  g& d/ x0 o8 W( nfor i in range(epochs):( L* _9 W1 x7 D4 {2 A" v
      y_pred = (x*w+b)    # 预测2 w& p1 y4 b# \/ {
      y_pred.reshape(-1); X- ~  q1 ]. Y; g9 t  V5 U
    ; h; Q$ s/ o7 j
      loss = torch.square(y_pred - y).mean()   #计算 loss
    7 \6 R  t# [3 }8 O* |7 g% R  losses.append(loss)
    3 w  F6 r8 s6 N( b* n' t  & ~' Z/ E, X) u
      loss.backward() # autograd0 g2 J. U$ p! o- l! Y, k5 {
      with torch.no_grad():
    5 B8 {1 o8 m0 A3 G  J/ @    w  -= w.grad*0.0001   # 回归 w) U  [& z. L6 n1 M6 d
        b  -= b.grad*0.0001    # 回归 b
    5 V  g; w) s) ^3 O. i  w.grad.zero_()  2 X! p( O$ n: T, H4 p* [8 P- {+ s
      b.grad.zero_()$ G4 W$ u/ H0 K7 |5 W
    " a5 n) o6 A9 G$ A! {: U. {
    print(w.item(),b.item()) #结果3 I+ `% L7 F! b" o+ X9 o7 R. j
    9 T1 h  b9 k" ~9 T! ]$ e0 L! r
    Output: 27.26387596130371  0.4974517822265625
    * R) X5 x6 S! ?. @4 f9 `0 e. H----------------------------------------------6 t, ?" @5 d$ s2 P; r" r, c8 x
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    , C/ {' ~$ \) d/ x' ]+ `高手们帮看看是神马原因?7 u7 g! Y9 l8 \0 u! v8 n

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 8 q- Z( D) \+ n3 S5 n3 g8 m
    / B9 m( _8 F0 r! E
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    , f4 D8 }$ D: R7 a8 a% m) l-------. y. `3 e6 P  H! q! _1 }
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。4 l8 H* a7 N# d; H
    -------
    # B( X. M6 T7 a4 C6 |算法诊断部分,建议把循环次数改为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
    : I! S' {- [% X" }& i没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    # \  U' r. }6 J' Q: ~-------
    ! \$ [* e: p, y5 }; [, N不好意思, ...
    + N2 d7 B8 y/ t6 ~. ~+ \1 P. k  ?
    谢谢,算法应该没问题,就是最简单的线性回归。0 D4 A3 ?# n5 Q  a
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
      V6 `3 {* t! b" W% @
    雷达 发表于 2023-2-14 21:52. }! A0 H; a+ O
    谢谢,算法应该没问题,就是最简单的线性回归。
    ) }- k2 J" W% b  r8 b我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    , t. K/ x" z" X% j$ x1 w- e
    : o" {: ^) a1 _% r. t( I( x6 K刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ( b4 |' \# i+ n# U8 I( a
      P7 b& X+ s9 u$ ?或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 0 `* |( R, e6 s, ~8 T# \% p
    老福 发表于 2023-2-14 22:00
    . k7 c. }" t1 F刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。+ K5 i$ p3 `! m' A
    + [& }7 E" E9 y
    或者把b但的起点改为1试试。 ...

    ! _- b/ ^+ }4 x- J( ]
    " m* _; ^# }- S; K6 S: y0 r1 m你是对的。
    5 P2 w& ^0 r  \$ M去掉了随机部分6 A; N% P8 M: T. {
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    & {# l* F! F- j4 Wy = (x*27+15).reshape(-1)
    # G# X) Y: ~. D6 X0 n& S( s" S
    + N- t7 Z: I' z3 j循环次数加成10倍,就看到 b 收敛了
    8 V" Q3 {* Q" d& \2 hw , b+ j; W7 d* J- O; b/ {: e
    27.002620697021484 14.826167106628418! E2 q8 v0 I& H+ m; N

    ; A4 c! P6 l2 u! W! k7 D和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-3 16:14 , Processed in 0.055840 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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