19 PyTorch 图像分类项目学习教程

19 PyTorch 图像分类项目学习教程

本文将带领你从零开始,使用 PyTorch 完成一个基本的图像分类项目。以下是项目结构和步骤:

1. 项目准备

1.1 环境搭建

首先,确保你的计算机上安装了以下依赖库:

1
pip install torch torchvision matplotlib

1.2 数据集选择

我们将使用 CIFAR-10 数据集。这个数据集由 10 个类的 60,000 张 32x32 彩色图像组成。

1.3 导入必要的库

1
2
3
4
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt

2. 数据加载

2.1 数据预处理

在加载数据之前,我们需要进行一些数据预处理,例如裁剪、缩放和标准化。

1
2
3
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

2.2 下载数据集

我们使用 torchvision 来下载 CIFAR-10 数据集。

1
2
3
4
5
6
7
8
9
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)

2.3 查看数据

让我们查看一些数据以了解数据集的结构。

1
2
3
4
5
6
7
8
9
10
11
dataiter = iter(trainloader)
images, labels = next(dataiter)

# 展示图像
def imshow(img):
img = img / 2 + 0.5 # 非标准化
plt.imshow(img.numpy().transpose((1, 2, 0)))
plt.show()

imshow(images[0])
print('Label:', labels[0].item())

3. 构建模型

我们将构建一个简单的卷积神经网络 (CNN)。

3.1 模型定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import torch.nn as nn
import torch.nn.functional as F

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()

4. 定义损失函数和优化器

4.1 设置损失函数和优化器

我们将使用交叉熵损失函数和随机梯度下降优化器。

1
2
3
4
import torch.optim as optim

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

5. 训练模型

5.1 训练循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for epoch in range(2):  # 训练 2 个 epoch
running_loss = 0.0
for i, data in enumerate(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(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')
running_loss = 0.0

print('Finished Training')

6. 测试模型

6.1 测试过程

1
2
3
4
5
6
7
8
9
10
11
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(f'Accuracy of the network on the 10000 test images: {100 * correct / total:.2f}%')

6.2 各类别的准确率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 获取所有类别的准确率
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.data, 1)
c = (predicted == labels).squeeze()
for i in range(4): # batch_size
label = labels[i]
class_correct[label] += c[i].item()
class_total[label] += 1

for i in range(10):
print(f'Accuracy of {classes[i]:5s} : {100 * class_correct[i] / class_total[i]:2.2f} %')

7. 小结

通过上述步骤,我们成功构建了一个简单的图像分类模型,使用 PyTorch 进行训练和测试。你可以进一步尝试改进模型,调整超参数,并使用其他更复杂的模型架构。

希望本教程对你学习 PyTorch 有所帮助!继续深入学习和实践,你将会有更深入的理解。

19 PyTorch 图像分类项目学习教程

https://zglg.work/pytorch-tutorial/19/

作者

AI教程网

发布于

2024-08-07

更新于

2024-08-10

许可协议