将基本的Tensorflow模型导出到Google Cloud ML [英] Export a basic Tensorflow model to Google Cloud ML
问题描述
我正在尝试导出本地张量流模型以在Google Cloud ML上使用它并对其进行预测.
I am trying to export my local tensorflow model to use it on Google Cloud ML and run predictions on it.
我正在遵循使用mnist的Tensorflow服务示例数据.它们处理和使用其输入/输出向量的方式有很多差异,这不是您在网上的典型示例中所发现的.
I am following the tensorflow serving example with mnist data. There is quite a bit of difference in the way they have processed and used their input/output vectors and it is not what you find in typical examples online.
我不确定如何设置我的签名的参数:
I am unsure how to set the parameters of my signatures :
model_exporter.init(
sess.graph.as_graph_def(),
init_op = init_op,
default_graph_signature = exporter.classification_signature(
input_tensor = "**UNSURE**" ,
scores_tensor = "**UNSURE**"),
named_graph_signatures = {
'inputs' : "**UNSURE**",
'outputs': "**UNSURE**"
}
)
model_exporter.export(export_path, "**UNSURE**", sess)
这是我其余的代码:
import sys
import tensorflow as tf
from tensorflow.contrib.session_bundle import exporter
import numpy as np
from newpreprocess import create_feature_sets_and_labels
train_x,train_y,test_x,test_y = create_feature_sets_and_labels()
x = tf.placeholder('float', [None, 13])
y = tf.placeholder('float', [None, 1])
n_nodes_hl1 = 20
n_nodes_hl2 = 20
n_classes = 1
batch_size = 100
def neural_network_model(data):
hidden_1_layer = {'weights':tf.Variable(tf.random_normal([13, n_nodes_hl1])),
'biases':tf.Variable(tf.random_normal([n_nodes_hl1]))}
hidden_2_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl1, n_nodes_hl2])),
'biases':tf.Variable(tf.random_normal([n_nodes_hl2]))}
output_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl2, n_classes])),
'biases':tf.Variable(tf.random_normal([n_classes]))}
l1 = tf.add(tf.matmul(data, hidden_1_layer['weights']), hidden_1_layer['biases'])
l1 = tf.tanh(l1)
l2 = tf.add(tf.matmul(l1, hidden_2_layer['weights']), hidden_2_layer['biases'])
l2 = tf.tanh(l2)
output = tf.add(tf.matmul(l2, output_layer['weights']), output_layer['biases'])
return output
def train_neural_network(x):
output = neural_network_model(x)
cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(output, y))
optimizer = tf.train.AdamOptimizer(0.003).minimize(cost)
hm_epochs = 700
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
for epoch in range(hm_epochs):
epoch_loss = 0
i = 0
while i < len(train_x):
start = i
end = i + batch_size
batch_x = np.array(train_x[start:end])
batch_y = np.array(train_y[start:end])
_, c = sess.run([optimizer, cost], feed_dict={x: batch_x,
y: batch_y})
epoch_loss += c
i+=batch_size
print('Epoch', epoch, 'completed out of', hm_epochs, 'loss:', epoch_loss/(len(train_x)/batch_size))
prediction = tf.sigmoid(output)
predicted_class = tf.greater(prediction,0.5)
correct = tf.equal(predicted_class, tf.equal(y,1.0))
accuracy = tf.reduce_mean( tf.cast(correct, 'float') )
print('Accuracy:', accuracy.eval({x: test_x, y: test_y}))
export_path = "~/Documents/cloudcomputing/Project/RNN_timeseries/"
print ("Exporting trained model to %s", %export_path)
init_op = tf.group(tf.initialize_all_tables(), name="init_op")
saver = tf.train.Saver(sharded = True)
model_exporter = exporter.Exporter(saver)
model_exporter.init(
sess.graph.as_graph_def(),
init_op = init_op,
default_graph_signature = exporter.classification_signature(
input_tensor = ,
scores_tensor = ),
named_graph_signatures = {
'inputs' : ,
'outputs':
}
)
model_exporter.export(export_path, tf.constant(1), sess)
print("Done exporting!")
train_neural_network(x)
在Google Cloud ML上上传并使用该链接的确切步骤是什么?他们的演练似乎是针对在云本身而不是在本地计算机上训练的模型的.
What exactly are the steps to upload and use this on Google Cloud ML? Their walkthroughs seem to be for models trained on the cloud itself and not on local machines.
推荐答案
Tensorflow Serving和Google Cloud ML是两种不同的东西,请不要混淆. Cloud ML是一个完全托管的解决方案(ML即服务),而TF Serving要求您设置和维护基础架构-它只是一台服务器.它们无关,在输入/输出处理方面有不同的要求.
Tensorflow Serving and Google Cloud ML are two different things, don't mix them up. Cloud ML is a fully managed solution (ML as a service), whereas TF Serving requires you to set up and maintain your infrastructure - it's just a server. They are unrelated and have different requirements in input/output handling.
您应遵循的指南是这本.无需使用图形签名,而是将输入和输出添加到集合中.代码中的更改将如下所示:
The guide that you should follow is this one. Instead of using graph signatures you add inputs and outputs into collections. The changes in your code would then be something like this:
import sys
import tensorflow as tf
from tensorflow.contrib.session_bundle import exporter
import numpy as np
from newpreprocess import create_feature_sets_and_labels
import json
import os
train_x,train_y,test_x,test_y = create_feature_sets_and_labels()
n_nodes_hl1 = 20
n_nodes_hl2 = 20
n_classes = 1
batch_size = 100
x = tf.placeholder('float', [None, 13])
y = tf.placeholder('float', [None, 1])
keys_placeholder = tf.placeholder(tf.int64, shape=(None,))
keys = tf.identity(keys_placeholder)
def neural_network_model(data):
hidden_1_layer = {'weights':tf.Variable(tf.random_normal([13, n_nodes_hl1])),
'biases':tf.Variable(tf.random_normal([n_nodes_hl1]))}
hidden_2_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl1, n_nodes_hl2])),
'biases':tf.Variable(tf.random_normal([n_nodes_hl2]))}
output_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl2, n_classes])),
'biases':tf.Variable(tf.random_normal([n_classes]))}
l1 = tf.add(tf.matmul(data, hidden_1_layer['weights']), hidden_1_layer['biases'])
l1 = tf.tanh(l1)
l2 = tf.add(tf.matmul(l1, hidden_2_layer['weights']), hidden_2_layer['biases'])
l2 = tf.tanh(l2)
output = tf.add(tf.matmul(l2, output_layer['weights']), output_layer['biases'])
return output
output = neural_network_model(x)
prediction = tf.sigmoid(output)
predicted_class = tf.greater(prediction,0.5)
inputs = {'key': keys_placeholder.name, 'x': x.name}
tf.add_to_collection('inputs', json.dumps(inputs))
outputs = {'key': keys.name,
'prediction': predicted_class.name}
tf.add_to_collection('outputs', json.dumps(outputs))
def train_neural_network(x):
cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(output, y))
optimizer = tf.train.AdamOptimizer(0.003).minimize(cost)
hm_epochs = 700
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
for epoch in range(hm_epochs):
epoch_loss = 0
i = 0
while i < len(train_x):
start = i
end = i + batch_size
batch_x = np.array(train_x[start:end])
batch_y = np.array(train_y[start:end])
_, c = sess.run([optimizer, cost], feed_dict={x: batch_x,
y: batch_y})
epoch_loss += c
i+=batch_size
print('Epoch', epoch, 'completed out of', hm_epochs, 'loss:', epoch_loss/(len(train_x)/batch_size))
correct = tf.equal(predicted_class, tf.equal(y,1.0))
accuracy = tf.reduce_mean( tf.cast(correct, 'float') )
print('Accuracy:', accuracy.eval({x: test_x, y: test_y}))
export_path = "~/Documents/cloudcomputing/Project/RNN_timeseries/"
print ("Exporting trained model to %s", %export_path)
init_op = tf.group(tf.initialize_all_tables(), name="init_op")
saver = tf.train.Saver(sharded = True)
saver.save(sess, os.path.join(export_path, 'export'))
print("Done exporting!")
train_neural_network(x)
我在代码中做了一些改动(并且还没有实际测试过),但这应该为您提供一个起点.
I moved some things in your code a little (and haven't actually tested it), but that should give you a starting point.
这篇关于将基本的Tensorflow模型导出到Google Cloud ML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!