1. 引言
图像识别是计算机视觉领域的重要应用之一,Kaggle平台的猫狗分类竞赛是一个非常有代表性的例子,本文将介绍如何使用pytorch完成这个竞赛的任务。
2. 数据准备
2.1 数据下载
在Kaggle平台上,我们可以下载到数据集,解压后得到train和test两个文件夹,train文件夹包含25000张训练集图片,test文件夹包含12500张测试集图片。为了使用pytorch来进行数据处理,我们需要将数据集格式处理成pytorch的Dataset和Dataloader格式。
2.2 数据预处理
我们需要将图片大小调整成合适的大小,并将图片数据存储到numpy数组中方便处理。这里我们将图片调整成224*224大小的正方形,并将每个像素点的值除以255,以将所有值控制在0-1之间。
import os
import numpy as np
from PIL import Image
from torch.utils.data import Dataset
class CatDogDataset(Dataset):
def __init__(self, data_folder, transform=None):
self.data_folder = data_folder
self.transform = transform
self.file_list = os.listdir(data_folder)
def __getitem__(self, index):
image_path = os.path.join(self.data_folder, self.file_list[index])
image = Image.open(image_path).convert('RGB')
image = image.resize((224, 224))
image = np.asarray(image, dtype=np.float32) / 255.0
if self.transform is not None:
image = self.transform(image)
label = 1 if 'dog' in self.file_list[index] else 0
return image, label
def __len__(self):
return len(self.file_list)
3. 模型搭建
3.1 网络结构选择
在进行图像分类的任务中,卷积神经网络是首选的网络结构之一。经过多次实验,我们选择使用ResNet-18作为我们的基础模型。ResNet是由微软研究院提出的一个深度网络结构,在传统卷积神经网络的基础上引入了残差模块,大大提高了网络深度的可训练性。
3.2 模型代码实现
我们在Pytorch中将ResNet-18网络结构构建出来,ResNet-18网络共包含18层,其中包括16个卷积层和2个全连接层。网络结构如下所示:
import torch.nn as nn
import torchvision.models as models
class ResNet18(nn.Module):
def __init__(self, num_classes=2):
super(ResNet18, self).__init__()
model = models.resnet18(pretrained=True)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, num_classes)
self.base_model = model
def forward(self, x):
x = self.base_model(x)
return x
4. 模型训练
我们使用Pytorch进行模型训练,训练过程我们使用Adam优化器,损失函数采用交叉熵。
import torch.optim as optim
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = ResNet18(num_classes=2)
model.to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
def train_model(model, dataloader, criterion, optimizer, num_epochs=5):
for epoch in range(num_epochs):
running_loss = 0
for inputs, labels in dataloader['train']:
inputs = inputs.to(device)
labels = labels.to(device)
optimizer.zero_grad()
# forward + backward + optimize
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item() * inputs.size(0)
epoch_loss = running_loss / len(dataloader['train'].dataset)
print('Epoch {}/{} Loss: {:.4f}'.format(epoch+1, num_epochs, epoch_loss))
return model
5. 模型测试
我们在测试集上进行模型测试,使用混淆矩阵评估模型的性能。
from sklearn.metrics import confusion_matrix
def test_model(model, dataloader):
model.eval()
y_true = []
y_pred = []
with torch.no_grad():
for inputs, labels in dataloader['test']:
inputs = inputs.to(device)
labels = labels.to(device)
# forward
outputs = model(inputs)
# predict
_, predicted = torch.max(outputs.data, 1)
y_true += labels.cpu().tolist()
y_pred += predicted.cpu().tolist()
cm = confusion_matrix(y_true, y_pred)
print('Confusion Matrix:\n{}'.format(cm))
test_model(model, dataloader)
6. 总结
本文介绍了如何使用pytorch完成kaggle猫狗分类竞赛,并给出了完整的代码实现。通过本文的学习,我们了解了如何使用pytorch来构建深度学习模型,并完成图像分类任务。