Search code examples
pythontensorflowkerastensorflow2.0

How to print Keras tensor values?


I want to print the state values of LSTM layer.

class CustomCallback(keras.callbacks.Callback):
   def on_epoch_end(self, epoch, logs=None):
        encoder_outputs, state_h, state_c = self.model.layers[1].output
        print(state_h)
        print(state_c)

It is printing something like this

32/32 - 0s - loss: 39.6719 - accuracy: 0.2420
KerasTensor(type_spec=TensorSpec(shape=(None, 5), dtype=tf.float32, name=None), name='lstm_5/PartitionedCall:3', description="created by layer 'lstm_5'")
Epoch 5/20000
32/32 - 0s - loss: 39.6549 - accuracy: 0.2420
KerasTensor(type_spec=TensorSpec(shape=(None, 5), dtype=tf.float32, name=None), name='lstm_5/PartitionedCall:3', description="created by layer 'lstm_5'")

How to print the real values of the tensor ?


Solution

  • You will have to feed some data to your LSTM layer inside your Callback function in order to see some real values:

    import tensorflow as tf
    
    class CustomCallback(tf.keras.callbacks.Callback):
       def __init__(self, data, sample_size):
            self.data = data
            self.sample_size = sample_size
       def on_epoch_end(self, epoch, logs=None):
            encoder_outputs, state_h, state_c = lstm_layer(self.data[:self.sample_size])
            tf.print('state_h --> ', state_h)
            tf.print('state_c --> ', state_c)
    
    
    inputs = tf.keras.layers.Input((5, 10))
    x, _, _ = tf.keras.layers.LSTM(32, return_state=True, return_sequences=True)(inputs)
    x = tf.keras.layers.Flatten()(x)
    x = tf.keras.layers.Dense(units=1)(x)
    model = tf.keras.Model(inputs, x)
    model.compile(loss=tf.keras.losses.BinaryCrossentropy())
    
    lstm_layer = model.layers[1]
    x_train = tf.random.normal((10, 5, 10))
    x_test = tf.random.normal((10, 5, 10))
    model.fit(x_train, tf.random.uniform((10, 1), maxval=2), epochs=2, callbacks=[CustomCallback(x_test, 1)], batch_size=2)
    
    Epoch 1/2
    5/5 [==============================] - 2s 5ms/step - loss: 12.2492
    state_h -->  [[-0.157256633 -0.0619691685 0.102620631 ... 0.0852451548 -0.0657120794 -0.201934695]]
    state_c -->  [[-0.316935241 -0.157902092 0.184583426 ... 0.196862131 -0.134880155 -0.467693359]]
    Epoch 2/2
    5/5 [==============================] - 0s 4ms/step - loss: 11.8095
    state_h -->  [[-0.15817374 -0.0611076616 0.103141323 ... 0.0845508352 -0.0648964494 -0.201082334]]
    state_c -->  [[-0.319411457 -0.156104326 0.186640084 ... 0.194445729 -0.13365829 -0.464410305]]
    <keras.callbacks.History at 0x7f9baadc8b90>
    

    Notice that I created a x_test tensor, but you can also just feed x_train to your callback. The lstm_layer holds the current weights based on your training progress. You can verify this by printing the layer weights in your Callback function: tf.print(lstm_layer.get_weights()).