使用 Python 代码完成神经网络(ResNet)猫的十二分类,最终结果形式为形成一个 CSV 文件和可视化

本教程将演示如何使用 Python 和 ResNet 模型实现猫的 12 类分类,并生成预测结果 CSV 文件和训练过程的可视化。

1. 数据集

  • /kaggle/input/cat111/cat_12_train/cat_12_train:训练图像目录
  • /kaggle/input/cat111/cat_12_test/cat_12_test:测试图像目录
  • /kaggle/input/cat111/train_list.txt:训练图像文件列表,每行包含文件名和标签

2. 训练集和验证集

训练集将占 80%,验证集将占 20%。

3. 模型定义(ResNet)和训练

我们将使用预训练的 ResNet18 模型,并添加一个新的全连接层用于分类。

4. 结果可视化和预测可视化

最终将生成一个包含预测结果的 CSV 文件,并提供训练过程中损失和准确率的可视化图表。

由于数据集来源不清楚,我们无法提供完整的代码,但以下是一个基本的框架,可以帮助您开始构建自己的神经网络模型。

首先,需要导入必要的库:

import torch
import torch.nn as nn
import torch.optim as optim
import os
import numpy as np
from torchvision import transforms, datasets
import pandas as pd
import matplotlib.pyplot as plt

接下来,定义一些超参数,例如批次大小、学习率、迭代次数等:

batch_size = 32
learning_rate = 0.001
n_epochs = 10

然后,加载数据集并将其分成训练集和验证集:

data_transforms = {
    'train': transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'val': transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
}

train_list = pd.read_csv('/kaggle/input/cat111/train_list.txt', header=None, sep=' ')
train_list.columns = ['filename', 'label']
train_data = datasets.ImageFolder('/kaggle/input/cat111/cat_12_train/cat_12_train', transform=data_transforms['train'])
train_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size, shuffle=True)

val_data = datasets.ImageFolder('/kaggle/input/cat111/cat_12_test/cat_12_test', transform=data_transforms['val'])
val_loader = torch.utils.data.DataLoader(val_data, batch_size=batch_size, shuffle=True)

接下来,定义 ResNet 模型:

class ResNet(nn.Module):
    def __init__(self, num_classes=12):
        super(ResNet, self).__init__()
        self.resnet = torchvision.models.resnet18(pretrained=True)
        self.fc = nn.Linear(512, num_classes)

    def forward(self, x):
        x = self.resnet(x)
        x = self.fc(x)
        return x

model = ResNet()

然后,定义损失函数和优化器:

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

现在可以进行训练了:

train_losses = []
val_losses = []
train_accs = []
val_accs = []

for epoch in range(n_epochs):
    train_loss = 0.0
    val_loss = 0.0
    train_acc = 0.0
    val_acc = 0.0
    
    # training
    model.train()
    for i, (inputs, targets) in enumerate(train_loader):
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        loss.backward()
        optimizer.step()
        
        train_loss += loss.item() * inputs.size(0)
        _, preds = torch.max(outputs, 1)
        train_acc += torch.sum(preds == targets.data)
        
    train_loss /= len(train_loader.dataset)
    train_losses.append(train_loss)
    train_acc /= len(train_loader.dataset)
    train_accs.append(train_acc)
    
    # validation
    model.eval()
    with torch.no_grad():
        for inputs, targets in val_loader:
            outputs = model(inputs)
            loss = criterion(outputs, targets)
            
            val_loss += loss.item() * inputs.size(0)
            _, preds = torch.max(outputs, 1)
            val_acc += torch.sum(preds == targets.data)
            
        val_loss /= len(val_loader.dataset)
        val_losses.append(val_loss)
        val_acc /= len(val_loader.dataset)
        val_accs.append(val_acc)
        
    print('Epoch %d/%d, Train Loss: %.3f, Val Loss: %.3f, Train Acc: %.3f, Val Acc: %.3f'
         % (epoch+1, n_epochs, train_loss, val_loss, train_acc, val_acc))

最后,将预测结果保存为 CSV 文件并进行可视化。以下是一个示例:

# make predictions
model.eval()
test_data = datasets.ImageFolder('/kaggle/input/cat111/cat_12_test/cat_12_test', transform=data_transforms['val'])
test_loader = torch.utils.data.DataLoader(test_data, batch_size=batch_size, shuffle=False)

test_preds = []
with torch.no_grad():
    for inputs, _ in test_loader:
        outputs = model(inputs)
        _, preds = torch.max(outputs, 1)
        test_preds.extend(preds.tolist())

# save predictions as CSV
test_filenames = [os.path.basename(f) for f in test_data.imgs]
df = pd.DataFrame({'Filename': test_filenames, 'Prediction': test_preds})
df.to_csv('predictions.csv', index=False)

# plot losses and accuracies
fig, ax = plt.subplots(figsize=(8,6))
ax.plot(train_losses, label='Training Loss')
ax.plot(val_losses, label='Validation Loss')
ax.plot(train_accs, label='Training Accuracy')
ax.plot(val_accs, label='Validation Accuracy')
ax.legend()
plt.show()

原文地址: https://www.cveoy.top/t/topic/oEIC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录