Keras 中的 BatchNormalization 实现(TF 后端)- 激活之前还是之后?

den*_*129 2 deep-learning keras tensorflow batch-normalization

考虑以下代码片段

model = models.Sequential()
model.add(layers.Dense(256, activation='relu'))     # Layer 1
model.add(BatchNormalization())
model.add(layers.Dense(128, activation='relu'))     # Layer 2
Run Code Online (Sandbox Code Playgroud)

我正在使用带有 Tensorflow 后端的 Keras。

我的问题是 - 在 Keras 的实现中,BN 是在激活函数之前还是之后执行?

为了增加清晰度,

  1. BN 应该在激活之前还是之后应用存在争议,原始(Ioffe 和 Szegedy 2015)论文建议“之前”,但来自以下线程的评论显示了不同的意见。 批量标准化和辍学的顺序?

  2. 在 Keras 文档 ( https://keras.io/layers/normalization/ ) 中,它说“标准化每批上一层的激活,即应用保持平均激活接近 0 和激活标准偏差接近的转换到 1。”

Keras 的文档似乎表明 BN 在激活后应用(即在上面的示例代码中,BN 在第 1 层上的“relu”之后应用)。我想确认是否是这种情况?

另外,是否可以配置BN是在激活函数之前还是之后应用?

谢谢!

mlR*_*cks 10

BatchNorm之后或之前添加activation仍然是一个公开的辩论。作者建议的原始版本运行良好,并已在许多实现中使用。但是很多人发现激活后的BN确实效果很好,有助于更快的收敛。例如,查看线程中的讨论。

简而言之,这取决于任务!哪一个会表现得更好?你必须自己检查一下。是的,您可以控制订单。例如:

x = Conv2D(64, (3,3), activation=None)(inputs)
x = BatchNormalization()(x)
x = Activation("relu")(x)

Run Code Online (Sandbox Code Playgroud)

或者

x = Conv2D(64, (3,3), activation="relu")(inputs)
x = BatchNormalization()(x)
Run Code Online (Sandbox Code Playgroud)