【发布时间】:2018-02-02 23:06:19
【问题描述】:
我正在尝试将一个 LSTM 层的输出连同该层包含的文本一起输入另一个 LSTM 层。提供给两个 LSTM 的文本是不同的,我的目标是第二个 LSTM 在第一个 LSTM 理解的基础上提高对文本的理解。
我可以尝试像这样在 Tensorflow 中实现它:
# text inputs to the two LSTM's
rnn_inputs = tf.nn.embedding_lookup(embeddings, text_data)
rnn_inputs_2 = tf.nn.embedding_lookup(embeddings, text_data)
# first LSTM
lstm1Output, lstm1State = tf.nn.dynamic_rnn(cell=lstm1,
inputs=rnn_inputs,
sequence_length=input_lengths,
dtype=tf.float32,
time_major=False)
# second LSTM
lstm2Output, lstm2State = tf.nn.dynamic_rnn(cell=lstm2,
# use the input of the second LSTM and the first LSTM here
inputs=rnn_inputs_2 + lstm1State,
sequence_length=input_lengths_2,
dtype=tf.float32,
time_major=False)
这有一个问题,因为rnn_inputs_2 的大小是(batch_size, _, hidden_layer_size),而lstm1State 的大小是(batch_size, hidden_layer_size)。有谁知道我可以如何改变形状来完成这项工作,或者是否有更好的方法?
谢谢
【问题讨论】:
-
rnn_inputs_2形状中的_的解释是什么? -
@DavidParks 是输入句子/序列的最大长度。所以它是一个固定的数量,例如 100。
-
也许我很困惑,如果这样纠正我。但是根据您上面所说的,我认为您并不是要将隐藏状态添加到
rnn_inputs_2。我怀疑您的意思是将lstm1Output与rnn_inputs_2连接起来,它们都应该具有时间步长维度。如果你想将第一个 RNN 的状态提供给第二个 RNN,你应该通过指定第二个 RNN 的初始状态来做到这一点(如果你不指定这个,第二个 RNN 将从默认状态 0 开始)。我在这里步入正轨吗?您正在尝试做的事情的图表可能有助于理解和解释。 -
我可以将
lstm1Output与rnn_inputs_2连接起来,但我不确定这是否能达到我想要的效果。给 LSTM1 一个句子,假设它正确理解它,将帮助 LSTM2 理解它的句子。我试图根据 LSTM1 的理解找到一种提供 LSTM2 信息的方法。如果我将 LSTM1 的输出与 LSTM2 的输入连接起来,这会让 LSTM2 了解 LSTM1 吗?在 LSTM2 中使用 LSTM1 的隐藏状态会提供一种理解吗?我不太确定如何处理这个问题,如果你能多解释一下你的想法背后的直觉,那就太好了。 -
我明白了,您将 LSTM1 的隐藏状态解释为一个句子嵌入(理所当然)。现在,您希望将该句子嵌入作为先验知识传递到 LSTM2 中,它可以根据它做出决策。我描述对了吗?如果是这样,那么您似乎正在描述一个编码器/解码器模型,并向 LSTM2 添加了新输入。如果那是准确的,那么我的第一种方法是将 LSTM1 的隐藏状态作为 LSTM2 的初始状态传入。这比将其添加到每个 LSTM2 时间步的输入中要合乎逻辑。
标签: tensorflow nlp deep-learning lstm