Keras中输入数据的规范化

nom7f22z  于 2023-04-06  发布在  其他
关注(0)|答案(5)|浏览(224)

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

mean = np.mean(X, axis = 0)
std = np.std(X, axis = 0)
X = [(x - mean)/std for x in X]

然而,除了训练Keras模型之外,还必须保持mean和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'))

我希望你明白我的意思。

5lwkijsr

5lwkijsr1#

添加BatchNormalization作为第一层,它按预期工作,尽管不完全像OP的例子。你可以看到here的详细解释。
OP的示例和批处理归一化都在推理过程中使用输入数据的学习均值和标准差。但OP的示例使用简单的均值,为每个训练样本提供相等的权重,而BatchNormalization层使用移动平均值,为最近看到的样本提供比旧样本更多的权重。
重要的是,在训练过程中,批量归一化的工作方式与OP的示例不同。在训练过程中,层使用当前批量输入的均值和标准差对其输出进行归一化。
第二个区别是OP的代码生成的输出的均值为零,标准差为1。Batch Normalization学习输出的均值和标准差,以改善整个网络的损失。为了获得OP示例的行为,Batch Normalization应该使用参数scale=Falsecenter=False初始化。

at0kjp5o

at0kjp5o2#

现在有一个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.
db2dz4w8

db2dz4w83#

也许你可以使用sklearn.preprocessing.StandardScaler来缩放你的数据,这个对象允许你在一个对象中保存缩放参数,然后你可以使用Mixin类型输入到你的模型中,比方说:
1.您的_型号
1.[param1_scaler,param2_scaler]
这里是一个链接https://www.pyimagesearch.com/2019/02/04/keras-multiple-inputs-and-mixed-data/
https://keras.io/getting-started/functional-api-guide/

6rvt4ljy

6rvt4ljy4#

有一个BatchNormalization,它学习输入的平均值和标准差。我还没有尝试将它用作网络的第一层,但据我所知,它应该做一些非常类似的事情。

zed5wv10

zed5wv105#

您必须使用Normalization层。在运行模型之前,必须在具有总边界的数据上调用该层的adapt方法,以学习均值和方差。来自keras docs的示例:

>>> adapt_data = np.array([1., 2., 3., 4., 5.], dtype='float32')
>>> input_data = np.array([1., 2., 3.], dtype='float32')
>>> layer = tf.keras.layers.Normalization(axis=None)
>>> layer.adapt(adapt_data)
>>> layer(input_data)
<tf.Tensor: shape=(3,), dtype=float32, numpy=array([-1.4142135, -0.70710677, 0.], dtype=float32)>

此外,如果您知道数据的均值和方差,可以手动输入:

>>> layer = tf.keras.layers.Normalization(mean=3, variance=4)

注意:此层将输入转换为scale [-1 1]。如果有人知道如何转换为scale [0 1],请在这里分享。

相关问题