How to deal with batches with variable-length sequences in TensorFlow? How to deal with batches with variable-length sequences in TensorFlow? python python

How to deal with batches with variable-length sequences in TensorFlow?


You can use the ideas of bucketing and padding which are described in:

    Sequence-to-Sequence Models

Also, the rnn function which creates RNN network accepts parameter sequence_length.

As an example, you can create buckets of sentences of the same size, pad them with the necessary amount of zeros, or placeholders which stand for zero word and afterwards feed them along with 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)

Take a look at this reddit thread as well:

   Tensorflow basic RNN example with 'variable length' sequences


You can use dynamic_rnn instead and specify length of every sequence even within one batch via passing array to sequence_length parameter.Example is below:

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 lengthfrom tensorflow.nn.rnn_cell import GRUCellmax_length = 100frame_size = 64num_hidden = 200sequence = 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),)

Code is taken from a perfect article on the topic, please also check it.

Update: Another great post on dynamic_rnn vs rnn you can find


You can use ideas of bucketing and padding which are described in

   Sequence-to-Sequence Models

Also rnn function which creates RNN network accepts parameter sequence_length.

As example you can create buckets of sentances of the same size, padd them with necessary amount of zeros, or placeholdres which stands for zero word and afterwards feed them along with 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)

Here , the most important thing is , if you want to make use of the states obtained by one sentence as , the state for the next sentence , when you are providing sequence_length , ( lets say 20 and sentence after padding is 50 ) . You want the state obtained at the 20th time step . For that , do

tf.pack(states)

After that call

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,:,:]