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模型可以用于各种图像分类任务,通过训练和验证可以评估模型的性能和准确率。
