viv*_*ith 5 python optimization conv-neural-network pytorch
我正在 LeNet CNN 模型上训练 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)
Run Code Online (Sandbox Code Playgroud)
权重衰减机制对高值权重设置惩罚,即通过将权重总和乘以weight_decay
您给出的参数,将权重限制为相对较小的值。这可以看作是二次正则化项。
当传递大weight_decay
值时,你可能会过度限制你的网络并阻止它学习,这可能是它有 10% 准确率的原因,这与根本不学习并且只是猜测答案有关(因为你收到了 10 个类)当输出根本不是输入的函数时,为 acc 的 10%)。
解决方案是尝试不同的值,训练该区域的 或其他一些值weight_decay
。1e-4
请注意,当您达到接近零的值时,您应该得到更接近初始训练的结果,而不使用权重衰减。
希望有帮助。
归档时间: |
|
查看次数: |
3103 次 |
最近记录: |