用两个神经网络进行归一化-张量流



我有两个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。它们不兼容,因为丢弃会改变数据分布(保持平均值,但会改变偏差(,而这种变化会在训练和验证之间产生差异,从而使规范化的工作方式不同。

最新更新