我在哪里调用 Keras 中的 BatchNormalization 函数?

新手上路,请多包涵

如果我想在Keras中使用BatchNormalization函数,那么是否只需要在开始时调用一次?

我为此阅读了此文档:http: //keras.io/layers/normalization/

我不知道我应该在哪里打电话。下面是我尝试使用它的代码:

 model = Sequential()
keras.layers.normalization.BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None)
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(64, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(2, init='uniform'))
model.add(Activation('softmax'))

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)
model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose = 2)

我问是因为如果我在第二行运行代码,包括批量规范化,如果我在没有第二行的情况下运行代码,我会得到类似的输出。所以要么我没有在正确的地方调用函数,要么我猜它并没有太大的区别。

原文由 pr338 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 479
2 个回答

只是更详细地回答这个问题,正如 Pavel 所说,Batch Normalization 只是另一层,因此您可以使用它来创建所需的网络架构。

一般用例是在网络中的线性层和非线性层之间使用 BN,因为它对激活函数的输入进行归一化,以便您集中在激活函数的线性部分(例如 Sigmoid)。 这里 有一个小讨论

在你上面的例子中,这可能看起来像:


 # import BatchNormalization
from keras.layers.normalization import BatchNormalization

# instantiate model
model = Sequential()

# we can think of this chunk as the input layer
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.5))

# we can think of this chunk as the hidden layer
model.add(Dense(64, init='uniform'))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.5))

# we can think of this chunk as the output layer
model.add(Dense(2, init='uniform'))
model.add(BatchNormalization())
model.add(Activation('softmax'))

# setting up the optimization of our weights
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)

# running the fitting
model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose = 2)


希望这能让事情更清楚一点。

原文由 Lucas Ramadan 发布,翻译遵循 CC BY-SA 3.0 许可协议

该线程具有误导性。尝试评论 Lucas Ramadan 的回答,但我还没有合适的权限,所以我就把它放在这里。

批量归一化在激活函数之后效果最好,原因 在这里这里:它是为了防止内部协变量偏移而开发的。当一个层的 激活 分布在整个训练过程中发生显着变化时,就会发生内部协变量偏移。使用批归一化,以便特定层的输入(这些输入实际上是激活函数的结果)的分布不会因每个批次的参数更新而随时间改变(或者至少允许它改变)以有利的方式)。它使用批量统计进行归一化,然后使用批量归一化参数(原始论文中的 gamma 和 beta)“以确保插入网络中的转换可以表示身份转换”(引用自原始论文)。但关键是我们正在尝试规范化一个层的输入,所以它应该总是紧接在网络中的下一层之前。这是否在激活函数之后取决于所讨论的体系结构。

原文由 jmancuso 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题