我有一个表情包数据集,我试图预测某个表情包是否是性别歧视,同时使用图像和文本。
现在我有两个模型,一个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。
问题是两者train和validation准确率始终为 0.5,损失约为 8.0-9.0,并且在训练期间从未提高,因此无法学习,但奇怪的是,仅模型就提供了良好的性能。
我想知道是否有人遇到过同样的问题和/或您对为什么会发生这种情况有任何建议。