Python tensorflow中双向LSTM的输入

Python tensorflow中双向LSTM的输入,python,tensorflow,nlp,lstm,rnn,Python,Tensorflow,Nlp,Lstm,Rnn,通常,馈送至BiLSTM的所有输入均为形状[批次大小、时间步长、输入大小] 然而,我正在研究一个自动评分的问题,其中有一个额外的维度,称为每篇文章中的句子数。因此,在我的例子中,使用word2vec嵌入后的一个典型批次的形状是[2,16,25300] 这里,每批有2篇文章(batch\u size=2),每篇文章有16个句子,每个句子有25个单词长(time\u step=25),我使用的是300维的word2vec(input\u size=300) 很明显,我需要以某种方式在维度16上循环这

通常,馈送至BiLSTM的所有输入均为形状
[批次大小、时间步长、输入大小]

然而,我正在研究一个自动评分的问题,其中有一个额外的维度,称为每篇文章中的句子数。因此,在我的例子中,使用
word2vec
嵌入后的一个典型批次的形状是
[2,16,25300]

这里,每批有2篇文章
(batch\u size=2)
,每篇文章有16个句子,每个句子有25个单词长
(time\u step=25)
,我使用的是300维的word2vec
(input\u size=300)

很明显,我需要以某种方式在维度16上循环这个批处理,以便在每次迭代中输入的形状变成
[2,25300]
。我已经尝试了很长一段时间,但我还没有找到一个方法去做。例如,如果您在
tf.nn.bidirectional\u dynamic\u rnn()
上进行循环,它将在第二次迭代中给出错误,指出
tf.nn.bidirectional\u dynamic\u rnn()
内核已经存在。我不能直接为循环句子维度,因为这些是形状的张量[None,None,None,300],为了简单起见,我给出了值。如果有其他的方法吗?谢谢请注意,我没有使用
Keras
或任何其他框架

这里有一个示例编码层供参考

def bidirectional_lstm(input_data):
    cell = tf.nn.rnn_cell.LSTMCell(num_units=200, state_is_tuple=True)
    outputs, states  = tf.nn.bidirectional_dynamic_rnn(cell_fw=cell,
                                                       cell_bw=cell,
                                                       dtype=tf.float32,
                                                       inputs=input_data)
    return tf.concat(outputs,2)
嵌入式
的形状为
[2,16,25300]

这是一个示例输入

for batch_i, texts_batch in enumerate(get_batches(X_train, batch_size)): ## get_batches() is yielding batches one by one
  ## X_train is of shape [2,16,25] ([batch_size,sentence_length,num_words])

  ## word2vec
  embeddings = tf.nn.embedding_lookup(word_embedding_matrix, texts_batch)
  ## embeddings shape is now [2,16,25,300] ([batch_size,sentence_length,num_words,word2vec_dim])

  ## Now I need some kind of loop here to loop it over sentence dimension. Can't use for loop since these are all placeholders with dimensions None
  ## ??? output = bidirectional_lstm(embeddings,3,200,0.7) ??? This would be correct if there was no sentence dimension.

您可以将数据重塑为[2,16*25300]。因此,你的lstm可以一次从一篇文章中获得所有句子。如果您想在keras中输出每句话,那么有一个层包装器TimeDistributed,您可以在其中包装双向lstm层。我注意到你没有使用keras,但你可以看看代码,看看它是如何完成的。重塑是不可能的,因为这意味着把整篇文章当作一个大句子,而我做不到。我查看了
TimeDistributed
源代码,但不幸的是,它太复杂了,我无法理解。如果有人还有其他建议,请提出。谢谢