Keras:合并/连接模型比单独模型表现最差模因识别

数据挖掘 机器学习 深度学习 喀拉斯 美国有线电视新闻网 lstm
2022-03-05 20:12:42

我有一个表情包数据集,我试图预测某个表情包是否是性别歧视,同时使用图像和文本。

现在我有两个模型,一个VGG16 fine tuned CNN用于图像和一个LSTM用于文本的模型,每个模型都带有Keras.

两个模型单独表现都很好(~0.8-0.9 准确度),我正在尝试合并它们,看看是否能得到更好的结果。

我像这样连接每个模型的输出:

CNN

input_tensor = layers.Input(shape=(image_size,image_size,3))

vgg_model = VGG16(input_tensor = input_tensor, weights = 'imagenet', include_top=False)

for layer in vgg_model.layers:
    layer.trainable = False

l2_strength = 1e-5
dropout_prob = 0.5

x = vgg_model.output
x = layers.Flatten(input_shape=vgg_model.output_shape[1:])(x)
x = layers.Dense(256, activation='relu', kernel_regularizer=regularizers.l2(l2_strength))(x)
x = layers.Dropout(dropout_prob)(x)
x = layers.Dense(64, activation='relu', kernel_regularizer=regularizers.l2(l2_strength))(x)

vgg_model = models.Model(vgg_model.input, x)

LSTM

input_text = layers.Input(shape=(1, 512))
x = layers.LSTM(32, dropout=0.5, name="LTSM")(input_text)
x = layers.Dense(10, kernel_initializer='normal', activation='relu')(x)

text_model = models.Model(input_text, x)
MERGED

x = layers.concatenate([vgg_model.output, text_model.output])
out = layers.Dense(1, activation='softmax', name='output_layer')(x)

merged_model = models.Model([vgg_model.input, text_model.input], out)

merged_model.compile(loss='binary_crossentropy', 
                     optimizer='adam', 
                     metrics=['accuracy'])

我像这样训练模型:

merged_model.fit(
    [train_image, train_text], 
    y = train_y, 
    epochs=50,
    batch_size=64,
    validation_split=0.2)

train_images图像和相关文本在哪里train_text,如果模因是否是性别歧视,标签是 1 或 0。

问题是两者trainvalidation准确率始终为 0.5,损失约为 8.0-9.0,并且在训练期间从未提高,因此无法学习,但奇怪的是,仅模型就提供了良好的性能。

我想知道是否有人遇到过同样的问题和/或您对为什么会发生这种情况有任何建议。

1个回答

我遇到了同样的问题,我通过添加BatchNormalization层解决了它。例如:

# create model ConvLSTM
input_convlstm = Input(name='convlstm', shape=(n_steps, 1, n_length, n_metadata))
branch_convlstm = BatchNormalization()(input_convlstm)
branch_convlstm = ConvLSTM2D(filters=64, kernel_size=(1,3), activation='tanh', input_shape=(n_steps, 1, n_length, n_metadata))(branch_convlstm)
branch_convlstm = Flatten()(branch_convlstm)
branch_convlstm = Dense(128, activation='tanh')(branch_convlstm)

# create model metadata
input_metadata = Input(name='metadata', shape=(21,))
branch_metadata = Dense(neurons[0], activation='tanh')(input_metadata)
branch_metadata = BatchNormalization()(branch_metadata)
branch_metadata = Dropout(dropout_rate)(branch_metadata)

# create final model
concat = Concatenate()([branch_convlstm, branch_metadata])
out = Dense(n_outputs, activation='softmax')(concat)
model = Model(inputs=[input_convlstm, input_metadata], outputs=out)