在前面的学习中,我们了解了卷积神经网络(CNN)的相关理论知识。现在,让我们通过一个实战案例,用Python代码来完成图像分类任务,深入体验CNN在图像分类中的应用。通过这个案例,你不仅能学会如何使用CNN完成图像分类任务,还能解决图像分类任务中模型准确率不高的问题。
目录
- 实操步骤
- 数据加载
- 模型训练
- 模型评估
- 总结
实操步骤
数据加载
在进行图像分类任务时,首先要做的就是加载数据。数据是模型训练的基础,合适的数据加载方式能提高模型训练的效率。
在Python中,我们可以使用torchvision库来加载常见的图像数据集,例如CIFAR - 10。以下是加载CIFAR - 10数据集的代码示例:
importtorchimporttorchvisionimporttorchvision.transformsastransforms# 定义数据预处理的转换操作transform=transforms.Compose([transforms.ToTensor(),# 将图像转换为Tensortransforms.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')在这段代码中,我们首先定义了数据预处理的转换操作,包括将图像转换为Tensor和归一化处理。然后使用torchvision.datasets.CIFAR10函数加载CIFAR - 10数据集,分为训练集和测试集。最后,使用torch.utils.data.DataLoader函数创建数据加载器,方便后续的批量训练和测试。
模型训练
数据加载完成后,接下来就是构建和训练CNN模型。我们可以使用torch.nn模块来构建CNN模型。以下是一个简单的CNN模型示例:
importtorch.nnasnnimporttorch.nn.functionalasFclassNet(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)returnx net=Net()在这个模型中,我们定义了两个卷积层conv1和conv2,用于提取图像的特征。然后使用最大池化层pool来减少特征图的尺寸。最后,通过三个全连接层fc1、fc2和fc3将特征图转换为分类结果。
接下来,我们需要定义损失函数和优化器,并进行模型训练:
importtorch.optimasoptim# 定义损失函数criterion=nn.CrossEntropyLoss()# 定义优化器optimizer=optim.SGD(net.parameters(),lr=0.001,momentum=0.9)# 训练模型forepochinrange(2):# 训练2个epochrunning_loss=0.0fori,datainenumerate(trainloader,0):# 获取输入数据inputs,labels=data# 梯度清零optimizer.zero_grad()# 前向传播 + 反向传播 + 优化outputs=net(inputs)loss=criterion(outputs,labels)loss.backward()optimizer.step()# 打印统计信息running_loss+=loss.item()ifi%2000==1999:# 每2000个小批量打印一次print(f'[{epoch+1},{i+1:5d}] loss:{running_loss/2000:.3f}')running_loss=0.0print('Finished Training')在这段代码中,我们使用交叉熵损失函数nn.CrossEntropyLoss和随机梯度下降优化器optim.SGD。然后进行2个epoch的训练,每个epoch中遍历训练集的所有小批量数据,进行前向传播、反向传播和参数更新。
模型评估
模型训练完成后,我们需要评估模型的性能。可以使用测试集来评估模型的准确率:
correct=0total=0withtorch.no_grad():fordataintestloader:images,labels=data outputs=net(images)_,predicted=torch.max(outputs.data,1)total+=labels.size(0)correct+=(predicted==labels).sum().item()print(f'Accuracy of the network on the 10000 test images:{100*correct/total}%')在这段代码中,我们遍历测试集的所有数据,使用训练好的模型进行预测,并统计预测正确的样本数和总样本数,最后计算模型的准确率。
总结
通过这个实战案例,我们完成了使用CNN进行图像分类任务的整个流程,包括数据加载、模型训练和评估。掌握了这些内容后,你能够使用CNN完成图像分类任务,并且可以通过调整模型结构、优化器参数等方法来解决图像分类任务中模型准确率不高的问题。
掌握了CNN在图像分类中的实战应用后,下一节我们将深入学习CNN的其他应用场景,进一步完善对本章卷积神经网络原理和应用主题的认知。