云ML模型预测

时间:2018-08-12 06:43:19

标签: python tensorflow google-cloud-platform google-cloud-ml

我已经在云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'

1 个答案:

答案 0 :(得分:2)

此模型似乎需要进行一些更改才能直接使用。服务的一项要求是,每个输入都具有未指定的外部尺寸,该尺寸被解释为“批”尺寸。输入input_xsequence_length满足此要求,但batch_sizekeep_prob不满足。

该服务动态生成批处理,这就是为什么它需要可变长度的原因。因此,因为服务不知道应该设置该输入,所以有一个名为batch_size的输入会出现问题。而是建立一个批处理并将其发送到TensorFlow。 TensorFlow已经知道批量大小,因为它是诸如input_x之类的输入的外部尺寸的值。

与其使用batch_size作为输入,不如执行以下操作:

batch_size = tf.shape(input_x)[0]

尽管我会指出,在实践中甚至很少需要它。事情通常是“正常的”,因为input_x用于某种操作,例如矩阵乘法或卷积,可以在不明确知道批处理大小的情况下很好地处理事情。

最后,有keep_prob,通常表明模型中存在一个退出层。即使您可以将此代码硬编码为1.0,通常还是建议您完全删除掉落层以进行投放。基本上,当您导出模型时,实际上是建立一个不同图而不是进行训练。这在this sample中得到了体现。