为什么我的输出在 pytorch 中使用预训练的 Alexnet 预测相同的标签?

Why is my output predicting the same label using pretrained Alexnet in pytorch?

我正在尝试为 CIFAR10 数据集使用预训练的 alexnet 模型,但它总是预测所有内容都是相同的 class。我使用完全相同的代码,除了使用未经训练的 alexnet 并且它按预期工作。为什么要这样做?

这是我的代码:

device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
net = models.alexnet(pretrained=True).to(device)

transform = transforms.Compose(
    [transforms.Resize((224, 224)),
     transforms.ToTensor(),
     transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))])

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

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

classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.005, momentum=0.9)

for epoch in range(3):  # loop over the dataset multiple times

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the inputs; data is a list of [inputs, labels]
        inputs, labels = data
        inputs, labels = inputs.to(device),labels.to(device)

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')
            running_loss = 0.0

print('Finished Training')

在代码之后我打印每个 class 的准确性。并将每个图像预测为一个平面。

Pytorch AlexNet 是在 ImageNet 上训练的,所以分类器是 1000 类。

CIFAR10 是一个 10 类 数据集。

您应该在使用 CIFAR10 进行训练之前创建一个新的分类器。

我发现这个 post 由 Vaibhav Kumar 博士撰写,应该解释如何这样做。