什么是PyTorch?
PyTorch是一个基于Torch的Python机器学习库。它类似于numpy但具有强大的GPU支持。它由Facebook的AI Research Group于2016年开发.PyTorch提供动态计算图,以便您可以在autograd的帮助下随时修改图形。Pytorch在某些情况下比其他框架更快。本文先介绍PyTorch基础,最后将教你如何用PyTorch来分辨手写数字。
![9787b79f20eaece9faa71e514b2a93e2.png](https://i-blog.csdnimg.cn/blog_migrate/25dd1806f629a83ad28308265cd57621.jpeg)
出乎意料的容易,10分钟教你用AI库PyTorch识别手写数字
PyTorch的优点和缺点
好处
1. 简单库
PyTorch代码很简单。它很容易理解,您可以立即使用该库。例如,请查看下面的代码段:
![0ba311008953802771a0ad7a78aa1568.png](https://i-blog.csdnimg.cn/blog_migrate/aa3772306d8e0a9368cdc65271e6ef99.jpeg)
如上所述,您可以轻松定义网络模型,无需经过多少培训即可快速理解代码。
![1d1d1ef44eec3778d3cba149db2aadd5.png](https://i-blog.csdnimg.cn/blog_migrate/131676018cf19e2d63b6045f040dc00f.jpeg)
您可以轻松定义网络模型
2. 动态计算图
Pytorch提供动态计算图(DAG)。计算图是一种在图模型或理论(如节点和边)中表达数学表达式的方法。节点将进行数学运算,并且边缘是Tensor,它将被馈送到节点并在Tensor中携带节点的输出。
DAG是一种图形,可以保持任意形状,并且能够在不同的输入图形之间进行操作。每次迭代,都会创建一个新图形。因此,可以使用相同的图形结构或创建具有不同操作的新图形,或者我们可以将其称为动态图形。
3. 更好的性能
社区和研究人员,基准和比较框架,以了解哪一个更快。深度学习框架和GPU上的GitHub repo 报告说,PyTorch在每秒处理的图像方面比其他框架更快。
如下所示,使用vgg16和resnet152进行比较
![118be3e6a881b93def45d2ffaad81c33.png](https://i-blog.csdnimg.cn/blog_migrate/015ef5a201b71b412469b812da16599e.jpeg)
![b96ffc527d864f87e000c7c402e4874f.png](https://i-blog.csdnimg.cn/blog_migrate/afbb099bf26ff52c2cf8fc67d277d94c.jpeg)
4. 原生Python
PyTorch更基于python。例如,如果要训练模型,可以使用本机控制流(例如循环和递归),而无需添加更多特殊变量或会话以便能够运行它们。这对培训过程非常有帮助。
Pytorch还实现了Imperative Programming,更灵活。因此,可以在计算过程中打印出张量值。
使用PyTorch进行图像分类
学习深度学习基础知识的一种流行方法是使用MNIST数据集。它是深度学习中的"Hello World"。该数据集包含0-9的手写数字,总共60,000个训练样本和10,000个测试样本,这些样本已标记为28x28像素。
步骤1)预处理数据
在开始培训过程之前,您需要了解数据。在第一步中,您将使用torchvision模块加载数据集。Torchvision将加载数据集并根据网络的适当要求(例如形状和规范化图像)转换图像。
![0968b3bdbd72e92771c032cda13260e8.png](https://i-blog.csdnimg.cn/blog_migrate/3860ac048b5f1b3cebde1806722c28eb.jpeg)
变换函数将图像转换为张量并对值进行标准化。函数torchvision.transforms.MNIST将下载目录中的数据集(如果它不可用),必要时设置数据集以进行培训并执行转换过程。
要显示数据集,可以使用data_iterator获取下一批图像和标签。您可以使用matplot绘制这些图像及其相应的标签。正如您在下面看到的我们的图像和标签。
步骤2)网络模型配置
现在,您将为图像分类创建一个简单的神经网络。在这里,我们向您介绍在PyTorch中创建网络模型的另一种方法。我们将使用nn.Sequential来创建序列模型,而不是创建nn.Module的子类。
![c5bb9378ddb037f91337ce90e322b0ec.png](https://i-blog.csdnimg.cn/blog_migrate/4eef82ab78eeec6b7c44087e3831354e.jpeg)
这是我们网络模型的输出
![2c53aba0c667e4b9aedd261c4d35fa1d.png](https://i-blog.csdnimg.cn/blog_migrate/f05c8ba2a18acec1ca78b840c658796e.jpeg)
网络解释
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](https://i-blog.csdnimg.cn/blog_migrate/2918f7e1c15912582f29e250b4781b23.jpeg)
线性层将使用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](https://i-blog.csdnimg.cn/blog_migrate/1b0889b72d601317fbbbcf881f1583e2.jpeg)
在每个时代,枚举器将获得下一个输入元组和相应的标签。在我们将输入提供给网络模型之前,我们需要清除之前的渐变。这是必需的,因为在后向过程(反向传播过程)之后,将累积梯度而不是被替换。然后,我们将根据预期输出的预测输出计算损失。之后,我们将进行反向传播以计算梯度,最后,我们将更新参数。
这是培训过程的输出
[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](https://i-blog.csdnimg.cn/blog_migrate/13b461c672c302f1c5f8e18a0405edc3.jpeg)
![3f5ebf3c696d494d153e0b7db7d0c497.png](https://i-blog.csdnimg.cn/blog_migrate/c0d15f981b7ab0be7e8376e3f2c70cf9.jpeg)
有问题和资料关注公众号“python_dada"。