「@Author:Runsen」

图像识别本质上是一种计算机视觉技术,它赋予计算机“眼睛”,让计算机通过图像和视频“看”和理解世界。

在开始阅读本文之前,建议先了解一下什么是tensor、什么是torch.autograd以及如何在 PyTorch 中构建神经网络模型。

CIFAR-10 数据集

本教程使用具有 10 个类的CIFAR10 数据集:‘airplane’, ‘automobile’, ‘bird’, ‘cat’, ‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, 和‘truck’.

构建图像分类模型的 5 个步骤

  • 加载并标准化训练和测试数据

  • 定义卷积神经网络 (CNN)

  • 定义损失函数和优化器

  • 在训练数据上训练模型

  • 在测试数据上测试模型

首先,我们导入库matplotlibnumpy. 这些分别是绘图和数据转换的基本库。

import matplotlib.pyplot as plt # for plotting
import numpy as np # for transformationimport torch # PyTorch package
import torchvision # load datasets
import torchvision.transforms as transforms # transform data
import torch.nn as nn # basic building block for neural neteorks
import torch.nn.functional as F # import convolution functions like Relu
import torch.optim as optim # optimzer
  • torchvision 用于加载流行的数据集

  • torchvision.transforms 用于对图像数据进行变换

  • torch.nn 用于定义神经网络

  • torch.nn.functional 用于导入 Relu 等函数

  • torch.optim 用于实现优化算法,例如随机梯度下降 (SGD)

在加载数据之前,首先定义一个应用于 CIFAR10 数据集中的图像数据的转换器transform

#将多个变换组合在一起
transform = transforms.Compose( # to tensor object[transforms.ToTensor(), #  mean = 0.5, std = 0.5transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) # 设置 batch_size
batch_size = 4# 设置 num_workers
num_workers = 2# 加载train数据
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=num_workers)# 加载test数据
testset = torchvision.datasets.CIFAR10(root='./data', train=False,download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size,shuffle=False, num_workers=num_workers)# 10个label
classes = ('plane', 'car', 'bird', 'cat','deer', 'dog', 'frog', 'horse', 'ship', 'truck')

在上面代码,首先将想要的转换并将其放入括号列表中[]并将其传递给transforms.Compose()函数。这里有这两个转换:

  • ToTensor()

将 CIFAR10 数据集中的类型图像转换为由 Python 图像库 ( PIL ) 图像组成的张量,缩放到[0,1]

  • Normalize(mean, std)

mean 和 std 参数的参数数量取决于 PIL 图像的模式,由于PIL 图像是 RGB,这意味着它们具有三个通道——红色、绿色和蓝色,其范围是[0,1]。设置mean = 0.5, std = 0.5,基于归一化公式 : (x — mean) /std,最终得到[-1, 1] 的范围。

接下来,我们将一些训练图像可视化。

def imshow(img):img = img / 2 + 0.5 # unnormalizenpimg = img.numpy() # numpy objectsplt.imshow(np.transpose(npimg, (1, 2, 0)))plt.show()# 利用ITER函数获取随机训练图像
dataiter = iter(trainloader)
images, labels = dataiter.next()imshow(torchvision.utils.make_grid(images))# print the class of the image
print(' '.join('%s' % classes[labels[j]] for j in range(batch_size)))

「定义CNN模型」

class Net(nn.Module):def __init__(self):super(Net, self).__init__()# 3 input image channel, 6 output channels, # 5x5平方卷积核# in_channels = 3 因为我们的图像是 RGBself.conv1 = nn.Conv2d(3, 6, 5)# Max pooling over a (2, 2) windowself.pool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120)# 5x5 from image dimensionself.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))# 展平 conv 层的输出并将其提供给我们的全连接层x = x.flatten(1)# x = x.view(-1, 16 * 5 * 5)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return xnet = Net()
print(net)

定义一个损失函数和优化器

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

训练模型


start = torch.cuda.Event(enable_timing=True)
end = torch.cuda.Event(enable_timing=True)start.record()for epoch in range(2):  # loop over the dataset multiple timesrunning_loss = 0.0for i, data in enumerate(trainloader, 0):# get the inputs; data is a list of [inputs, labels]inputs, labels = data# zero the parameter gradientsoptimizer.zero_grad()# forward + backward + optimizeoutputs = net(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()# print statisticsrunning_loss += loss.item()if i % 2000 == 1999:    # print every 2000 mini-batchesprint('[%d, %5d] loss: %.3f' %(epoch + 1, i + 1, running_loss / 2000))running_loss = 0.0# whatever you are timing goes here
end.record()# Waits for everything to finish running
torch.cuda.synchronize()print('Finished Training')
print(start.elapsed_time(end))  # milliseconds

保存神经网络

# save
PATH = './cifar_net.pth'
torch.save(net.state_dict(), PATH)
# reload
net = Net()
net.load_state_dict(torch.load(PATH))

「在测试数据上测试模型」

dataiter = iter(testloader)
images, labels = dataiter.next()# print images
imshow(torchvision.utils.make_grid(images))
print('GroundTruth: ', ' '.join('%s' % classes[labels[j]] for j in range(4)))

下面Testing on 10,000 images

correct = 0
total = 0
with torch.no_grad():for data in testloader:images, labels = dataoutputs = net(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))

