深度学习中的一项常见任务是将输入样本标准化为零均值和单位方差。人们可以使用如下代码“手动”执行规范化:
mean = np.mean(X, axis = 0)
std = np.std(X, axis = 0)
X = [(x - mean)/std for x in X]
然而,除了训练 Keras 模型之外,还必须保留平均值和标准值,以标准化测试数据。既然平均值和标准差是可学习的参数,也许 Keras 可以学习它们?像这样的事情:
m = Sequential()
m.add(SomeKerasLayzerForNormalizing(...))
m.add(Conv2D(20, (5, 5), input_shape = (21, 100, 3), padding = 'valid'))
... rest of network
m.add(Dense(1, activation = 'sigmoid'))
我希望你明白我的意思。
Add 批量归一化 https://keras.io/layers/normalization/作为第一层,它按预期工作,尽管与OP的示例不完全一样。你可以看看详细的解释here https://keras.io/api/layers/normalization_layers/batch_normalization/.
OP 的示例和批量归一化都在推理过程中使用输入数据的学习平均值和标准差。但OP的示例使用了一个简单的平均值,为每个训练样本赋予相同的权重,而BatchNormalization层使用移动平均值,为最近看到的样本赋予比旧样本更多的权重。
重要的是,批量归一化在训练期间的工作方式与 OP 的示例不同。在训练期间,该层使用当前批次输入的平均值和标准差标准化其输出。
第二个区别是 OP 的代码产生均值为 0、标准差为 1 的输出。相反,批量归一化会学习输出的平均值和标准差,从而改善整个网络的损失。要获得 OP 示例的行为,应使用参数初始化批量归一化scale=False
and center=False
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)