Understand TensorFlow tf.reverse_sequence(): Reverse a Tensor by Length – TensorFlow Tutorial

By | July 7, 2020

tf.reverse_sequence() is an important function for building a custom bilstm model, which is different from tf.reverse().

To understand tf.reverse(), you can read:

Understand TensorFlow tf.reverse(): Reverse a Tensor Based on Axis

The difference between tf.reverse_sequence() and tf.reverse()

Both of them can reverse a tensor based on axis. However, tf.reverse_sequence() can allow us to reverse a tensor by length.

For example:

As to sentence: I love this food and service, there are 6 words in this sentence, if you plan to use bilstm model to process this sentence, you may set the time_step is 8, which means there are two invalid words in this sentence.

The sentence will be viewed as: I love this food and service – –

As to tensorflow tf.reverse_sequence() and tf.reverse(), the reversed sentence will be:

the difference between tf.reverse() and tf.reverse_sequence()

How to use tensorflow tf.reverse_sequence()? In this tutorial, we will discuss this topic.

Syntax

tf.reverse_sequence(
    input,
    seq_lengths,
    seq_axis=None,
    batch_axis=None,
    name=None,
    seq_dim=None,
    batch_dim=None
)

tf.reverse_sequence() allows us to reverse a tensor by seq_lengths based on seq_axis.

Parameters explained

input: the tensor will be revered.

seq_lengths: int, it must be a list or 1-D. For example seq_lengths= [1, 2, 3]

seq_axis: int, it is a scalar, not a list, which is different from tf.reverse()

We will use an example to show you how to use this function.

Suppose you have a tensor, the shape of it is (batch_size, time_step, dim), you should reverse it based on time_step.

Create a tensor with (3, 3, 4)

where batch_size = 3, time_step = 3, dim = 4.

It means the length of seq_lengths should be time_step and the maximum number in seq_lengths shoud be lower than time_step.

For example:

seq_lengths = [1, 2, 3] is valid.

seq_lengths = [1, 2, 4] is invalid, 4 > time_step.

seq_lengths = [1, 2] is invalid.

Then we will create a 3 * 3 * 4 tensor.

import tensorflow as tf
import numpy as np

x = tf.Variable(np.array(range(36)), dtype = np.float32, name = 'x')
x = tf.reshape(x, [3, 3, 4])

x will be:

[[[ 0.  1.  2.  3.]
  [ 4.  5.  6.  7.]
  [ 8.  9. 10. 11.]]

 [[12. 13. 14. 15.]
  [16. 17. 18. 19.]
  [20. 21. 22. 23.]]

 [[24. 25. 26. 27.]
  [28. 29. 30. 31.]
  [32. 33. 34. 35.]]]

Set the seq_lengths

As discussed above, we can set it to be [1, 2, 3]

seq_lengths = [1, 2, 3]

Reverse tensor by seq_lenghts based on time_step

x1 = tf.reverse_sequence(x, seq_lengths, seq_axis = 1)

The axis of time_step is 1, so we set seq_axis = 1.

Output x1.

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(x))
    print(sess.run(x1))

Then we will find x1 will be:

[[[ 0.  1.  2.  3.]
  [ 4.  5.  6.  7.]
  [ 8.  9. 10. 11.]]

 [[16. 17. 18. 19.]
  [12. 13. 14. 15.]
  [20. 21. 22. 23.]]

 [[32. 33. 34. 35.]
  [28. 29. 30. 31.]
  [24. 25. 26. 27.]]]

Compare x with x1

We can compare x and x1 as below:

the effect of tf.reverse_sequence() in tensorflow

Leave a Reply