训练分类器

目前为止,你已经知道如何定义神经网络、计算损失和更新网络的权重。现在你可能在想,那数据呢?

What about data?

通常,当你需要处理图像、文本、音频或者视频数据时,你可以使用标准Python包来将数据导入到numpy 数组中。然后再将数组转换成torch.Tensor

  • 对于图像,可用的包有:Pillow、OpenCV
  • 对于音频,可用的包有:scipy和librosa
  • 对于文本,无论是基于原始的Python或Cython的加载,或是NLTK和SpaCy都是可以的。
  • 对于视频数据,PyTorch提供一个名为torchvision的包,其中包含了常见数据集的数据加载器,像Imagenet、CIFAR10、MNISt等,以及图形数据转换器:torchvision.datasetstorch.utils.data.DataLoader

这提供了极大的便利,同时避免编写样板代码。

在本教程中,我们使用CIFAR10数据集。它包含的分类有:飞机、汽车、鸟、猫

鹿、狗、青蛙、马、船和卡车。CIFAR-10中的图像尺寸是3x32x32,即32x32像素大小的3通道彩色图像。

训练一个图像分类器

要训练一个图像分类器,我们需要按步骤执行以下操作:

  1. 使用torchvision加载和标准化CIFAR10训练和测试数据集
  2. 定义卷积神经网络
  3. 定义损失函数
  4. 使用训练数据训练网络
  5. 使用测试数据测试网络

1. 加载并标准化CIFAR10

使用torchvision很容易导入CIFAR10。

import torch
import torchvision
import torchvision.transforms as transforms

torchvision数据集的输出是范围在[0,1]之间的PILImage图像。我们需要将他们转换成标准化范围在[-1,1]之间的张量。

transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]
) trainset = torchvision.datasets.CIFAR10(
root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(
trainset, batch_size=4, shuffle=True, num_workers=2) testset = torchvision.datasets.CIFAR10(
root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(
testset, batch_size=4, shuffle=False, num_workers=2) classes = ('plane', 'car', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'trunk')

输出:

Downloading http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data/cifar-10-python.tar.gz
Files already downloaded and verified

下面我们查看下部分训练图像:

import numpy as np
import matplotlib.pyplot as plt def imshow(img):
# show an image
img = img / 2+0.5
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
plt.show() # 随机获取训练图像
dataiter = iter(trainloader)
images, labels = dataiter.next() # 输出图形
imshow(torchvision.utils.make_grid(images))
# 输出标签
print(' '.join('%5s' % classes[labels[j]] for j in range(4)))

输出:

 bird   dog   cat   car

2. 定义卷积神经网络

复制之前神经网络章节中的神经网络定义,并修改为3通道图像。

import torch.nn.functional as F
import torch.nn as nn class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16*5*5, 120)
self.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)))
x = x.view(-1, 16*5*5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x net = Net()

3. 定义损失函数和优化

使用分类交叉熵损失函数和动量随机梯度下降。

import torch.optim as optim

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

4. 训练网络

接下来就是有趣的部分了。我们只需要循环迭代我们的数据,将输入提供给网络并进行优化。

for epoch in range(2):
running_loss = 0.0 for i, data in enumerate(trainloader, 0):
# 获取输入值,data是一个[input,labels]的列表
inputs, labels = data # 初始化参数的梯度
optimizer.zero_grad() # 前向 + 反向 + 优化
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step() # 输出统计结构
running_loss += loss.item()
if i % 2000 == 1999:
print('[%d,%5d] loss: %.3f' % (epoch + 1, i+1, running_loss/2000))
running_loss = 0.0 print('Finished Trainning')

输出:

[1, 2000] loss: 2.142
[1, 4000] loss: 1.964
[1, 6000] loss: 1.973
[1, 8000] loss: 1.957
[1,10000] loss: 1.941
[1,12000] loss: 1.960
[2, 2000] loss: 1.995
[2, 4000] loss: 2.019
[2, 6000] loss: 1.979
[2, 8000] loss: 2.006
[2,10000] loss: 2.015
[2,12000] loss: 1.997
Finished Trainning

5. 使用测试数据测试网络

我们已经训练了两此网络。但是我们需要检查网络是否已经学到了什么。

我们可以通过神经网络输出的类标签来检查这一点,并结合实际情况进行检查。如果预测正确,我们就将样本添加到正确的预测列表中。

现在,第一步,我们先从测试集中显示一些图片来方便比较:

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

输出:

GroundTruth:    cat  ship  ship plane

现在,我们看下神经网络觉得我们的例子是什么:

outputs = net(images)

输出是由10个类别的得分。类别的得分越高,神经网络就会预测图像是那个类。所以,我们现在获取得分最高的索引:

_, predicted = torch.max(outputs, 1)

print('Predicted: ', ' '.join('%5s' % classes[predicted[j]] for j in range(4)))

输出:

Predicted:    car  ship trunk  plane

结果还不错。

接下来看看网络在整个测试集上的预测。

correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = 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))

