ResNet50 火炬视觉的实施在 CIFAR-10 上给出的精度较低



我是深度学习和PyTorch的新手。我在cifar10的火炬视觉模块中使用resnet-50模型。我已经从Torchvision导入了CIFAR-10数据集。测试的准确性非常低,我尝试配置分类层,但准确性没有变化。我的代码有问题吗?我在计算准确性时有误吗?

import torchvision
import torch
import torch.nn as nn
from torch import optim
import os
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
import numpy as np
from collections import OrderedDict
import matplotlib.pyplot as plt
transformations=transforms.Compose([transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406],[0.229, 0.224, 0.225])])
trainset=torchvision.datasets.CIFAR10(root='./CIFAR10',download=True,transform=transformations,train=True)
testset=torchvision.datasets.CIFAR10(root='./CIFAR10',download=True,transform=transformations,train=False)
trainloader=DataLoader(dataset=trainset,batch_size=4)
testloader=DataLoader(dataset=testset,batch_size=4)
inputs,labels=next(iter(trainloader))
labels=labels.float()
inputs.size()
print(labels.type())
resnet=torchvision.models.resnet50(pretrained=True)
if torch.cuda.is_available():
resnet=resnet.cuda()
inputs,labels=inputs.cuda(),torch.Tensor(labels).cuda()
outputs=resnet(inputs)
outputs.size()
for param in resnet.parameters():
param.requires_grad=False
numft=resnet.fc.in_features
print(numft)
resnet.fc=torch.nn.Sequential(nn.Linear(numft,1000),nn.ReLU(),nn.Linear(1000,10))
resnet.cuda()
resnet.train(True)
optimizer=torch.optim.SGD(resnet.parameters(),lr=0.001,momentum=0.9)
criterion=nn.CrossEntropyLoss()
for epoch in range(5):
resnet.train(True)
trainloss=0
correct=0
for x,y in trainloader:
x,y=x.cuda(),y.cuda()
optimizer.zero_grad()
yhat=resnet(x)
loss=criterion(yhat,y)
loss.backward()
optimizer.step()
trainloss+=loss.item()

print('Epoch: {} Loss: {}'.format(epoch,(trainloss/len(trainloader))))
accuracy=[]
running_corrects=0.0
for x_test,y_test in testloader:
x_test,y_test=x_test.cuda(),y_test.cuda()
yhat=resnet(x_test)
_,z=yhat.max(1)
running_corrects += torch.sum(y_test == z)
accuracy.append(running_corrects/len(testloader))
print(running_corrects/len(testloader))
accuracy=max(accuracy)
print(accuracy)

训练/测试后的输出

Epoch: 0 Loss: 1.9808503997325897
Epoch: 1 Loss: 1.7917569598436356
Epoch: 2 Loss: 1.624434965057373
Epoch: 3 Loss: 1.4082191940283775
Epoch: 4 Loss: 1.1343850775527955
tensor(1.1404, device='cuda:0')
tensor(1.1404, device='cuda:0')

我的几个观察:

  1. 您可能需要微调学习率、周期数和批大小。例如,目前您只训练了五个时期的模型,这可能不足以实现高精度。您可以尝试使用纪元的拉格值。
  2. 您是否尝试过通过设置"param.requires_grad=True"来调整数据集CIFAR10主干(特征提取器(模型?因为原始模型是在图像网络上训练的,可能需要适应CIFAR10。
  3. 在评估/测试之前,您可能希望设置resnet.train(False)resnet.eval(),以使模型知道您处于评估模式。此外,您可能希望在no_grad()范围内使用可加快推理时间并减少内存使用量with torch.no_grad():来评估模型。
  4. [CIFAR-10 是一个平衡数据集,因此在这里它是一个可选的 (EDA( 任务。您是否检查过CIFAR10的类分布,以确定它是否是不平衡的数据集?如果它是一个不平衡的数据集,你可能希望使用加权交叉熵来计算损失。还有其他策略可以解决阶级失衡问题,例如过度抽样或抽样不足。

关于测试准确性,您需要将正确预测的总数除以数据集中的样本总数,len(testloader.dataset)而不是len(testloader)。如果您希望精度在[0,100]范围内,只需乘以 100。您可以打印每个纪元的测试精度,以检查其变化情况,而您当前显示的是最大精度。

最新更新