本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身
公众号文章末尾有每日3问,感兴趣可以回答参加一下,第二天给出答案
在深度学习这个领域里,图像分类是个经典又很有挑战性的问题。它要求算法能准确地认出图像里的物体,还要把这些物体归到提前设定好的类别当中。本文会从理论出发,一直到实践,细致地对图像分类数据集进行分析,并且利用PyTorch框架构建一个相对简单的图像分类模型。
在使用PyTorch进行深度学习模型训练之前,需要对图像数据进行预处理和加载。这通常包括图像缩放、裁剪归一化等操作,以及数据集的划分(训练集验证集测试集)。 以下是一个运用PyTorch去加载CIFAR-10数据集的示例代码:
import torch
import torchvision
import torchvision.transforms as transforms
# 定义数据变换
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','truck')
展示训练集和测试集加载后的图像和标签。
在PyTorch里,能够利用nn.Module去搭建自定义的神经网络模型。以下便是一个较为简单的卷积神经网络(CNN)模型用以承担CIFAR-10图像的分类任务:
import torch.nn as nn
import torch.nn.functional as F
classNet(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)
defforward(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()
接下来,我们定义损失函数和优化器,并进行模型训练:
import torch.optim as optim
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
for epoch inrange(2):# 循环遍历数据集多次
running_loss =0.0
for i, data inenumerate(trainloader,0):
# 获取输入
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:# 每2000个小批量打印一次
print('[%d, %5d] loss: %.3f'%
(epoch +1, i +1, running_loss /2000))
running_loss =0.0
print('Finished Training')
训练过程中的损失值输出。
最后咱们用测试集去对模型的性能展开评估。下面就是在测试集上让模型运行并且计算准确率的代码:
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))
测试集上的准确率输出
本文深入解析了图像分类数据集在深度学习中的应用,并使用PyTorch框架实现了一个简单的卷积神经网络模型进行CIFAR-10图像分类任务。通过数据预处理,模型构建,训练与评估等步骤,我们得到了一个具有一定准确率的图像分类模型。未来能试着用更复杂的模型结构,用更大的数据集,还采用更优化的训练策略,来提升模型的性能。
问题: 1、减少batch_size(如减少到1)是否会影响读取性能?
2、数据迭代器的性能非常重要。当前的实现足够快吗?探索各种选择来改进它。
3、查阅框架的在线API文档。还有哪些其他数据集可用?
参考文献: 动手学深度学习在线课程
原文作者:讳疾忌医-note;如有侵权,请联系管理员删除。