When saving a Lambda
layer, the arguments
passed in will also be saved. In this case, it contains two tf.Tensor
s. It seems that Keras does not support serializing tf.Tensor
in the model config right now.
However, numpy arrays can be serialized without problem. So instead of passing tf.Tensor
in arguments
, you can pass in numpy arrays, and convert them into tf.Tensor
s in the lambda function.
x = Input(shape=(30,3))
low = np.random.rand(30, 3)
high = 1 + np.random.rand(30, 3)
clipped_out_position = Lambda(lambda x, low, high: tf.clip_by_value(x, tf.constant(low, dtype="float32"), tf.constant(high, dtype="float32")),
arguments={'low': low, 'high': high})(x)
A problem with the lines above is that, when trying to load this model, you might see a NameError: name 'tf' is not defined
. That’s because TensorFlow is not imported in the file where the Lambda
layer is reconstructed (core.py).
Changing tf
into K.tf
can fix the problem. Also you can replace tf.constant()
by K.constant()
, which casts low
and high
into float32 tensors automatically.
from keras import backend as K
x = Input(shape=(30,3))
low = np.random.rand(30, 3)
high = 1 + np.random.rand(30, 3)
clipped_out_position = Lambda(lambda x, low, high: K.tf.clip_by_value(x, K.constant(low), K.constant(high)),
arguments={'low': low, 'high': high})(x)