我想创建一个LSTM内存。 LSTM应该预测给定一个句子的长度为4的单编码值。第一步很容易。
下一步,我想做的是向数据集中添加其他信息。该信息是长度为5的一键编码矢量。
我的想法是在将数据传递给LSTM之前,将“嵌入”层与另一个“输入”形状连接起来。对我来说这是这样的:
main_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32', name='main_input')
embedding = Embedding(MAX_NB_WORDS, EMBEDDING_SIZE,
input_length=MAX_SEQUENCE_LENGTH)(main_input)
# second input model
auxiliary_input = Input(shape=(5,), name='aux_input')
x = concatenate([embedding, auxiliary_input])
lstm = LSTM(HIDDEN_LAYER_SIZE)(x)
main_output = Dense(4, activation='sigmoid', name='main_output')(lstm)
model = Model(inputs=[main_input, auxiliary_input], outputs=main_output)
但是,如果我尝试进行这样的设置,则会收到以下错误:ValueError:连续层需要输入的形状与concat轴一致,但形状匹配。得到了输入形状:[[None,50,128),(None,5)]
为我工作是创建一个嵌入层的LSTM并将其连接到辅助输入,但是之后我无法再运行LSTM(得到错误:ValueError:输入0与lstm_2层不兼容:预期ndim = 3,找到的ndim = 2)
所以我的问题是:用在keras中具有附加数据的嵌入层输入构建LSTM的正确方法是什么?
答案 0 :(得分:0)
似乎您在这里尝试传递有关完整序列(而不是每个令牌)的其他信息,这就是为什么您遇到不匹配问题的原因。
有几种解决此问题的方法,各有利弊
(1)您可以将aux_data
与lstm的最后一个输出连接起来,因此可以将concat_with_aux = concatenate([auxiliary_input,lstm])
连接起来,然后将此连接向量传递给您的模型。
这意味着如果您具有两个不同类别的相同序列,则LSTM的输出将是相同的,那么在级联之后,密集分类器的工作就是使用此级联结果来产生正确的输出。
(2)如果要直接在LSTM的输入处传递信息。例如,您可以为类别创建新的可训练的Embedding
层:
auxiliary_input = Input(shape=(1,), name='aux_input') # Now you pass the idx (0,1,2,3,4) not the one_hot encoded form
embed_categories = Embedding(5, EMBEDDING_SIZE,
input_length=1)(auxiliary_input)
x = concatenate([embed_categories, embedding])
这样一来,您的LSTM将以您的辅助信息为条件,并且两个具有不同类别的相同句子将具有不同的最后lstm输出。