DL中的一个常见任务是将输入样本归一化为零均值和单位方差。可以使用以下代码“手动”执行标准化:
mean = np.mean(X, axis = 0)
std = np.std(X, axis = 0)
X = [(x - mean)/std for x in X]
但是,除了要训练的Keras模型外,还必须保持均值和std值左右以标准化测试数据。由于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'))
希望您能理解我的意思。
答案 0 :(得分:4)
添加BatchNormalization作为第一层,尽管与OP的示例不完全相同,但它可以按预期工作。您可以查看详细说明here。
OP的示例和批归一化均使用推断过程中输入数据的学习平均值和标准偏差。但是OP的示例使用了一个简单的均值,使每个训练样本具有相同的权重,而BatchNormalization层使用的移动平均数赋予了最近看过的样本比旧样本更大的权重。
重要的是,在培训期间,批量归一化的工作方式不同于OP的示例。在训练过程中,该层使用当前批次输入的平均值和标准偏差对输出进行归一化。
第二个区别是OP的代码产生的输出的平均值为零,标准偏差为1。批次归一化可以学习输出的均值和标准差,从而改善整个网络的损耗。为了获得OP的示例的行为,应使用参数scale=False
和center=False
初始化批标准化。
答案 1 :(得分:1)
为此,现在有一个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.
答案 2 :(得分:0)
也许您可以使用sklearn.preprocessing.StandardScaler
来缩放数据,
该对象允许您将缩放参数保存在一个对象中,
然后,您可以在模型中使用Mixin类型的输入,可以这样说:
这里是链接https://www.pyimagesearch.com/2019/02/04/keras-multiple-inputs-and-mixed-data/
答案 3 :(得分:0)
有BatchNormalization,用于学习输入的均值和标准差。我没有尝试将其用作网络的第一层,但据我了解,它应该做的事情与您要寻找的非常相似。