3

I am trying to implement a multi-layer RNN model in Tensorflow 2.0. Trying both tf.keras.layers.StackedRNNCells and tf.keras.layers.RNN turns out identical results. Can anyone help me out to understand the differences between tf.keras.layers.RNN and tf.keras.layers.StackedRNNCells?

# driving parameters
sz_batch = 128
sz_latent = 200
sz_sequence = 196
sz_feature = 2
n_units = 120
n_layers = 3

Mulitlayer RNN with tf.keras.layers.RNN:

inputs = tf.keras.layers.Input(batch_shape=(sz_batch, sz_sequence, sz_feature))
cells = [tf.keras.layers.GRUCell(n_units) for _ in range(n_layers)]
outputs = tf.keras.layers.RNN(cells, stateful=True, return_sequences=True, return_state=False)(inputs)
outputs = tf.keras.layers.Dense(1)(outputs)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
model.summary()

returns:

Model: "model_13"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_88 (InputLayer)        [(128, 196, 2)]           0         
_________________________________________________________________
rnn_61 (RNN)                 (128, 196, 120)           218880    
_________________________________________________________________
dense_19 (Dense)             (128, 196, 1)             121       
=================================================================
Total params: 219,001
Trainable params: 219,001
Non-trainable params: 0

Mulitlayer RNN with tf.keras.layers.RNN and tf.keras.layers.StackedRNNCells:

inputs = tf.keras.layers.Input(batch_shape=(sz_batch, sz_sequence, sz_feature))
cells = [tf.keras.layers.GRUCell(n_units) for _ in range(n_layers)]
outputs = tf.keras.layers.RNN(tf.keras.layers.StackedRNNCells(cells),
                              stateful=True, 
                              return_sequences=True, 
                              return_state=False)(inputs)
outputs = tf.keras.layers.Dense(1)(outputs)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
model.summary()

returns:

Model: "model_14"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_89 (InputLayer)        [(128, 196, 2)]           0         
_________________________________________________________________
rnn_62 (RNN)                 (128, 196, 120)           218880    
_________________________________________________________________
dense_20 (Dense)             (128, 196, 1)             121       
=================================================================
Total params: 219,001
Trainable params: 219,001
Non-trainable params: 0
AidinZadeh
  • 724
  • 1
  • 8
  • 15

1 Answers1

3

tf.keras.layers.RNN uses tf.keras.layers.StackedRNNCells if you give it a list or a tuple of cells. This is done in https://github.com/tensorflow/tensorflow/blob/v2.1.0/tensorflow/python/keras/layers/recurrent.py#L390

simon
  • 796
  • 1
  • 6
  • 11