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

Python中利用CIFARNet()模型进行图像分类的深度学习实验研究

发布时间:2023-12-15 09:22:25

CIFARNet是一个经典的深度学习模型,用于CIFAR-10图像分类任务。CIFAR-10数据集包含10个类别的60000个32x32彩色图像,每个类别有6000个图像。在这个任务中,我们需要训练一个模型来预测图像所属的类别。

下面是一个使用CIFARNet模型进行图像分类的深度学习实验研究的示例:

第一步:数据准备

首先,我们需要下载CIFAR-10数据集并将其分为训练集和测试集。你可以使用以下代码来完成这个步骤:

import torchvision
import torch

# 下载CIFAR-10数据集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True)

# 将训练集分为训练集和验证集
train_data = trainset.data[:45000]
train_labels = trainset.targets[:45000]
val_data = trainset.data[45000:]
val_labels = trainset.targets[45000:]

# 加载测试集
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True)
test_data = testset.data
test_labels = testset.targets

# 将数据集转换为torch张量并进行标准化
train_data = torch.tensor(train_data, dtype=torch.float32)/255
val_data = torch.tensor(val_data, dtype=torch.float32)/255
test_data = torch.tensor(test_data, dtype=torch.float32)/255

# 将标签转换为torch张量
train_labels = torch.tensor(train_labels, dtype=torch.int64)
val_labels = torch.tensor(val_labels, dtype=torch.int64)
test_labels = torch.tensor(test_labels, dtype=torch.int64)

第二步:模型定义和训练

接下来,我们需要定义CIFARNet模型并进行训练。你可以使用以下代码来完成这个步骤:

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

class CIFARNet(nn.Module):
    def __init__(self):
        super(CIFARNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
        self.fc1 = nn.Linear(128*4*4, 64)
        self.fc2 = nn.Linear(64, 10)
        self.relu = nn.ReLU()
        self.pool = nn.MaxPool2d(2, 2)

    def forward(self, x):
        x = self.relu(self.conv1(x))
        x = self.pool(x)
        x = self.relu(self.conv2(x))
        x = self.pool(x)
        x = self.relu(self.conv3(x))
        x = self.pool(x)
        x = x.view(-1, 128*4*4)
        x = self.relu(self.fc1(x))
        x = self.fc2(x)
        return x

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

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

# 训练模型
num_epochs = 10
batch_size = 100
train_size = train_data.size(0)
num_batches = train_size // batch_size

for epoch in range(num_epochs):
    running_loss = 0.0
    running_corrects = 0

    for batch_idx in range(num_batches):
        # 获取批量训练数据
        inputs = train_data[batch_idx*batch_size:(batch_idx+1)*batch_size]
        labels = train_labels[batch_idx*batch_size:(batch_idx+1)*batch_size]

        # 清空梯度
        optimizer.zero_grad()

        # 前向传播
        outputs = model(inputs)
        _, preds = torch.max(outputs, 1)

        # 计算损失
        loss = criterion(outputs, labels)

        # 反向传播和优化
        loss.backward()
        optimizer.step()

        # 统计损失和正确分类的数量
        running_loss += loss.item() * inputs.size(0)
        running_corrects += torch.sum(preds == labels.data)

    # 计算每个epoch的损失和准确率
    epoch_loss = running_loss / train_size
    epoch_acc = running_corrects.double() / train_size

    print('Epoch {}/{} - Loss: {:.4f} Acc: {:.4f}'.format(epoch+1, num_epochs, epoch_loss, epoch_acc))

第三步:模型评估和测试

最后,我们可以使用验证集和测试集对训练好的模型进行评估和测试。你可以使用以下代码来完成这个步骤:

# 模型评估
model.eval()
val_outputs = model(val_data)
_, val_preds = torch.max(val_outputs, 1)
val_acc = torch.sum(val_preds == val_labels.data).double() / val_labels.size(0)
print('Validation Acc: {:.4f}'.format(val_acc))

# 模型测试
model.eval()
test_outputs = model(test_data)
_, test_preds = torch.max(test_outputs, 1)
test_acc = torch.sum(test_preds == test_labels.data).double() / test_labels.size(0)
print('Test Acc: {:.4f}'.format(test_acc))

总结:

在这个深度学习实验研究中,我们使用CIFARNet模型对CIFAR-10图像进行分类任务。通过定义模型、训练模型和评估测试模型,我们可以得到训练过程的损失和准确率,并在验证集和测试集上评估模型的性能。

这个实验研究可以帮助我们了解深度学习模型的训练过程和性能评估方法,以及如何在实际任务中应用深度学习模型进行图像分类。