通常,提供给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.