输出:

Accuracy of the network on the 10000 test images: 27 %

结果显然比随机,10%的准确率(随机从10个类别中取一个),高很多。看起来网络是学到了东西的。

那么,哪些类别预测得好,哪些类别预测得不好呢:

class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10)) with torch.no_grad():
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs, 1)
c = (predicted == labels).squeeze() for i in range(4):
label = labels[i]
class_correct[label] += c[i].item()
class_total[label] += 1 for i in range(10):
print('Accuracy of %5s : %2d %%' %
(classes[i], 100*class_correct[i]/class_total[i]))

输出:

Accuracy of plane :  7 %
Accuracy of car : 53 %
Accuracy of bird : 9 %
Accuracy of cat : 2 %
Accuracy of deer : 57 %
Accuracy of dog : 41 %
Accuracy of frog : 3 %
Accuracy of horse : 38 %
Accuracy of ship : 33 %
Accuracy of trunk : 41 %

那么接下来做什么呢?在GPU上运行神经网络如何?

在GPU上训练

就像在CPU上训练张量一样,你可以将网络转移到GPU上。

如果我们有可用的CUDA的话,我们首先将我们的设备定义为第一个可见的cuda设备。

device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')

print(device)

输出:

cuda:0

接下来的章节假定device是CUDA设备。

然后这些方法将递归遍历所有的模型并将参数和缓冲区转换为CUDA张量:

net.to(device)

注意,你还必须将每一步的输入和目标也转移到GPU上:

inputs, labels = data[0].to(device),data[1].to(device)

