Ввод переменной длины с подачей Keras / Tensorflow

#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. Проблема в том, что плотный тензор потребляет намного больше памяти, чем разреженный, особенно если большая часть разреженного тензора пуста (как и следовало ожидать в разреженном тензоре). Если ваши пакеты достаточно малы, это может не быть проблемой.