Как добавить термин регуляризации L2 в мою функцию потерь - PullRequest
0 голосов
/ 03 мая 2018

Я собираюсь сравнить разницу между регуляризацией и без нее, поэтому я хочу настроить две функции потерь.

Моя функция потерь с нормой L2:

enter image description here

###NET  
class CNN(nn.Module):
def __init__(self):
    super(CNN,self).__init__()
    self.layer1 = nn.Sequential(
        nn.Conv2d(3, 16, kernel_size = 5, padding=2),
        nn.ReLU(),
        nn.MaxPool2d(2))
    self.layer2 = nn.Sequential(
        nn.Conv2d(16, 32, kernel_size = 5, padding=2),
        nn.ReLU(),
        nn.MaxPool2d(2))
    self.layer3 = nn.Sequential(
        nn.Conv2d(32, 32, kernel_size = 5, padding=2),
        nn.ReLU(),
        nn.MaxPool2d(4))
    self.fc = nn.Linear(32*32*32,11)
def forward(self, x):
    out = self.layer1(x)
    out = self.layer2(out)
    out = self.layer3(out)
    out = out.view(out.size(0), -1)
    out = self.fc(out)
    return out

net = CNN()

###OPTIMIZER
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr = LR, momentum = MOMENTUM)

1.Как я могу добавить норму L2 в моей функции потерь?

2.Если я хочу написать функцию потерь самостоятельно (без использования optim.SGD) и выполнить автоматическое вычисление градаций, как я могу это сделать?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 02 января 2019

Вы можете явно вычислить норму весов самостоятельно и добавить ее к потере.

reg = 0
for param in CNN.parameters():
  reg += 0.5 * (param ** 2).sum()  # you can replace it with abs().sum() to get L1 regularization
loss = criterion(CNN(x), y) + reg_lambda * reg  # make the regularization part of the loss
loss.backward()  # continue as usuall

Подробнее см. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...