【发布时间】:2019-02-12 12:54:42
【问题描述】:
我正在尝试将预训练的 BN 权重从 pytorch 模型复制到其等效的 Keras 模型,但我不断得到不同的输出。
我阅读了 Keras 和 Pytorch BN 文档,我认为不同之处在于它们计算“均值”和“变量”的方式。
火炬:
均值和标准差是按维度计算的 小批量
因此,它们对样本进行平均。
Keras:
axis:整数,应该归一化的轴(通常是 特征轴)。例如,在一个 Conv2D 层之后 data_format="channels_first",在 BatchNormalization 中设置axis=1。
在这里,它们对特征(通道)进行平均
什么是正确的方法?如何在模型之间传递 BN 权重?
【问题讨论】:
-
好吧,您可以对所有 PyTorch 方法进行平均,以获得与 Keras 值相当的值。对于标准偏差,这并不容易(标准偏差的平均值不一定等于所有通道的标准偏差),但天真的方法可能已经足够好了。这对你有用吗?
-
我将 Keras 激活从 (BHWC) 改造成 (BCHW) 并且它起作用了
-
你能发布你是如何用一个小代码sn-p解决的吗?您没有转置张量而是交换了轴对吗?
标签: python keras deep-learning pytorch batch-normalization