Keras 中输入数据的规范化
Normalization of input data in Keras
DL 中的一项常见任务是将输入样本归一化为零均值和单位方差。可以 "manually" 使用如下代码执行规范化:
mean = np.mean(X, axis = 0)
std = np.std(X, axis = 0)
X = [(x - mean)/std for x in X]
但是,除了要训练的 Keras 模型之外,还必须保持平均值和标准值,以标准化测试数据。既然 mean 和 std 是可学习的参数,也许 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'))
我希望你明白我的意思。
也许您可以使用 sklearn.preprocessing.StandardScaler
来缩放数据,
此对象允许您将缩放参数保存在对象中,
然后你可以使用 Mixin 类型输入到你的模型中,比方说:
- Your_model
- [param1_scaler, param2_scaler]
这里是linkhttps://www.pyimagesearch.com/2019/02/04/keras-multiple-inputs-and-mixed-data/
有BatchNormalization,它学习输入的均值和标准差。我没有尝试将它用作网络的第一层,但据我了解,它应该做一些与您正在寻找的非常相似的事情。
添加BatchNormalization as the first layer and it works as expected, though not exactly like the OP's example. You can see the detailed explanation here.
OP 的示例和批量归一化都在推理过程中使用输入数据的学习均值和标准差。但是 OP 的示例使用了一个简单的均值,为每个训练样本赋予了相同的权重,而 BatchNormalization 层使用了移动平均值,为最近看到的样本赋予了比旧样本更多的权重。
重要的是,批量归一化在训练期间的工作方式与 OP 的示例不同。在训练期间,该层使用当前批次输入的均值和标准差对其输出进行归一化。
第二个区别是 OP 的代码产生的输出均值为零,标准差为 1。 Batch Normalization 改为学习改善整个网络损失的输出的均值和标准差。要获得 OP 示例的行为,应使用参数 scale=False
和 center=False
.
初始化批归一化
现在有一个用于此目的的 Keras 层,Normalization
。在撰写本文时,它位于实验模块中,keras.layers.experimental.preprocessing
.
https://keras.io/api/layers/preprocessing_layers/core_preprocessing_layers/normalization/
在使用它之前,您可以使用要从中得出比例的数据 X
调用图层的 adapt
方法(即均值和标准差)。一旦你这样做了,比例就固定了(它在训练期间不会改变)。每当使用模型时(在训练和预测期间),比例就会应用于输入。
from keras.layers.experimental.preprocessing import Normalization
norm_layer = Normalization()
norm_layer.adapt(X)
model = keras.Sequential()
model.add(norm_layer)
# ... Continue as usual.
DL 中的一项常见任务是将输入样本归一化为零均值和单位方差。可以 "manually" 使用如下代码执行规范化:
mean = np.mean(X, axis = 0)
std = np.std(X, axis = 0)
X = [(x - mean)/std for x in X]
但是,除了要训练的 Keras 模型之外,还必须保持平均值和标准值,以标准化测试数据。既然 mean 和 std 是可学习的参数,也许 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'))
我希望你明白我的意思。
也许您可以使用 sklearn.preprocessing.StandardScaler
来缩放数据,
此对象允许您将缩放参数保存在对象中,
然后你可以使用 Mixin 类型输入到你的模型中,比方说:
- Your_model
- [param1_scaler, param2_scaler]
这里是linkhttps://www.pyimagesearch.com/2019/02/04/keras-multiple-inputs-and-mixed-data/
有BatchNormalization,它学习输入的均值和标准差。我没有尝试将它用作网络的第一层,但据我了解,它应该做一些与您正在寻找的非常相似的事情。
添加BatchNormalization as the first layer and it works as expected, though not exactly like the OP's example. You can see the detailed explanation here.
OP 的示例和批量归一化都在推理过程中使用输入数据的学习均值和标准差。但是 OP 的示例使用了一个简单的均值,为每个训练样本赋予了相同的权重,而 BatchNormalization 层使用了移动平均值,为最近看到的样本赋予了比旧样本更多的权重。
重要的是,批量归一化在训练期间的工作方式与 OP 的示例不同。在训练期间,该层使用当前批次输入的均值和标准差对其输出进行归一化。
第二个区别是 OP 的代码产生的输出均值为零,标准差为 1。 Batch Normalization 改为学习改善整个网络损失的输出的均值和标准差。要获得 OP 示例的行为,应使用参数 scale=False
和 center=False
.
现在有一个用于此目的的 Keras 层,Normalization
。在撰写本文时,它位于实验模块中,keras.layers.experimental.preprocessing
.
https://keras.io/api/layers/preprocessing_layers/core_preprocessing_layers/normalization/
在使用它之前,您可以使用要从中得出比例的数据 X
调用图层的 adapt
方法(即均值和标准差)。一旦你这样做了,比例就固定了(它在训练期间不会改变)。每当使用模型时(在训练和预测期间),比例就会应用于输入。
from keras.layers.experimental.preprocessing import Normalization
norm_layer = Normalization()
norm_layer.adapt(X)
model = keras.Sequential()
model.add(norm_layer)
# ... Continue as usual.