![](/img/trans.png)
[英]I created a CIFAR10 dataset learning model using a CNN model. Why is there an error?
[英]My train accuracy remains at 10% when I add weight_decay parameter to my optimizer in PyTorch. I am using CIFAR10 dataset and LeNet CNN model
我正在 LeNet CNN model 上訓練 CIFAR10 數據集。 我在 Google Colab 上使用 PyTorch。 只有當我使用 Adam 優化器和 model.parameters() 作為唯一參數時,代碼才會運行。 但是當我改變我的優化器或使用 weight_decay 參數時,精度在所有時期都保持在 10%。 我無法理解它發生的原因。
# CNN Model - LeNet
class LeNet_ReLU(nn.Module):
def __init__(self):
super().__init__()
self.cnn_model = nn.Sequential(nn.Conv2d(3,6,5),
nn.ReLU(),
nn.AvgPool2d(2, stride=2),
nn.Conv2d(6,16,5),
nn.ReLU(),
nn.AvgPool2d(2, stride=2))
self.fc_model = nn.Sequential(nn.Linear(400, 120),
nn.ReLU(),
nn.Linear(120,84),
nn.ReLU(),
nn.Linear(84,10))
def forward(self, x):
x = self.cnn_model(x)
x = x.view(x.size(0), -1)
x = self.fc_model(x)
return x
# Importing dataset and creating dataloader
batch_size = 128
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True,
transform=transforms.ToTensor())
trainloader = utils_data.DataLoader(trainset, batch_size=batch_size, shuffle=True)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True,
transform=transforms.ToTensor())
testloader = utils_data.DataLoader(testset, batch_size=batch_size, shuffle=False)
# Creating instance of the model
net = LeNet_ReLU()
# Evaluation function
def evaluation(dataloader):
total, correct = 0, 0
for data in dataloader:
inputs, labels = data
outputs = net(inputs)
_, pred = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (pred==labels).sum().item()
return correct/total * 100
# Loss function and optimizer
loss_fn = nn.CrossEntropyLoss()
opt = optim.Adam(net.parameters(), weight_decay = 0.9)
# Model training
loss_epoch_arr = []
max_epochs = 16
for epoch in range(max_epochs):
for i, data in enumerate(trainloader, 0):
inputs, labels = data
outputs = net(inputs)
loss = loss_fn(outputs, labels)
loss.backward()
opt.step()
opt.zero_grad()
loss_epoch_arr.append(loss.item())
print('Epoch: %d/%d, Test acc: %0.2f, Train acc: %0.2f'
% (epoch,max_epochs, evaluation(testloader), evaluation(trainloader)))
plt.plot(loss_epoch_arr)
權重衰減機制為高值權重設置了懲罰,即它通過將權重的總和乘以您給它的weight_decay
參數來限制權重以具有相對較小的值。 這可以看作是一個二次正則化項。
當傳遞大weight_decay
值時,您可能會過於嚴格地限制您的網絡並阻止它學習,這可能是它具有 10% 的准確率的原因,這與非學習有關並且只是猜測答案(因為您有 10 個類當 output 根本不是您輸入的 function 時,接收 10% 的 acc)。
解決方案是使用不同的值,訓練weight_decay
為1e-4
或該區域的其他一些值。 請注意,當您達到接近零的值時,您應該得到更接近初始訓練的結果,而不使用權重衰減。
希望有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.