写在后面

我们的模型准确度得分很低,那么有什么方法可以提高它呢?

  • 调超参数

  • 使用不同的优化器

  • 图像数据增强

  • 尝试更复杂的架构,例如ImageNet 模型

  • 处理过拟合


往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑黄海广老师《机器学习课程》课件合集
本站qq群851320808,加入微信群请扫码:

【小白学习PyTorch教程】六、基于CIFAR-10 数据集,使用PyTorch 从头开始​​构建图像分类模型...相关推荐

  1. 【小白学习PyTorch教程】六、基于CIFAR-10 数据集,使用PyTorch 从头开始​​构建图像分类模型

    @Author:Runsen 图像识别本质上是一种计算机视觉技术,它赋予计算机"眼睛",让计算机通过图像和视频"看"和理解世界. 在开始阅读本文之前,建议先了解 ...

  2. 【小白学习tensorflow教程】二、TensorBoard可视化模型训练

    @Author:Runsen 本想在Torch和Keras更新TensorBoard,还是决定扔在了tensorflow. TensorBoard是用于可视化图形和其他工具以理解.调试和优化模型的界面 ...

  3. 【小白学习tensorflow教程】一、tensorflow基本操作、快速构建线性回归和分类模型

    @Author:Runsen TF 目前发布2.5 版本,之前阅读1.X官方文档,最近查看2.X的文档.tensorflow是非常强的工具,生态庞大. tensorflow提供了Keras的分支,这里 ...

  4. 微软todo使用教程_Todo教程可能很有趣-但是,这是从头开始构建自己的项目的方法...

    微软todo使用教程 There are many great tutorials that walk you through creating apps, from simple todo list ...

  5. 【小白学习keras教程】六、基于CIFAR-10数据集训练CNN-RNN神经网络模型

    @Author:Runsen 文章目录 Load Dataset 1.CNN-RNN 2.CNN-RNN-2 Load Dataset CIFAR-10 dataset import numpy as ...

  6. 【小白学习C++ 教程】六、C++内置函数和函数传参

    @Author:Runsen 文章目录 内置函数 函数 传递参数 形式参数(指针传递) 函数是一组一起执行一个任务的语句.每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都 ...

  7. 【小白学习keras教程】二、基于CIFAR-10数据集训练简单的MLP分类模型

    @Author:Runsen 分类任务的MLP 当目标(y)是离散的(分类的) 对于损失函数,使用交叉熵:对于评估指标,通常使用accuracy 数据集描述 CIFAR-10数据集包含10个类中的60 ...

  8. 【小白学习keras教程】五、基于reuters数据集训练不同RNN循环神经网络模型

    @Author:Runsen 文章目录 循环神经网络RNN Load Dataset 1. Vanilla RNN 2. Stacked Vanilla RNN 3. LSTM 4. Stacked ...

  9. 【小白学习Keras教程】四、Keras基于数字数据集建立基础的CNN模型

    @Author:Runsen 文章目录 基本卷积神经网络(CNN) 加载数据集 1.创建模型 2.卷积层 3. 激活层 4. 池化层 5. Dense(全连接层) 6. Model compile & ...

最新文章

  1. python 判断字典是否包含某个key,以及对应的value 值
  2. python网络爬虫工程师薪资-月薪2万的爬虫工程师,Python需要学到什么程度?
  3. linux wifi修改频率,Linux Custom CRDA WiFi regulatory.bin和40MHz BW 5GHz频...
  4. PyQt、QtDesigner及其它工具包的安装
  5. 使用nodejs对Marketing Cloud的contact主数据进行修改操作
  6. ShardingSphere(七) 读写分离配置,实现分库读写操作
  7. matplotlib.lines.Line2D
  8. Learning Python 012 函数式编程 1 高阶函数
  9. linux软盘镜像下载,软盘镜像Image文件制作(WinImage Pro)
  10. Vue中img的动态src不显示图片
  11. 祝贺swm8023刷HDU-Steps登顶+突破新Section,14.2不是传说中的高级计算几何,而是数学~~...
  12. 关于勒索软件的硬道理:我们还没有准备好,这是一场与新规则的斗争,而且它的影响还没有接近顶峰。
  13. 数仓模型设计详细讲解
  14. 网站被劫持到其它网站如何解决
  15. 使用ARD远程管理用户的Parental Control和Dock
  16. vmware安装win10 Stopcode: KMODE EXCEPTION NOT HANDLED
  17. 【转】码斗士的修炼之路 -- 如何保持并提升战斗力
  18. 阿里云智能总裁张建锋:“全面上云的拐点到了!”
  19. 程序员职场规划:你的命运不是一头骡子
  20. 【车牌识别和动态称重系统】(三)基于PyQt的UI设计

热门文章

  1. PHP 修改memory_limit方法
  2. CalendarExtender控件的中文显示问题
  3. 用JavaScript 控制input的值
  4. 使用装饰器配置路由的
  5. 分析解决Java运行时异常
  6. 抽取随即人员——SqlServer_Proc_Random
  7. 【python练习题】程序15
  8. js函数中的参数的个数
  9. [导入]《交互设计之路——让高科技产品回归人性》读书笔记(一)
  10. 如何发表自己的第一篇SCI?