pytorch softmax_出乎意料的容易,10分钟教你用AI库PyTorch识别手写数字

什么是PyTorch?

PyTorch是一个基于Torch的Python机器学习库。它类似于numpy但具有强大的GPU支持。它由Facebook的AI Research Group于2016年开发.PyTorch提供动态计算图,以便您可以在autograd的帮助下随时修改图形。Pytorch在某些情况下比其他框架更快。本文先介绍PyTorch基础,最后将教你如何用PyTorch来分辨手写数字。

9787b79f20eaece9faa71e514b2a93e2.png

出乎意料的容易,10分钟教你用AI库PyTorch识别手写数字

PyTorch的优点和缺点

好处

1. 简单库

PyTorch代码很简单。它很容易理解,您可以立即使用该库。例如,请查看下面的代码段:

0ba311008953802771a0ad7a78aa1568.png

如上所述,您可以轻松定义网络模型,无需经过多少培训即可快速理解代码。

1d1d1ef44eec3778d3cba149db2aadd5.png

您可以轻松定义网络模型

2. 动态计算图

Pytorch提供动态计算图(DAG)。计算图是一种在图模型或理论(如节点和边)中表达数学表达式的方法。节点将进行数学运算,并且边缘是Tensor,它将被馈送到节点并在Tensor中携带节点的输出。

DAG是一种图形,可以保持任意形状,并且能够在不同的输入图形之间进行操作。每次迭代,都会创建一个新图形。因此,可以使用相同的图形结构或创建具有不同操作的新图形,或者我们可以将其称为动态图形。

3. 更好的性能

社区和研究人员,基准和比较框架,以了解哪一个更快。深度学习框架和GPU上的GitHub repo 报告说,PyTorch在每秒处理的图像方面比其他框架更快。

如下所示,使用vgg16和resnet152进行比较

118be3e6a881b93def45d2ffaad81c33.png
b96ffc527d864f87e000c7c402e4874f.png

4. 原生Python

PyTorch更基于python。例如,如果要训练模型,可以使用本机控制流(例如循环和递归),而无需添加更多特殊变量或会话以便能够运行它们。这对培训过程非常有帮助。

Pytorch还实现了Imperative Programming,更灵活。因此,可以在计算过程中打印出张量值。

使用PyTorch进行图像分类

学习深度学习基础知识的一种流行方法是使用MNIST数据集。它是深度学习中的"Hello World"。该数据集包含0-9的手写数字,总共60,000个训练样本和10,000个测试样本,这些样本已标记为28x28像素。

步骤1)预处理数据

在开始培训过程之前,您需要了解数据。在第一步中,您将使用torchvision模块加载数据集。Torchvision将加载数据集并根据网络的适当要求(例如形状和规范化图像)转换图像。

0968b3bdbd72e92771c032cda13260e8.png

变换函数将图像转换为张量并对值进行标准化。函数torchvision.transforms.MNIST将下载目录中的数据集(如果它不可用),必要时设置数据集以进行培训并执行转换过程。

要显示数据集,可以使用data_iterator获取下一批图像和标签。您可以使用matplot绘制这些图像及其相应的标签。正如您在下面看到的我们的图像和标签。

步骤2)网络模型配置

现在,您将为图像分类创建一个简单的神经网络。在这里,我们向您介绍在PyTorch中创建网络模型的另一种方法。我们将使用nn.Sequential来创建序列模型,而不是创建nn.Module的子类。

c5bb9378ddb037f91337ce90e322b0ec.png

这是我们网络模型的输出

2c53aba0c667e4b9aedd261c4d35fa1d.png

网络解释

1. 顺序是第一层是Conv2D层,输入形状为1,输出形状为10,内核大小为5

2. 接下来,您有一个MaxPool2D图层

3. ReLU激活功能

4. Dropout图层可以降低概率值。

5. 然后是第二个Conv2d,输入形状为10,最后一层,输出形状为20,内核大小为5

6. 接下来是MaxPool2d层

7. ReLU激活功能。

8. 之后,在将张量馈入"线性"图层之前,将展平张量

9. 线性层将使用softmax激活函数在第二个线性层映射我们的输出

be7cb865ba9dc2e0396626856ea6825b.png

线性层将使用softmax激活函数

步骤3)训练模型

在开始培训过程之前,需要设置标准和优化器功能。对于标准,您将使用CrossEntropyLoss。对于Optimizer,您将使用SGD,学习率为0.001,动量为0.9。

import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

正向过程将采用输入形状并将其传递给第一个conv2d层。然后从那里,它将被输入maxpool2d并最终进入ReLU激活功能。在第二个conv2d层中将发生相同的过程。之后,输入将被重新整形为(-1,320)并输入fc层以预测输出。

现在,您将开始培训过程。您将遍历我们的数据集2次或使用2的纪元,并打印每2000批次的当前损失。

81f1add294bdfb5e9078def08e04ce19.png

在每个时代,枚举器将获得下一个输入元组和相应的标签。在我们将输入提供给网络模型之前,我们需要清除之前的渐变。这是必需的,因为在后向过程(反向传播过程)之后,将累积梯度而不是被替换。然后,我们将根据预期输出的预测输出计算损失。之后,我们将进行反向传播以计算梯度,最后,我们将更新参数。

这是培训过程的输出

[1, 1] loss: 0.002 [1, 1001] loss: 2.302 [1, 2001] loss: 2.295 [1, 3001] loss: 2.204 [1, 4001] loss: 1.930 [1, 5001] loss: 1.791 [1, 6001] loss: 1.756 [1, 7001] loss: 1.744 [1, 8001] loss: 1.696 [1, 9001] loss: 1.650 [1, 10001] loss: 1.640 [1, 11001] loss: 1.631 [1, 12001] loss: 1.631 [1, 13001] loss: 1.624 [1, 14001] loss: 1.616 [2, 1] loss: 0.001 [2, 1001] loss: 1.604 [2, 2001] loss: 1.607 [2, 3001] loss: 1.602 [2, 4001] loss: 1.596 [2, 5001] loss: 1.608 [2, 6001] loss: 1.589 [2, 7001] loss: 1.610 [2, 8001] loss: 1.596 [2, 9001] loss: 1.598 [2, 10001] loss: 1.603 [2, 11001] loss: 1.596 [2, 12001] loss: 1.587 [2, 13001] loss: 1.596 [2, 14001] loss: 1.603

步骤4)测试模型

训练我们的模型后,您需要使用其他图像集进行测试或评估。我们将为test_loader使用迭代器,它将生成一批将传递给训练模型的图像和标签。将显示预测输出并与预期输出进行比较。

70858496a26b9e2224aeb104b9457319.png
3f5ebf3c696d494d153e0b7db7d0c497.png

有问题和资料关注公众号“python_dada"。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值