Keras 中输入数据的规范化

Bjö*_*ist 8 normalization deep-learning keras

DL 中的一项常见任务是将输入样本归一化为零均值和单位方差。可以使用如下代码“手动”执行规范化:

mean = np.mean(X, axis = 0)
std = np.std(X, axis = 0)
X = [(x - mean)/std for x in X]
Run Code Online (Sandbox Code Playgroud)

但是,除了要训练的 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'))
Run Code Online (Sandbox Code Playgroud)

我希望你明白我在说什么。

Den*_*loe 7

现在有一个用于此目的的 Keras 层,Normalization. 在撰写本文时,它位于实验模块中keras.layers.experimental.preprocessing

https://keras.io/api/layers/preprocessing_layers/core_preprocessing_layers/normalization/

在使用它之前,您可以使用要从中导出比例的adapt数据(即平均值和标准差)调用图层的方法。X一旦执行此操作,比例就固定了(在训练期间不会改变)。然后,每当使用模型时(在训练和预测期间),该比例就会应用于输入。

from keras.layers.experimental.preprocessing import Normalization

norm_layer = Normalization()
norm_layer.adapt(X)
model = keras.Sequential()
model.add(norm_layer)
# ... Continue as usual.
Run Code Online (Sandbox Code Playgroud)


Wen*_*uka 5

添加BatchNormalization作为第一层,它按预期工作,尽管与 OP 的示例不完全一样。您可以在此处查看详细说明。

OP 的示例和批量归一化都在推理过程中使用输入数据的学习均值和标准差。但是 OP 的示例使用了一个简单的均值,该均值赋予每个训练样本相同的权重,而 BatchNormalization 层使用移动平均值,该平均值赋予最近看到的样本比旧样本更多的权重。

重要的是,批量标准化在训练期间的工作方式与 OP 的示例不同。在训练期间,该层使用当前批次输入的均值和标准差对其输出进行归一化。

第二个区别是 OP 的代码产生的输出均值为 0,标准差为 1。批量归一化改为学习输出的均值和标准差,从而改善整个网络的损失。要获得 OP 示例的行为,应使用参数scale=False和初始化批量标准化center=False

  • @JosiahYoder,批规范与OP的问题不同是正确的,但是您的“批规范层没有学习参数”的说法是错误的;批量归一化层学习其输出数据的尺度(平均 beta 和标准差 gamma)。事实上,这是批量归一化与 OP 描述的显着不同的主要原因之一。 (3认同)