我想将Tensorflow模型保存到GCP上的ml-engine上,并进行在线预测。
我已经在ml-engine上成功创建了模型,但是,我正在努力将输入JSON字符串输入到模型中。
以下是code和data,来自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 \ “]] \”)” }
答案 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
文件中的每一行都成为"实例中的一个条目"阵列。