[PyTorch入门之60分钟入门闪击战]之训练分类器的更多相关文章

  1. [PyTorch入门之60分钟入门闪击战]之入门

    深度学习60分钟入门 来源于这里. 本文目标: 在高层次上理解PyTorch的Tensor库和神经网络 训练一个小型的图形分类神经网络 本文示例运行在ipython中. 什么是PyTorch PyTo ...

  2. [PyTorch入门之60分钟入门闪击战]之神经网络

    神经网络 来源于这里. 神经网络可以使用torch.nn包构建. 现在你对autograd已经有了初步的了解,nn依赖于autograd定义模型并区分它们.一个nn.Module包含了层(layers ...

  3. [PyTorch入门之60分钟入门闪击战]之自动推倒

    AUTOGRAD: AUTOMATIC DIFFERENTIATION(自动分化) 来源于这里. autograd包是PyTorch中所有神经网络的核心.首先我们先简单地了解下它,然后我们将训练我们的 ...

  4. PyTorch 60 分钟入门教程

    PyTorch 60 分钟入门教程:PyTorch 深度学习官方入门中文教程 http://pytorchchina.com/2018/06/25/what-is-pytorch/ PyTorch 6 ...

  5. 【PyTorch深度学习60分钟快速入门 】Part0:系列介绍

      说明:本系列教程翻译自PyTorch官方教程<Deep Learning with PyTorch: A 60 Minute Blitz>,基于PyTorch 0.3.0.post4 ...

  6. 【PyTorch深度学习60分钟快速入门 】Part4:训练一个分类器

      太棒啦!到目前为止,你已经了解了如何定义神经网络.计算损失,以及更新网络权重.不过,现在你可能会思考以下几个方面: 0x01 数据集 通常,当你需要处理图像.文本.音频或视频数据时,你可以使用标准 ...

  7. 【PyTorch深度学习60分钟快速入门 】Part5:数据并行化

      在本节中,我们将学习如何利用DataParallel使用多个GPU. 在PyTorch中使用多个GPU非常容易,你可以使用下面代码将模型放在GPU上: model.gpu() 然后,你可以将所有张 ...

  8. 【PyTorch深度学习60分钟快速入门 】Part2:Autograd自动化微分

      在PyTorch中,集中于所有神经网络的是autograd包.首先,我们简要地看一下此工具包,然后我们将训练第一个神经网络. autograd包为张量的所有操作提供了自动微分.它是一个运行式定义的 ...

  9. 【PyTorch深度学习60分钟快速入门 】Part1:PyTorch是什么?

      0x00 PyTorch是什么? PyTorch是一个基于Python的科学计算工具包,它主要面向两种场景: 用于替代NumPy,可以使用GPU的计算力 一种深度学习研究平台,可以提供最大的灵活性 ...

随机推荐

  1. gcc -c xx.c 选项讲解

    -c选项表示编译.汇编指定的源文件(也就是编译源文件),但是不进行链接.使用-c选项可以将每一个源文件编译成对应的目标文件. 目标文件是一种中间文件或者临时文件,如果不设置该选项,gcc 一般不会保留 ...

  2. shell手册

    摘自雪松同学 0说明{ # shell实例手册最新下载地址: http://hi.baidu.com/quanzhou722/item/f4a4f3c9eb37f02d46d5c0d9 # pytho ...

  3. Eova 怎么放在 Docker中,使用阿里云流水线构建Eova!!

    Eova 快速开发框架不做过多解释,使用起来超级爽提高了我们的开发效率. 有要了解的可以去官网看下http://www.eova.cn/ 最近我们想在docker中运行并且使用阿里云的云效工具去构建部 ...

  4. Mysql数据库删除重复数据

    最近因为发现数据库中的表有脏数据,需要维护.这些脏数据就是重复数据,需要将其删除. 现假设有一张test表,主键字段为num,还有id,one,two三个字段.假设id规定只能有一条记录(即需要为id ...

  5. java中集合,数组,字符串相互转换

    数组转List String[] staffs = new String[]{"Tom", "Bob", "Jane"}; List sta ...

  6. 在win10下安装ubuntu双系统总结

    在打算装双系统前两天,我事先在网上买了一个16G大小的U盘,用来坐启动盘.后来发现其实有4G大小就远远足够的,16G的太浪费了,忘后来人吸取教训.呜呜呜.....下面给大家讲讲我的安装步骤: 参考文章 ...

  7. 大厂面试题:今天复试百度PHP工程师

    今天下午来到北京百度科技园进行复试PHP工程师岗位. 面试官问了很多问题,我大概整理回忆下: 1.Redis秒杀实现? redis队列解决抢购高并发的原理: 在程序跟数据库之前呢我们可以利用redis ...

  8. Django+ajax 返回json数据挨个显示在页面及页面和后台相互传值

    通过Ajax传到后台一个值,根据该值返回数据库表中的某一列的值,然后逐个显示到页面,并且给每个加上超链接,可以进行点击查看详细信息 1.通过Ajax传到后台一个值,红色部分为往Django后台传值,蓝 ...

  9. layui表格自动对齐

    正常情况table应该是这样展示的 但是却展示成了这样 格子没对齐,找了半天原因发现是在table.render中的cols参数多了一个"," 不细心一点真看不出来 正常结构应是 ...

  10. Traffic Network in Numazu

    Traffic Network in Numazu 题目描述 Chika is elected mayor of Numazu. She needs to manage the traffic in ...