【PyTorch】深度学习实践之反向传播 Back Propagation

前馈计算

权重维度增加,层数增加,模型变得复杂

在这里插入图片描述

但是化简后仍是线性,因此增加层数意义不大

[图片]

引入激活函数,从而增加非线性

[图片]

反向传播计算梯度,使用链式法则
[图片]

[图片]

反向传播过程

[图片]

Tensor in PyTorch

Tenso(张量):PyTorch中存储数据的基本元素。
Tensor两个重要的成员,data和grad。(grad也是个张量)

课堂练习:线性模型 Linear Model

实现代码

import torch

# 已知数据:
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
# 线性模型为y = wx, 预测x = 4时, y的值

# 假设 w = 1
w = torch.Tensor([1.0])
w.requires_grad = True

# 定义模型:
def forward(x):
        return x*w

# 定义损失函数:
def loss(x,y):
        y_pred = forward(x)
        return (y_pred - y)**2

print("Prediction before training:",4,'%.2f'%(forward(4)))

for epoch in range(100):
        for x, y in zip(x_data,y_data):
                l = loss(x,y)
                l.backward() # 对requires_grad = True的Tensor(w)计算其梯度并进行反向传播,并且会释放计算图进行下一次计算
                print("\tgrad:%.1f %.1f %.2f" % (x,y,w.grad.item()))
                w.data = w.data - 0.01 * w.grad.data # 通过梯度对w进行更新
                w.grad.data.zero_() #梯度清零
        print("Epoch:%d, w = %.2f, loss = %.2f" % (epoch,w,l.item()))

print("Prediction after training:",4,'%.2f'%(forward(4)))
  • 本算法中反向传播主要体现在,l.backward()。调用该方法后w.grad由None更新为Tensor类型,且w.grad.data的值用于后续w.data的更新。
  • l.backward()会把计算图中所有需要梯度(grad)的地方都会求出来,然后把梯度都存在对应的待求的参数中,最终计算图被释放。
  • 取tensor中的data是不会构建计算图的。

结果

在这里插入图片描述

课后练习

1. 计算y=xw的梯度

在这里插入图片描述

2. 计算仿射模型y=xw+b的梯度

在这里插入图片描述

3. 使用计算图计算y=w1x^2+w2x+b的梯度

在这里插入图片描述

4. 使用Pytorch计算y=w1x^2+w2x+b的梯度

二次模型 Quadratic Model

在这里插入图片描述

代码如下:

import torch

# 已知数据:
x_data = [1.0,2.0,3.0]
y_data = [6.0,11.0,18.0]
# 线性模型为y = w1x²+w2x+b时, 预测x = 4时, y的值

# 假设 w = 1, b = 1
w1 = torch.Tensor([1.0])
w1.requires_grad = True
w2 = torch.Tensor([1.0])
w2.requires_grad = True
b = torch.Tensor([1.0])
b.requires_grad = True

# 定义模型:
def forward(x):
        return x*x*w1+x*w2+b

# 定义损失函数:
def loss(x,y):
        y_pred = forward(x)
        return (y_pred - y)**2

print("Prediction before training:",4,'%.2f'%(forward(4)))

for epoch in range(1000):
        for x, y in zip(x_data,y_data):
                l = loss(x,y)
                l.backward() # 对requires_grad = True的Tensor(w)计算其梯度并进行反向传播,并且会释放计算图进行下一次计算
                w1.data = w1.data - 0.02 * w1.grad.data # 通过梯度对w进行更新
                w2.data = w2.data - 0.02 * w2.grad.data
                b.data = b.data - 0.02 * b.grad.data
                # 梯度清零
                w1.grad.data.zero_()
                w2.grad.data.zero_() 
                b.grad.data.zero_()
        print("Epoch:%d, w1 = %.4f,w2 = %.4f,b = %.4f, loss = %.4f" % (epoch,w1,w2,b,l.item()))

print("Prediction after training:",4,'%.4f'%(forward(4)))

结果:

在这里插入图片描述


学习资料


系列文章索引

教程指路:【《PyTorch深度学习实践》完结合集】 https://www.bilibili.com/video/BV1Y7411d7Ys?share_source=copy_web&vd_source=3d4224b4fa4af57813fe954f52f8fbe7

  1. 线性模型 Linear Model
  2. 梯度下降 Gradient Descent
  3. 反向传播 Back Propagation
  4. 用PyTorch实现线性回归 Linear Regression with Pytorch
  5. 逻辑斯蒂回归 Logistic Regression
  6. 多维度输入 Multiple Dimension Input
  7. 加载数据集Dataset and Dataloader
  8. 用Softmax和CrossEntroyLoss解决多分类问题(Minst数据集)
  9. CNN基础篇——卷积神经网络跑Minst数据集
  10. CNN高级篇——实现复杂网络
  11. RNN基础篇——实现RNN
  12. RNN高级篇—实现分类
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zoetu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值