专栏首页AI算法与图像处理CNN训练示例 | PyTorch系列(二十一)

CNN训练示例 | PyTorch系列(二十一)

文 |AI_study

原标题:CNN Training With Code Example - Neural Network Programming Course

  • 准备数据
  • 建立模型
  • 训练模型
    • 计算 loss,梯度并更新权重
  • 分析模型的结果

训练:前进传播之后我们要做的事情

在训练过程中,我们进行了前向传播 ,但是那又如何呢?我们假设我们得到了一个批次,并将其通过网络前向传递。一旦获得输出,我们就将预测输出与实际标签进行比较,并且一旦我们知道预测标签与实际标签的距离有多近,就可以通过网络中权重的近似值来估计网络中的权重到真实值(标签)。

所有这些都是针对单个批次的,我们将对每个批次重复此过程,直到涵盖训练集中的每个样本为止。在完成所有批次的此过程并传递训练集中的每个样本后,我们说一个epoch 已经完成。我们使用“ epoch”一词来表示一个涵盖整个训练集的时间段。

在整个训练过程中,我们会根据需要进行尽可能多的时期以达到我们期望的准确性水平。这样,我们可以执行以下步骤:

  1. 从训练集中获取batch。
  2. 将batch传递到网络。
  3. 计算loss (预测值和真实值之间的差)。
  4. 用网络权重计算loss 函数的梯度。
  5. 使用梯度更新权重以减少loss。
  6. 重复步骤1-5,直到完成一个epoch。
  7. 重复步骤1-6,以达到最小loss所需的epoch次数。

我们已经完全知道如何执行步骤1和2。如果已经学习了深度学习基础知识系列,那么您知道我们使用loss函数来执行步骤3,并且您知道我们使用反向传播和优化算法来执行执行步骤4和5。步骤6和7只是标准的Python循环(训练循环)。让我们看看如何在代码中完成此操作。

训练过程

由于我们在上一节禁用了PyTorch的梯度跟踪功能,因此我们需要确保将其重新打开(默认情况下处于打开状态)。

> torch.set_grad_enabled(True)
<torch.autograd.grad_mode.set_grad_enabled at 0x15b22d012b0>

前向传播的准备

我们已经知道如何获取一个批并将其通过网络前向传播。让我们看看前向传播完成后的操作。

我们将从以下内容开始:

  1. 创建我们的Network类的实例。
  2. 创建一个数据加载器,该数据加载器可从我们的训练集中提供大小为100的批次。
  3. 从这些批次之一中解压出图像和标签。
> network = Network()

> train_loader = torch.utils.data.DataLoader(train_set, batch_size=100)
> batch = next(iter(train_loader)) # Getting a batch
> images, labels = batch

接下来,我们准备通过网络向前传递我们的一批图像并获得输出预测。一旦我们有了预测张量,我们就可以使用预测和真实标签来计算损失。

一旦我们有损失,我们可以打印它,并检查正确的预测数量使用我们创建的前一篇文章的功能。

计算 Loss

为此,我们将使用PyTorch的nn.functional API中提供的cross_entropy() loss函数。一旦我们有了loss,我们就可以打印它,并使用我们创建的上一个帖子的功能检查正确的预测数。

> preds = network(images)
> loss = F.cross_entropy(preds, labels) # Calculating the loss

> loss.item()
2.307542085647583

> get_num_correct(preds, labels)
9

cross_entropy()函数返回一个标量值的张量,因此我们使用item()方法将loss打印为Python的数字。我们答对了100题中的9题,因为我们有10个预测类,这就是我们随机猜测的结果。

计算梯度

使用PyTorch计算梯度非常简单。因为我们的网络是一个PyTorch nn.Module,PyTorch在底层创建了一个计算图。当我们的张量沿着我们的网络向前流动时,所有的计算都加到图上了。然后PyTorch使用计算图计算loss函数相对于网络权值的梯度。

在我们计算梯度之前,让我们验证一下,我们的conv1层中目前没有梯度。梯度是每个层的权张量的grad (gradient的缩写)属性中可以得到的张量。

> network.conv1.weight.grad
None

为了计算梯度,我们调用loss 张量的backward()方法,如下:

loss.backward() # Calculating the gradients

现在,损失函数的梯度被存储在权重张量中。

> network.conv1.weight.grad.shape
torch.Size([6, 1, 5, 5])

