如何在TensorFlow中处理具有可变长度序列的批次?
lstm
python
recurrent-neural-network
tensorflow
8
0

我试图使用RNN(特别是LSTM)进行序列预测。但是,我遇到了序列长度可变的问题。例如,

sent_1 = "I am flying to Dubain"
sent_2 = "I was traveling from US to Dubai"

我正在尝试使用一个基于该基准的简单RNN预测当前单词之后的下一个单词, 以构建PTB LSTM模型

但是, num_steps参数(用于展开到先前的隐藏状态)在每个Tensorflow的时代应保持不变。基本上,批处理句子是不可能的,因为句子的长度会有所不同。

 # inputs = [tf.squeeze(input_, [1])
 #           for input_ in tf.split(1, num_steps, inputs)]
 # outputs, states = rnn.rnn(cell, inputs, initial_state=self._initial_state)

在这里, num_steps需要为每个句子更改num_steps 。我已经尝试了几种方法,但是似乎没有任何效果。

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

您可以使用以下介绍的存储分区和填充思想:

序列到序列模型

同样,创建RNN网络的rnn函数接受参数sequence_length。

例如,您可以创建相同大小的句子存储桶,将它们填充必要的零,或使用占位符表示零个单词,然后将它们与seq_length = len(zero_words)一起提供。

seq_length = tf.placeholder(tf.int32)
outputs, states = rnn.rnn(cell, inputs, initial_state=initial_state, sequence_length=seq_length)

sess = tf.Session()
feed = {
    seq_length: 20,
    #other feeds
}
sess.run(outputs, feed_dict=feed)

还要看一下这个reddit线程:

具有``可变长度''序列的Tensorflow基本RNN示例

收藏
评论

您可以改用dynamic_rnn并通过将数组传递给sequence_length参数来指定每个序列的长度,甚至在一批内。示例如下:

def length(sequence):
    used = tf.sign(tf.reduce_max(tf.abs(sequence), reduction_indices=2))
    length = tf.reduce_sum(used, reduction_indices=1)
    length = tf.cast(length, tf.int32)
    return length

from tensorflow.nn.rnn_cell import GRUCell

max_length = 100
frame_size = 64
num_hidden = 200

sequence = tf.placeholder(tf.float32, [None, max_length, frame_size])
output, state = tf.nn.dynamic_rnn(
    GRUCell(num_hidden),
    sequence,
    dtype=tf.float32,
    sequence_length=length(sequence),
)

代码摘自该主题的完美文章 ,也请对其进行检查。

更新:关于dynamic_rnn vs rnn另一篇很棒的文章 ,您可以找到

收藏
评论

您可以限制输入序列的最大长度,将较短的序列填充到该长度,记录每个序列的长度,然后使用tf.nn.dynamic_rnn 。它照常处理输入序列,但是在序列的最后一个元素(由seq_length表示) seq_length ,它仅复制单元状态,并输出零张量。

收藏
评论

您可以使用以下主题中介绍的存储分区和填充思想

序列到序列模型

创建RNN网络的rnn函数也接受参数sequence_length。

例如,您可以创建相同大小的情感桶,将它们填充必要的零,或用占位符填充,代表零字,然后将它们与seq_length = len(zero_words)一起输入。

seq_length = tf.placeholder(tf.int32)
outputs, states = rnn.rnn(cell, inputs,initial_state=initial_state,sequence_length=seq_length)

sess = tf.Session()
feed = {
seq_lenght: 20,
#other feeds
       }
sess.run(outputs, feed_dict=feed)

在这里,最重要的是,如果要使用一个句子获得的状态作为下一个句子的状态,则在提供sequence_length时(假设20,填充后的句子为50)。您希望在第20个时间步获得状态。为此,

tf.pack(states)

那个电话之后

for i in range(len(sentences)):
state_mat   = session.run([states],{
            m.input_data: x,m.targets: y,m.initial_state: state,     m.early_stop:early_stop })
state = state_mat[early_stop-1,:,:]
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号