Tensorflow服务ml引擎在线预测json文件格式

时间:2018-04-04 21:02:42

标签: tensorflow machine-learning lstm tensorflow-serving google-cloud-ml

我想将Tensorflow模型保存到GCP上的ml-engine上,并进行在线预测。
我已经在ml-engine上成功创建了模型,但是,我正在努力将输入JSON字符串输入到模型中。 以下是codedata,来自Undmy的Tensorflow课程的Jose Portilla。

我使用gcloud表示预测:

  

gcloud ml-engine预测--model ='lstm_test' - version'v3' - json-instances ./test.json

test.json内容:

  

{ “输入”:[1,2,3,4,5,6,7,8,9,10,11,12]}

我得到的错误:

  

{     “错误”:“预测失败:模型执行期间出错:AbortionError(代码= StatusCode.INVALID_ARGUMENT,details = \”您必须为占位符张量'Placeholder_2'提供dtype float和shape [?,12,1] \ n的值\ t [[节点:Placeholder_2 = Placeholder_output_shapes = [[?,12,1]],dtype = DT_FLOAT,shape = [?,12,1],_ device = \“/ job:localhost / replica:0 / task:0 /装置:CPU:0 \ “]] \”)”   }

1 个答案:

答案 0 :(得分:3)

一般来说,使用示例proto作为输入不是使用CloudML服务的首选方法。相反,我们将直接使用占位符。

另外,一般来说,您应该创建一个 clean 服务图,所以我还建议进行以下更改:

def build_graph(x):
  # All the code shared between training and prediction, given input x
  ...

  outputs = ...

  # Make sure they both have a Saver.    
  saver = tf.train.Saver()

  return outputs, saver

# Do training
with tf.Graph().as_default() as prediction_graph:
  x = tf.placeholder(tf.float32, [None, num_time_steps, num_inputs])
  outputs, saver = build_graph(x)

with tf.Session(graph=prediction_graph) as sess:
  session.run([tf.local_variables_initializer(), tf.tables_initializer()])
  saver.restore(session, latest)

# This is a much simpler interface for saving models.
tf.saved_model.simple_save(
    sess,
    export_dir=SaveModel_folder,
    inputs={"x": x},
    outputs={"y": outputs}
)

现在,您与gcloud一起使用的文件应如下所示:

[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
[[2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2]]

这会发送一批两个实例(每行一个实例/示例),并假设num_inputs为4,num_time_steps为3。

另一个重要的警告,gcloud的文件格式与您使用传统客户端发送请求(例如JS,Python,curl等)时要发送的请求的完整主体略有不同。与上述相同文件对应的请求正文为:

{
  "instances": [
    [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
    [[2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2]]
  ]
}

基本上,gcloud文件中的每一行都成为"实例中的一个条目"阵列。