我有两个keras模型。我将输出层连接到一个输出中。然后我在第二个模型中使用这个输出。然而,我不清楚如何规范我的数据。
正常化应该在什么时候发生?我在第一个模型之前进行规范化。我还尝试通过tf.keras.layers.LayerNormalization(axis=0)
和tf.keras.layers.BatchNormalization(axis=0)
进行归一化。但是什么时候应该添加这些?
我们非常感谢任何指导或资源。
def phi(lat_dim, feature_normaliser, activation):
model1 = keras.Sequential()
model1.add(feature_normaliser)
model1.add(layers.Dense(100,activation= activation))
model1.add(layers.Dense(lat_dim))
return model1
def rho(model1, learning_rate, activation):
model2 = keras.Sequential()
model2.add(model1)
model2.add(Lambda(lambda x: K.sum(x, axis=0,keepdims=True)))
#tf.keras.layers.BatchNormalization(axis=0)
model2.add(layers.Dense(100,activation= activation))
model2.add(layers.Dense(1))
model2.add(BatchNormalization())
model2.compile(
optimizer=tf.optimizers.SGD(learning_rate=learning_rate),
loss='mean_squared_error')
return model2
调用模型,结果为nan
:
feature_normaliser = layers.Normalization(input_shape=[10], axis=1,name='normaliser')
feature_normaliser.adapt(X_train)
phi_output = phi(5, feature_normaliser, 'relu')
rho_output = rho(phi_output, 0.0001, 'relu')
history_rho, rho_trained = Model_fit(rho_output,X_train,Y_train,X_val,Y_val, 128, 10)
print(history_rho.history['loss'][-1])
您可以在任何地方进行规范化。
但有两个重要的标准化:
- 输入";数据";应规范化(通常在模型之外(
- 输出";数据";应该规范化(通常在模型之外(,并且您的最终激活必须与此规范化兼容
BatchNormalization
几乎可以在任何地方使用,没有正确的答案。就像构建任何模型一样,使用BatchNormalization
是一门艺术。你可以测试,看看结果是否好,改变位置等等。
例如,您可以不规范化输入数据,而是在输入层后面放一个BatchNormalization
。这是有可能的。您可以在某些激活之前使用BatchNormalization
,以避免渐变消失和relu锁定。
一个模型中的几个BatchNormalziation
层可以使训练更快,但这不是"零";必要";。
警告:如果您使用Dropout
,请不要立即使用BatchNormalization
。它们不兼容,因为丢弃会改变数据分布(保持平均值,但会改变偏差(,而这种变化会在训练和验证之间产生差异,从而使规范化的工作方式不同。