优化器使用这些梯度来更新各自的权重。为了创建我们的优化器,我们使用了torch.optim 包,其中有许多优化算法实现,我们可以使用。我们将Adam 为例。

更新权重

对于Adam类构造函数,我们传递网络参数(这是优化器能够访问梯度的方式),并传递学习率。

最后,我们所要做的更新权值是告诉优化器使用梯度步进方向的是loss函数的最小值。

optimizer = optim.Adam(network.parameters(), lr=0.01)
optimizer.step() # Updating the weights

当调用step()函数时,优化器使用存储在网络参数中的梯度来更新权重。这意味着,如果我们再次通过网络传递相同的批数据,我们的损失应该会减少。检查这个,我们可以看到这确实是这样的情况:

> preds = network(images)
> loss.item()

> loss = F.cross_entropy(preds, labels)
2.262690782546997

> get_num_correct(preds, labels)
15

使用单个批进行训练

我们可以将单批训练的代码总结如下:

network = Network()

train_loader = torch.utils.data.DataLoader(train_set, batch_size=100)
optimizer = optim.Adam(network.parameters(), lr=0.01)

batch = next(iter(train_loader)) # Get Batch
images, labels = batch

preds = network(images) # Pass Batch
loss = F.cross_entropy(preds, labels) # Calculate Loss

loss.backward() # Calculate Gradients
optimizer.step() # Update Weights

print('loss1:', loss.item())
preds = network(images)
loss = F.cross_entropy(preds, labels)
print('loss2:', loss.item())

输出

loss1: 2.3034827709198
loss2: 2.2825052738189697

下一步是构建训练循环

我们现在应该对培训过程有一个很好的了解。在下一集中,我们将看到如何通过构建训练循环来完成这个过程来扩展这些想法。

英文原文链接是:

https://deeplizard.com/learn/video/0VCOG8IeVf8

本文分享自微信公众号 - AI算法与图像处理(AI_study),作者:AI_study

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CNN中的混淆矩阵 | PyTorch系列(二十三)

    原标题:CNN Confusion Matrix With PyTorch - Neural Network Programming

    AI算法与图像处理
  • PyTorch中CNN的Forward方法 | PyTorch系列(十七)

    我们通过扩展nn.Module PyTorch基类来创建网络,然后在类构造函数中将网络层定义为类属性。现在,我们需要实现网络的 forward() 方法,最后,...

    AI算法与图像处理
  • 被华为面试官吊锤,让我明白了很多

    1、HR联系,问了一些常见问题,比如为啥离职,啥能力咋样。然后给我发了一份题(108道左右),让我回去刷题,刷的差不多告诉她能够进行机试——也就是上机写代码

    AI算法与图像处理
  • 贾佳亚加盟腾讯优图后首次公开亮相:计算机视觉有哪三种打开方式?

    腾讯优图实验室杰出科学家贾佳亚,香港中文大学计算机科学工程系终身教授,于 2017 年 5 月 15 日公布消息,全职加入腾讯优图实验室,负责计算机视觉、图像处...

    AI科技评论
  • 向宇宙宣告:人类文明未来的信标(I)

    假如我们可以在太阳系周围放上信标(Beacon),这些信标能够在那里待上数十亿年,记录我们的文明历程。它们应该是什么样子?

    WolframChina
  • 民生银行牛新庄:大数据及分布式技术在银行系统中实践应用

    大家好,非常高兴来参加技术大会。我有一种重入江湖,回到江湖之中的感觉。当然了我刚才也听了前面大家的交流,我也是觉得特别的感触。

    数据和云
  • 学机器学习有必要懂数学吗?深入浅出机器学习与数学的关系

    小黑,Datawhale团队成员,秦时明月十年铁粉,本科就读于山西大学,保研至天津大学并硕博连读,现为2018级博士,研究方向:脑机接口。

    用户1564362
  • 【HTB系列】靶机Teacher的渗透测试详解

    第一个img元素多了一个onerror错误事件,意思是加载错误时在控制台输出(That‘s an F)

    徐焱
  • 红队技巧:绕过Sysmon检测

    Sysmon和Windows事件日志都是防御者中极为强大的工具。它们非常灵活的配置使他们可以深入了解设备上的活动,从而使检测攻击者的过程变得更加容易。出于这个原...

    FB客服
  • 人脑中1000亿个神经元正在指导AI的发展,未来我们甚至可以制造意识 | 专访诺奖得主和脑科学专家

    镁客网

扫码关注云+社区

领取腾讯云代金券