使用两个神经网络进行归一化 - Tensorflow
Normalizing with two neural networks - Tensorflow
我有两个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
。它们不兼容,因为 dropout 改变了数据分布(保持均值,但改变了偏差)并且这种变化将在训练和验证之间产生差异,这将使标准化工作不同。
我有两个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
。它们不兼容,因为 dropout 改变了数据分布(保持均值,但改变了偏差)并且这种变化将在训练和验证之间产生差异,这将使标准化工作不同。