I am trying to create a constant variable inside a keras model. What I was doing till now is to pass it as Input. But it is always a constant so I want it as a constant.(The input is [1,2,3...50]
for each example => so I use np.tile(np.array(range(50)),(len(X_input)))
to reproduce it for each example)
So for now I had:
constant_input = Input(shape=(50,), dtype='int32', name="constant_input")
Which gives a tensor: Tensor("constant_input", shape(?,50), dtype=int32)
Now trying to do it as a constant:
np_constant = np.array(list(range(50))).reshape(1, 50)
tf_constant = K.constant(np_constant)
tensor_constant = Input(tensor=tf_constant, shape=(50,), dtype='int32', name="constant_input")
which gives a tensor: Tensor("constant_input", shape(50,1),dtype=float32)
But What I want is the constant to be scaled in each batch, meaning that the shape of the tensor should be (?, 50)
, the same as the way of using Input
.
Is it possible to do that?
You cannot have a constant with variable size. A constant always has the same value. What you can do is have the (1, 50)
constant and then tile it within TensorFlow with K.tile
. Also better use np.arange
instead of np.array(list(range(50))
. Something like:
from keras.layers.core import Lambda
import keras.backend as K
def operateWithConstant(input_batch):
tf_constant = K.constant(np.arange(50).reshape((1, 50)))
batch_size = K.shape(input_batch)[0]
tiled_constant = K.tile(tf_constant, (batch_size, 1))
# Do some operation with tiled_constant and input_batch
result = ...
return result
input_batch = Input(...)
input_operated = Lambda(operateWithConstant)(input_batch)
# continue...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With