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])
Другие вопросы по тегам