通过Google Cloud ML部署Keras模型

Mat*_*son 11 google-cloud-platform keras tensorflow google-cloud-ml

我希望使用Google Cloud ML托管我的Keras模型,以便我可以调用API并进行一些预测.我遇到了Keras方面的一些问题.

到目前为止,我已经能够使用TensorFlow构建模型并将其部署在CloudML上.为了使其工作,我不得不对我的基本TF代码进行一些更改.这些更改记录在此处:https://cloud.google.com/ml/docs/how-tos/preparing-models#code_changes

我也能够使用Keras训练类似的模型.我甚至可以用与TF相同的export和export.meta格式保存模型.

from keras import backend as K

saver = tf.train.Saver()
session = K.get_session()
saver.save(session, 'export')
Run Code Online (Sandbox Code Playgroud)

我缺少的部分是如何将输入和输出的占位符添加到我在Keras上构建的图形中?

Lau*_*ert 14

在Google Cloud ML Engine上训练你的模型后(查看这个很棒的教程 ),我用图表命名了我的图形的输入和输出

signature = predict_signature_def(inputs={'NAME_YOUR_INPUT': new_Model.input},
                                  outputs={'NAME_YOUR_OUTPUT': new_Model.output})
Run Code Online (Sandbox Code Playgroud)

您可以在下面看到已经过训练过的keras模型'model.h5'的完整导出示例.

import keras.backend as K
import tensorflow as tf
from keras.models import load_model, Sequential
from tensorflow.python.saved_model import builder as saved_model_builder
from tensorflow.python.saved_model import tag_constants, signature_constants
from tensorflow.python.saved_model.signature_def_utils_impl import predict_signature_def

# reset session
K.clear_session()
sess = tf.Session()
K.set_session(sess)

# disable loading of learning nodes
K.set_learning_phase(0)

# load model
model = load_model('model.h5')
config = model.get_config()
weights = model.get_weights()
new_Model = Sequential.from_config(config)
new_Model.set_weights(weights)

# export saved model
export_path = 'YOUR_EXPORT_PATH' + '/export'
builder = saved_model_builder.SavedModelBuilder(export_path)

signature = predict_signature_def(inputs={'NAME_YOUR_INPUT': new_Model.input},
                                  outputs={'NAME_YOUR_OUTPUT': new_Model.output})

with K.get_session() as sess:
    builder.add_meta_graph_and_variables(sess=sess,
                                         tags=[tag_constants.SERVING],
                                         signature_def_map={
                                             signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature})
    builder.save()
Run Code Online (Sandbox Code Playgroud)

您还可以看到我的完整实现.

编辑:如果我的答案解决了你的问题,请在这里给我一个提升:)


rha*_*l80 1

我对 Keras 不太了解。我咨询了一些专家,以下应该有效:

from keras import backend as k

# Build the model first
model = ...    

# Declare the inputs and outputs for CloudML
inputs = dict(zip((layer.name for layer in model.input_layers),
                  (t.name for t in model.inputs)))
tf.add_to_collection('inputs', json.dumps(inputs))

outputs = dict(zip((layer.name for layer in model.output_layers),
                   (t.name for t in model.outputs)))
tf.add_to_collection('outputs', json.dumps(outputs))

# Fit/train the model
model.fit(...)

# Export the model
saver = tf.train.Saver()
session = K.get_session()
saver.save(session, 'export')
Run Code Online (Sandbox Code Playgroud)

一些要点:

  • 您必须在创建模型之后但在调用 K.get_session()、fit 等之前调用 tf.add_to_collection,
  • 将输入层和输出层添加到图表时,应确保设置输入层和输出层的名称,因为在发送预测请求时需要引用它们。