Как нормализовать сверточные веса в pytorch? - PullRequest
0 голосов
/ 01 мая 2019

У меня есть CNN в pytorch, и мне нужно нормализовать веса (фильтры) свертки с нормой L2 в каждой итерации. Какой самый эффективный способ сделать это?

По сути, в моем конкретном эксперименте мне необходимо заменить фильтры с их нормированным значением в модели (как во время обучения, так и во время тестирования).

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Я не уверен, правильно ли я понял ваш вопрос.Но если бы меня попросили нормализовать вес слоя NN на каждой итерации, я бы сделал что-то вроде следующего:

for ite in range(100): # training iteration

    # write your code to train your model
    # update the parameters using optimizer.step() and then normalize

    with torch.no_grad():
        model.conv.weight.div_(torch.norm(model.conv.weight, dim=2, keepdim=True)

Здесь model.conv относится к слою свертки модели. Пожалуйста, убедитесь, что вы правильно указали параметр dim в функции torch.norm().Для примера я просто установил 2.

Например, если вы используете Conv1d, тогда форма весовых параметров будет (out_channels, in_channels, kW), тогда вы можете установить dim=2.

0 голосов
/ 02 мая 2019

Очевидно, torch.norm() недостаточно быстро.

import torch
x = torch.randn(1024,100)
y = torch.randn(1024,100)

%timeit torch.sqrt((x - y).pow(2).sum(1))
%timeit torch.norm(x - y, 2, 1)

#outputs
129 µs ± 1.79 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
291 µs ± 17.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Также отметьте этот документ, который может дать вам идею использовать BatchNorm в ваших моделях.

...