在张量流中输入到双向LSTM

时间:2018-08-13 07:28:22

标签: python tensorflow nlp lstm rnn

通常,提供给BiLSTM的所有输入的形状均为[batch_size, time_steps, input_size]

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

在这里,每批(batch_size=2)中有2篇文章,每篇文章有16个句子,每个句子长25个单词(time_step=25),而我使用的是大小为(input_size=300)的word2vec。

因此,很明显,我需要以某种方式在16维上循环此批处理,以便在每次迭代中输入的形状变为[2,25,300]。我已经尝试了很长时间,但一直没有找到解决方法。例如,如果您在tf.nn.bidirectional_dynamic_rnn()上进行循环,则第二次迭代将给出错误,表明tf.nn.bidirectional_dynamic_rnn()内核已存在。我不能直接在for上进行sentence_dimension循环,因为它们是形状[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)

embedded的形状为[2,16,25,300]

这是示例输入

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.

0 个答案:

没有答案