CIFAR10 Python 图像分类全流程
时间: 2025-01-01 17:19:26 浏览: 7
### CIFAR10 数据集的 Python 图像分类完整流程教程
#### 导入必要的库
为了实现图像分类模型,首先需要导入所需的库。这通常包括用于数据处理、构建神经网络以及训练过程中的各种工具。
```python
import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np
```
这些库提供了加载数据集、预处理图片等功能的支持[^2]。
#### 加载并预处理 CIFAR10 数据集
接下来定义转换操作来标准化输入图像,并创建 `DataLoader` 对象以便于后续迭代访问批次化的样本:
```python
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
trainset = datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
testset = datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
trainloader = DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)
testloader = DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)
```
这里通过 `transforms.Compose()` 方法组合多个变换函数应用于每张图片上;而 `datasets.CIFAR10()` 和 `DataLoader()` 则分别负责下载/读取本地存储的数据文件和提供批量获取机制。
#### 定义卷积神经网络架构
对于图像识别任务来说,CNN 是非常有效的解决方案之一。下面给出一个简单的 CNN 类定义作为例子:
```python
class SimpleCNN(torch.nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
# 卷积层
self.conv1 = torch.nn.Conv2d(3, 6, kernel_size=(5, 5))
self.pool = torch.nn.MaxPool2d(kernel_size=2, stride=2)
self.conv2 = torch.nn.Conv2d(6, 16, kernel_size=(5, 5))
# 全连接层
self.fc1 = torch.nn.Linear(in_features=16 * 5 * 5, out_features=120)
self.fc2 = torch.nn.Linear(in_features=120, out_features=84)
self.fc3 = torch.nn.Linear(in_features=84, out_features=10)
def forward(self, x):
x = self.pool(torch.functional.F.relu(self.conv1(x)))
x = self.pool(torch.functional.F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5) # 展平多维数组
x = torch.functional.F.relu(self.fc1(x))
x = torch.functional.F.relu(self.fc2(x))
x = self.fc3(x)
return x
```
此部分展示了如何利用 PyTorch 构建自定义的 CNN 模型结构,其中包含了两层卷积层加最大池化层以及三层全连接层的设计思路[^4]。
#### 训练模型
有了之前准备好的数据集与设计完成后的网络之后就可以开始正式进入训练环节了:
```python
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = SimpleCNN().to(device=device)
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
for epoch in range(2): # 进行两次完整的遍历
running_loss = 0.0
for i, data in enumerate(trainloader, start=0):
inputs, labels = data[0].to(device), data[1].to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 2000 == 1999:
print(f'[Epoch {epoch + 1}, Batch {i + 1}] Loss: {running_loss / 2000:.3f}')
running_loss = 0.0
print('Finished Training')
```
上述代码片段实现了最基本的训练循环逻辑,在每次迭代过程中计算损失值并通过反向传播调整权重参数以优化目标函数。
#### 测试模型性能
最后一步是对测试集中未见过的新样例做出预测评估整体效果的好坏程度:
```python
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data[0].to(device), data[1].to(device)
outputs = model(images)
_, predicted = torch.max(outputs.data, dim=1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
accuracy = 100 * correct / total
print(f'Test Accuracy on Test Set: {accuracy}%')
```
这段脚本统计了正确分类的数量占总数的比例从而得出最终准确率指标用来衡量所建立起来的学习器泛化能力大小。
阅读全文