【问题标题】:Pytorch Batchnorm layer different from Keras BatchnormPytorch Batchnorm 层不同于 Keras Batchnorm
【发布时间】:2019-02-12 12:54:42
【问题描述】:

我正在尝试将预训练的 BN 权重从 pytorch 模型复制到其等效的 Keras 模型,但我不断得到不同的输出。

我阅读了 Keras 和 Pytorch BN 文档,我认为不同之处在于它们计算“均值”和“变量”的方式。

火炬:

均值和标准差是按维度计算的 小批量

来源:Pytorch BatchNorm

因此,它们对样本进行平均。

Keras:

axis:整数,应该归一化的轴(通常是 特征轴)。例如,在一个 Conv2D 层之后 data_format="channels_first",在 BatchNormalization 中设置axis=1。

来源:Keras BatchNorm

在这里,它们对特征(通道)进行平均

什么是正确的方法?如何在模型之间传递 BN 权重?

【问题讨论】:

  • 好吧,您可以对所有 PyTorch 方法进行平均,以获得与 Keras 值相当的值。对于标准偏差,这并不容易(标准偏差的平均值不一定等于所有通道的标准偏差),但天真的方法可能已经足够好了。这对你有用吗?
  • 我将 Keras 激活从 (BHWC) 改造成 (BCHW) 并且它起作用了
  • 你能发布你是如何用一个小代码sn-p解决的吗?您没有转置张量而是交换了轴对吗?

标签: python keras deep-learning pytorch batch-normalization


【解决方案1】:

您可以从pytorch模块的running_meanrunning_var属性中检索moving_meanmoving_variance

# 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])

【讨论】:

    猜你喜欢
    • 2021-11-16
    • 2018-06-28
    • 1970-01-01
    • 2017-02-17
    • 2017-07-25
    • 2021-09-04
    • 2017-02-28
    • 2020-01-11
    • 2018-11-21
    相关资源
    最近更新 更多