带有Keras / Tensorflow服务的可变长度输入

时间:2019-04-16 19:08:04

标签: 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解析为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服务图形中支持可变长度输入-甚至在使用keras时是否有可能。

0 个答案:

没有答案