我正在尝试构建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时是否有可能。