我已经在云ML中部署了保存了Tensorflow的Model以进行文本分类,
input_x = graph.get_tensor_by_name('input_x:0')
keep_prob = graph.get_tensor_by_name('keep_prob:0')
predictions = graph.get_tensor_by_name('softmax/predictions:0')
feed_dict = {input_x: x_test, batch_size: 8, sequence_length: x_lengths, keep_prob: 1.0}
它的部署没有错误。我有一个csv文件可以预测。 --csv文件-
"the test is completed"
"the test2 is done"
仅获取错误。 如何将其转换为我训练的模型的json,以在云ML中批量预测?
saved_model_cli-信息
MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:
signature_def['serving_default']:
The given SavedModel SignatureDef contains the following input(s):
inputs['batch_size'] tensor_info:
dtype: DT_INT32
shape: ()
name: batch_size:0
inputs['input_x'] tensor_info:
dtype: DT_INT32
shape: (-1, 25)
name: input_x:0
inputs['keep_prob'] tensor_info:
dtype: DT_FLOAT
shape: ()
name: keep_prob:0
inputs['sequence_length'] tensor_info:
dtype: DT_INT32
shape: (-1)
name: sequence_length:0
The given SavedModel SignatureDef contains the following output(s):
outputs['predictions'] tensor_info:
dtype: DT_INT64
shape: (-1)
name: softmax/predictions:0
Method name is: tensorflow/serving/predict
当前,我将csv转换为Json,用于预测:
{"sequence_length": 25, "batch_size": 1, "keep_prob": 1.0, "input_x": [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 10, 11, 12, 13, 14, 15, 1, 16, 12, 13, 14, 17, 18, 19, 20]}
例外:
Exception during running the graph: Cannot feed value of shape (1,) for Tensor u\'keep_prob:0\', which has shape \'()\' (Error code: 2)\n'
答案 0 :(得分:2)
此模型似乎需要进行一些更改才能直接使用。服务的一项要求是,每个输入都具有未指定的外部尺寸,该尺寸被解释为“批”尺寸。输入input_x
和sequence_length
满足此要求,但batch_size
和keep_prob
不满足。
该服务动态生成批处理,这就是为什么它需要可变长度的原因。因此,因为服务不知道应该设置该输入,所以有一个名为batch_size
的输入会出现问题。而是建立一个批处理并将其发送到TensorFlow。 TensorFlow已经知道批量大小,因为它是诸如input_x
之类的输入的外部尺寸的值。
与其使用batch_size
作为输入,不如执行以下操作:
batch_size = tf.shape(input_x)[0]
尽管我会指出,在实践中甚至很少需要它。事情通常是“正常的”,因为input_x
用于某种操作,例如矩阵乘法或卷积,可以在不明确知道批处理大小的情况下很好地处理事情。
最后,有keep_prob
,通常表明模型中存在一个退出层。即使您可以将此代码硬编码为1.0,通常还是建议您完全删除掉落层以进行投放。基本上,当您导出模型时,实际上是建立一个不同图而不是进行训练。这在this sample中得到了体现。