DL中的一个常见任务是将输入样本规范化为零均值和单位方差。您可以使用如下代码“手动”执行规范化:
mean = np.mean(X, axis = 0)
std = np.std(X, axis = 0)
X = [(x - mean)/std for x in X]但是,除了正在训练的Keras模型之外,还必须保持平均值和std值,以规范测试数据。既然平均值和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'))我希望你能理解我的意思。
发布于 2020-05-05 17:57:06
添加BatchNormalization作为第一层,它按预期工作,尽管与OP的示例不完全一样。您可以看到详细的解释这里。
OP的示例和批处理规范化都使用了在推理过程中输入数据的学习均值和标准差。但是OP的例子使用了一个简单的平均值,给每个训练样本相同的权重,而BatchNormalization层使用一个移动平均,它给最近看到的样本比旧的样本更多的权重。
重要的是,在培训期间,批处理规范化与OP示例的工作方式不同。在训练期间,该层使用当前一批输入的平均偏差和标准差来规范其输出。
第二个区别是OP的代码产生的输出平均值为零,标准差为1。相反,批归一化学习输出的均值和标准差,从而改善整个网络的损失。要获得OP示例的行为,应使用参数scale=False和center=False初始化批处理规范化。
发布于 2020-10-22 23:53:16
现在有一个用于此目的的Keras层,Normalization。在编写时,它位于实验模块keras.layers.experimental.preprocessing中。
在使用它之前,使用您想从其中派生出的数据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.发布于 2019-04-30 16:06:02
也许您可以使用sklearn.preprocessing.StandardScaler来缩放您的数据,这个对象允许您保存对象中的缩放参数,然后您可以在模型中使用Mixin输入,让我们说:
下面是一个链接https://www.pyimagesearch.com/2019/02/04/keras-multiple-inputs-and-mixed-data/
https://stackoverflow.com/questions/55924789
复制相似问题