Home > Enterprise >  Keras functional API Model with String Input
Keras functional API Model with String Input

Time:11-04

I am using tensorflow==2.9.1 an i am trying to use tf.keras.Model? to build a model with partially numerical and partially categorical data.

Here a short example of what i would like to do:

import tensorflow==2.9.1
input_layer = tf.keras.layers.InputLayer(input_shape=(1,), dtype=tf.string)
string_lookup_layer = tf.keras.layers.StringLookup(vocabulary=["a", "b"], output_mode="one_hot")(input_layer)

This thorws the following traceback. Sadly if I just use the StringLookup it requests an InputLayer.

ValueError                                Traceback (most recent call last)
Cell In [60], line 2
      1 input_layer = tf.keras.layers.InputLayer(input_shape=(1,), dtype=tf.string)
----> 2 string_lookup_layer = tf.keras.layers.StringLookup(vocabulary=["a", "b"], output_mode="one_hot")(input_layer)

File ~\AppData\Local\pypoetry\Cache\virtualenvs\dqex-training-server-il8_fjrD-py3.10\lib\site-packages\keras\utils\traceback_utils.py:67, in filter_traceback.<locals>.error_handler(*args, **kwargs)
     65 except Exception as e:  # pylint: disable=broad-except
     66   filtered_tb = _process_traceback_frames(e.__traceback__)
---> 67   raise e.with_traceback(filtered_tb) from None
     68 finally:
     69   del filtered_tb

File ~\AppData\Local\pypoetry\Cache\virtualenvs\dqex-training-server-il8_fjrD-py3.10\lib\site-packages\tensorflow\python\framework\constant_op.py:102, in convert_to_eager_tensor(value, ctx, dtype)
    100     dtype = dtypes.as_dtype(dtype).as_datatype_enum
    101 ctx.ensure_initialized()
--> 102 return ops.EagerTensor(value, ctx.device_name, dtype)

ValueError: Exception encountered when calling layer "string_lookup_25" (type StringLookup).

Attempt to convert a value (<keras.engine.input_layer.InputLayer object at 0x000001F46A29FFD0>) with an unsupported type (<class 'keras.engine.input_layer.InputLayer'>) to a Tensor.

I assume, I am missing something. How do I make this work?

CodePudding user response:

Use tf.keras.layers.Input instead of tf.keras.layers.InputLayer and initialize your StringLookup layer first:

import tensorflow as tf

inputs = tf.keras.layers.Input(shape=(1,), dtype=tf.string)
string_lookup_layer = tf.keras.layers.StringLookup(vocabulary=["a", "b"], output_mode="one_hot")
outputs = string_lookup_layer(inputs)
model = tf.keras.Model(inputs, outputs)

model(tf.constant(["a"]))
<tf.Tensor: shape=(1, 3), dtype=float32, numpy=array([[0., 1., 0.]], dtype=float32)>

Note that you have a 3 elements in the one-hot encoded vector, because of the predefined vocabulary and oov_token='[UNK]'.

  • Related