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

Python语言实现的ResNet50模型训练与验证

发布时间:2023-12-11 03:33:07

ResNet50是一个深度残差网络模型,由微软研究院的研究人员提出。它是ResNet系列中的一个经典模型,具有50层的深度。ResNet50模型在ImageNet图像分类任务上的表现非常出色。

在Python语言中,使用PyTorch库可以方便地实现ResNet50的训练与验证。首先,我们需要准备训练数据和验证数据。可以使用PyTorch内置的ImageNet数据集,也可以使用其他数据集。在本例中,我们使用ImageNet数据集进行示范。

1. 导入所需的库和模块

import torch
import torchvision
import torchvision.transforms as transforms
import torchvision.models as models
import torch.nn as nn
import torch.optim as optim

2. 数据预处理

transform_train = transforms.Compose([
    transforms.RandomCrop(32, padding=4),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

transform_valid = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

trainset = torchvision.datasets.ImageNet(root='./data', train=True, download=True, transform=transform_train)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)

testset = torchvision.datasets.ImageNet(root='./data', train=False, download=True, transform=transform_valid)
testloader = torch.utils.data.DataLoader(testset, batch_size=128, shuffle=False, num_workers=2)

3. 定义ResNet50模型

net = models.resnet50(pretrained=False)
num_ftrs = net.fc.in_features
net.fc = nn.Linear(num_ftrs, 1000)

4. 设置损失函数和优化器

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4)

5. 训练模型

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
net.to(device)

for epoch in range(100):
    net.train()
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data[0].to(device), data[1].to(device)

        optimizer.zero_grad()

        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 100 == 99:  # 每100个batch打印一次loss
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 100))
            running_loss = 0.0

print('Finished Training')

6. 验证模型

correct = 0
total = 0
net.eval()  # 设置为评估模式
with torch.no_grad():
    for data in testloader:
        images, labels = data[0].to(device), data[1].to(device)
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy on the test images: %d %%' % (100 * correct / total))

以上就是使用Python语言实现ResNet50模型的训练与验证的示例代码。可以根据实际需求进行修改和调整,比如调整超参数、添加其他层等。ResNet50模型可以用于各种图像分类任务,通过训练和验证可以评估模型的性能和准确率。