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

我正在尝试对 CIFAR10 数据集使用预训练的 alexnet 模型,但它总是将所有内容预测为同一类。我使用完全相同的代码,除了使用未经训练的 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')

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

回答1

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

CIFAR10 是一个 10 类数据集。

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

我发现 Vaibhav Kumar 博士的 https://analyticsindiamag.com/implementing-alexnet-using-pytorch-as-a-transfer-learning-model-in-multi-class-classification/ 应该解释如何做到这一点。

相似文章

python - 如何获取 Pytorch 中每一层的时间?

我想知道Alexnet中某一层的推理时间。此代码测量Alexnet的第一个全连接层的推理时间,因为批量大小发生变化。我对此有几个问题。是否可以使用以下代码准确测量推理时间?是否因为CPU和GPU分开运...