Я пытаюсь построить модель Keras, которая будет экспортирована в TF, служащую для классификации текста. Модель поддерживает входные данные переменной длины (или, по крайней мере, я могу вводить входные данные любой длины при оценке), но я не могу понять, как описать это при генерации сигнатуры классификации для обслуживания TF
В настоящее время я делаю:
# Create the input tensors
serialized_tf_example = tf.placeholder(tf.string, name='tf_example')
feature_configs = {'input': tf.VarLenFeature(tf.int64)}
tf_example = tf.parse_example(serialized_tf_example, feature_configs)
output_tensor = model(tf_example['input'])
# Create the prediction output tensors
values, indices = tf.nn.top_k(output_tensor, len(binarizer.classes_))
table = tf.contrib.lookup.index_to_string_table_from_tensor(tf.constant(binarizer.classes_))
prediction_classes = table.lookup(tf.to_int64(indices))
# Generate a classification signature
signature = tf.saved_model.signature_def_utils.classification_signature_def(
serialized_tf_example,
prediction_classes,
values
)
Однако это не удается, потому что VarLenFeature
выполняет синтаксический анализ SparseTensor
, который слой внедрения не поддерживает. Однако, если я изменю VarLenFeature
на FixedLenFeature
, то мне придется предоставить фиксированные входные данные для модели тензорного потока, которая для этого случая неоптимальна.
Фактическая ошибка, которую я получаю при попытке это:
TypeError: Failed to convert object of type <class 'tensorflow.python.framework.sparse_tensor.SparseTensor'> to Tensor. Contents: SparseTensor(indices=Tensor("ParseExample/ParseExample:0", shape=(?, 2), dtype=int64), values=Tensor("ParseExample/ParseExample:1", shape=(?,), dtype=int64), dense_shape=Tensor("ParseExample/ParseExample:2", shape=(2,), dtype=int64)). Consider casting elements to a supported type.
Я не уверен, что еще я могу сделать, чтобы сообщить TF, обслуживающему, что входные данные переменной длины поддерживаются на графике - или если это даже возможно при использовании кера.