#python #tensorflow #keras
#python #tensorflow #keras
Вопрос:
Я пытаюсь создать модель 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
выполняется синтаксический анализ до a SparseTensor
, который уровень встраивания не поддерживает. Однако, если я перейду VarLenFeature
на a FixedLenFeature
, тогда мне придется предоставлять фиксированные входные данные для модели tensorflow, что является неоптимальным для этого случая.
Фактическая ошибка, которую я получаю при попытке сделать это, такова:
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 serving, что входные данные переменной длины поддерживаются на графике — или если это вообще возможно при использовании keras.
Комментарии:
1. ОК. Я понял кое-что, что работает. Взяв
SparseTensor
и преобразовав его в тензор сtf.sparse.to_dense(sparse)
помощью, я заставил его работать. Хотя я не уверен, в чем подводные камни такого подхода. Я ненадолго оставлю этот вопрос открытым, чтобы посмотреть, сможет ли кто-нибудь пролить некоторый свет.2. Проблема в том, что плотный тензор потребляет намного больше памяти, чем разреженный, особенно если большая часть разреженного тензора пуста (как и следовало ожидать в разреженном тензоре). Если ваши пакеты достаточно малы, это может не быть проблемой.