欢迎访问宙启技术站
智能推送

使用torchvision.datasets进行计算机视觉任务的数据加载和预处理

发布时间:2023-12-27 16:50:18

torchvision.datasets是PyTorch库中的一个模块,用于加载和预处理计算机视觉任务中常用的数据集。它提供了许多常见的数据集,并自动进行了数据加载和转换操作,方便用户进行深度学习模型的训练和评估。

(torchvision.datasets目前支持的数据集请参考官方文档:https://pytorch.org/vision/stable/datasets.html)

下面以一个常见的图像分类任务为例,介绍如何使用torchvision.datasets进行数据加载和预处理。

首先,我们需要导入torchvision.datasets和torchvision.transforms模块:

import torchvision.datasets as datasets
import torchvision.transforms as transforms

接下来,我们可以使用datasets模块提供的API下载和加载常见的数据集。以CIFAR-10数据集为例:

# 定义数据预处理操作
transform = transforms.Compose([
    transforms.ToTensor(),  # 将图像转换为Tensor
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  # 归一化图像
])

# 加载CIFAR-10数据集
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)

# 创建数据加载器
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)

在上述代码中,我们首先定义了一个数据预处理操作transform,其中包括将图像转换为Tensor和归一化图像两个操作。然后调用datasets.CIFAR10函数下载并加载CIFAR-10数据集,并将预处理操作传递给transform参数。

接着,我们使用torch.utils.data.DataLoader创建了用于训练和测试的数据加载器。其中,train_loader用于训练集,每次返回64个样本;test_loader用于测试集,每次返回64个样本。

之后,我们就可以使用train_loader和test_loader进行深度学习模型的训练和评估了。例如,我们可以使用一个简单的卷积神经网络对CIFAR-10进行分类:

import torch
import torch.nn as nn
import torch.optim as optim

# 定义简单的卷积神经网络模型
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)
        self.relu = nn.ReLU()
        self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)
        self.fc = nn.Linear(32 * 8 * 8, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = self.relu(x)
        x = self.maxpool(x)
        x = self.conv2(x)
        x = self.relu(x)
        x = self.maxpool(x)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        return x

# 创建模型实例
model = SimpleCNN()

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)

# 训练模型
for epoch in range(10):
    running_loss = 0.0
    for i, data in enumerate(train_loader, 0):
        # 获取输入和标签
        inputs, labels = data

        # 梯度清零
        optimizer.zero_grad()

        # 正向传播和反向传播
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # 统计损失值
        running_loss += loss.item()
        if i % 100 == 99:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))
            running_loss = 0.0

print('Training finished.')

# 在测试集上评估模型
correct = 0
total = 0
with torch.no_grad():
    for data in test_loader:
        inputs, labels = data
        outputs = model(inputs)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy on test set: %.2f %%' % (100 * correct / total))

在上述代码中,我们首先定义了一个简单的卷积神经网络模型SimpleCNN,包含了两个卷积层和一个全连接层。然后定义了损失函数和优化器。接着进行模型的训练,每个epoch中遍历训练集的数据并进行前向传播、反向传播和参数更新。最后,在测试集上评估模型的准确率。

以上就是使用torchvision.datasets进行计算机视觉任务的数据加载和预处理的示例。通过使用datasets模块,我们能够方便地下载和加载常见的数据集,并进行各种预处理操作,加速深度学习模型的训练和评估。同时,结合torch.utils.data.DataLoader可以实现数据的批处理和并行加载,进一步提升训练和评估的效率。