Pytorch Batchnorm слой отличается от Keras Batchnorm
Я пытаюсь скопировать предварительно обученные веса BN из модели Pytorch в эквивалентную модель Keras, но продолжаю получать разные результаты.
Я читаю документацию Keras и Pytorch BN и думаю, что разница заключается в том, как они вычисляют "среднее" и "var".
Pytorch:
Среднее значение и стандартное отклонение рассчитываются по размеру для мини-партий
источник: Pytorch BatchNorm
Таким образом, они усредняются по образцам.
Keras:
ось: целое число, ось, которая должна быть нормализована (обычно это ось объектов). Например, после слоя Conv2D с data_format="channel_first", установите axis=1 в BatchNormalization.
Источник: Keras BatchNorm
и здесь они усредняются по функциям (каналам)
Какой правильный путь? Как перенести веса BN между моделями?
0 ответов
Вы можете получить moving_mean
а также moving_variance
из running_mean
а также running_var
атрибуты модуля pytorch
# torch weights, bias, running_mean, running_var corresponds to keras gamma, beta, moving mean, moving average
weights = torch_module.weight.numpy()
bias = torch_module.bias.numpy()
running_mean = torch_module.running_mean.numpy()
running_var = torch_module.running_var.numpy()
keras_module.set_weights([weights, bias, running_mean, running_var])