设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 ( Y0 D- [0 ^+ O$ W9 x% r7 `0 Y% q

    9 t+ @# V& W  A) b, Q' D8 N为预防老年痴呆,时不时学点新东东玩一玩。
    6 x5 g: v3 r$ PPytorch 下面的代码做最简单的一元线性回归:$ d+ G2 e( w6 e' X7 P  S
    ----------------------------------------------
    1 D# q) o  P9 limport torch
    + D' Z$ X8 X* `& A) }import numpy as np
    5 \( Y5 X2 ~) y& ^9 c# O" Oimport matplotlib.pyplot as plt
    * k% ]. L+ G- Qimport random% D: F+ _: A$ U: ], B

    ( C- E, m. J: Y$ N) D2 K8 Vx = torch.tensor(np.arange(1,100,1))0 c0 \4 N- z8 ^) E0 [
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15' }2 I; i4 y2 J# [$ R

    ) h! r4 u  {9 P. O! N1 A" tw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    7 Z! L5 X/ P  y5 ]% u! O* Db = torch.tensor(0.,requires_grad=True)$ k" A) }. t+ m: C3 U/ w) a

    + l0 ?% t2 ]9 f: y0 U, Aepochs = 100
    5 {# [. t' p% e! ]  G# A, r8 c3 a' q6 Y0 v
    losses = []
    3 {" p  m) J% S9 N1 D, Ofor i in range(epochs):
    & n2 f, z! J" j  y_pred = (x*w+b)    # 预测
    . i, a4 Y6 d' |6 S9 Z- y' l  y_pred.reshape(-1)7 `& D& [( q+ F+ R- k. C

    / f7 d$ F+ O) m% b, O  loss = torch.square(y_pred - y).mean()   #计算 loss
    + S  h: E! m" }8 S  losses.append(loss). ^5 s3 H& B! ~
      
    & I# ?2 G6 I6 m$ b- `  loss.backward() # autograd
    6 q* ?/ T' U: N% q# [1 E- x: M' U* x' a  with torch.no_grad():2 Y( K9 ^% L! L% l3 ?, [
        w  -= w.grad*0.0001   # 回归 w& u, H5 z. I5 ]1 i* U
        b  -= b.grad*0.0001    # 回归 b
    / S- _& U1 j% a: y7 f$ g* s& g" J  w.grad.zero_()  8 U3 g* j6 c. {9 K
      b.grad.zero_()2 A+ i& N" _: v/ z3 u6 s* ]8 g
    + m( J; c% |2 o7 a. j1 e
    print(w.item(),b.item()) #结果8 m! |% _  r4 w/ l" ^0 N

    3 S5 S" N2 x4 i  DOutput: 27.26387596130371  0.49745178222656251 l& `7 \( O/ @
    ----------------------------------------------
    . c2 P* i/ p3 y最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    : f/ m* K- k6 N; y" `5 c6 K% {5 v高手们帮看看是神马原因?  c' W( ^5 r- Q0 q6 N) H

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 % `3 j6 U" v- |( B
    3 s$ ~6 k, r1 H8 [
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?" k/ [1 M2 I$ q$ w1 @" e6 k1 M
    -------0 S; Z% F$ v: B) `
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    ; g& p6 ?4 S$ ]' C$ t, Z-------4 o) [% ]* f3 p  c3 g
    算法诊断部分,建议把循环次数改为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
    2 M- |( ]7 v5 n% Z$ y2 u0 i没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?& U2 Y3 ?# {2 b5 \- @
    -------! C. S* }: o5 P: l
    不好意思, ...

    ! N6 c" s( G/ v+ }谢谢,算法应该没问题,就是最简单的线性回归。
    # a& l; I, _' s" t! r, B; d我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 . Z/ z5 B6 f6 I
    雷达 发表于 2023-2-14 21:52
    : e$ b. o# U$ g. h- O谢谢,算法应该没问题,就是最简单的线性回归。
    6 H2 g" y( [, w. Z2 P2 |我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    6 I! c; K& ?2 t- e" m" o. X" F: e7 k0 B+ T
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。) G8 c7 ]) I8 Y  G9 s$ X' d2 ^
    # b* K8 F1 g5 |0 i9 r
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    : Q, x, G, T* ]0 x
    老福 发表于 2023-2-14 22:00" O5 V8 u) {: C" ~$ s# o. l5 N+ y+ O8 k
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。! s* U' o+ o3 k" ~) E# b. m
    5 r6 h' M. i" @& r& b/ m9 n' f
    或者把b但的起点改为1试试。 ...

    4 I9 {9 ?' B3 a+ j! o/ u
    1 b8 _! d# e# T9 L你是对的。+ N- S) W* E$ K: }& R
    去掉了随机部分
    * O1 k3 J6 j0 b7 u' a+ Z#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    . D/ V# ~8 \; ?y = (x*27+15).reshape(-1)
    4 r# v3 A, a9 @. d4 A7 w5 K% R+ ~
    " {& [5 I3 @4 U) D循环次数加成10倍,就看到 b 收敛了
    ; r' W4 ~8 O, y$ [$ pw , b
    % s+ }, V2 S* A, P# J. A27.002620697021484 14.826167106628418
    ( V* H# _2 B6 t& o3 X$ a1 x* J5 o* W
    / s; f: E( b! N+ E7 W" e& r4 [+ o8 r9 ]和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-7 01:51 , Processed in 0.056913 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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