我正在嘗試對 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')
在代碼之后,我列印每個類的準確性。并且它將每個影像預測為一個平面。
uj5u.com熱心網友回復:
Pytorch AlexNet 是在 ImageNet 上訓練的,所以分類器有 1000 個類。
CIFAR10 是一個 10 類資料集。
在使用 CIFAR10 進行訓練之前,您應該創建一個新的分類器。
我發現 Vaibhav Kumar 博士的這篇文章應該解釋如何做到這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/479015.html
上一篇:TypeError:傳遞給引數“輸入”的值具有DataTypebool不在允許值串列中,將檔案中的資料傳遞給模型
下一篇:是否可以在PyTorch中的torch.nn.Sequential中的torch.nn.Flatten之后自動調整層的后續輸入?
