【发布时间】:2017-10-05 08:43:57
【问题描述】:
我有一个包含 2 列的数据集 - 每列包含一组文档。我必须将 Col A 中的文档与 Col B 中提供的文档进行匹配。这是一个有监督的分类问题。所以我的训练数据包含一个标签列,指示文档是否匹配。
为了解决这个问题,我创建了一组特征,比如 f1-f25(通过比较 2 个文档),然后针对这些特征训练一个二元分类器。这种方法效果很好,但现在我想评估这个问题的深度学习模型(特别是 LSTM 模型)。
我在 Python 中使用 keras 库。在浏览了在线可用的 keras 文档和其他教程后,我设法做到了以下几点:
from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Model
# Each document contains a series of 200 words
# The necessary text pre-processing steps have been completed to transform
each doc to a fixed length seq
main_input1 = Input(shape=(200,), dtype='int32', name='main_input1')
main_input2 = Input(shape=(200,), dtype='int32', name='main_input2')
# Next I add a word embedding layer (embed_matrix is separately created
for each word in my vocabulary by reading from a pre-trained embedding model)
x = Embedding(output_dim=300, input_dim=20000,
input_length=200, weights = [embed_matrix])(main_input1)
y = Embedding(output_dim=300, input_dim=20000,
input_length=200, weights = [embed_matrix])(main_input2)
# Next separately pass each layer thru a lstm layer to transform seq of
vectors into a single sequence
lstm_out_x1 = LSTM(32)(x)
lstm_out_x2 = LSTM(32)(y)
# concatenate the 2 layers and stack a dense layer on top
x = keras.layers.concatenate([lstm_out_x1, lstm_out_x2])
x = Dense(64, activation='relu')(x)
# generate intermediate output
auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(x)
# add auxiliary input - auxiliary inputs contains 25 features for each document pair
auxiliary_input = Input(shape=(25,), name='aux_input')
# merge aux output with aux input and stack dense layer on top
main_input = keras.layers.concatenate([auxiliary_output, auxiliary_input])
x = Dense(64, activation='relu')(main_input)
x = Dense(64, activation='relu')(x)
# finally add the main output layer
main_output = Dense(1, activation='sigmoid', name='main_output')(x)
model = Model(inputs=[main_input1, main_input2, auxiliary_input], outputs= main_output)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit([x1, x2,aux_input], y,
epochs=3, batch_size=32)
但是,当我在训练数据上对此进行评分时,我得到了相同的概率。所有情况的得分。问题似乎与输入辅助输入的方式有关(因为当我删除辅助输入时它会生成有意义的输出)。 我还尝试在网络的不同位置插入辅助输入。但不知何故,我无法让它工作。
任何指针?
【问题讨论】:
-
不确定这是否是有意的,但辅助输出仅为 (1,)。真的是你所期望的吗?合并 25 个辅助输入而只有一个结果? -- 辅助输出之前的模型是否旨在“不可训练”,而您只训练最后一部分?
-
嗯,是的。这是一个二元分类模型,因此最终输出为 (1,)。辅助输出应该不同吗?我只是输入额外的 25 个特征集作为辅助输入,因此是 (25,) 形状
-
你尝试过更多epochs吗?
标签: keras keras-layer