keras训练了个二分类的模型。需求是把keras模型跑到 tensorflow serving上 (TensorFlow Serving 系统用于在生产环境中运行模型)

keras模型转 tensorflow模型

我把 keras模型转tensorflow serving模型所使用的方法如下:

1、要拿到算法训练好的keras模型文件(一个HDF5文件)

该文件应该包含:

  • 模型的结构,以便重构该模型
  • 模型的权重
  • 训练配置(损失函数,优化器等)
  • 优化器的状态,以便于从上次训练中断的地方开始

2、编写 keras模型转tensorflow serving模型的代码

import pandas as pd
import os
import tensorflow as tftf.logging.set_verbosity(tf.logging.INFO)
...
def build_model():############...return modeldef save_model_for_production(model, version, path='prod_models'):tf.keras.backend.set_learning_phase(1)if not os.path.exists(path):os.mkdir(path)export_path = os.path.join(tf.compat.as_bytes(path),tf.compat.as_bytes(version))builder = tf.saved_model.builder.SavedModelBuilder(export_path)model_input = tf.saved_model.utils.build_tensor_info(model.input)model_output = tf.saved_model.utils.build_tensor_info(model.output)prediction_signature = (tf.saved_model.signature_def_utils.build_signature_def(inputs={'inputs': model_input},outputs={'output': model_output},method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))with tf.keras.backend.get_session() as sess:builder.add_meta_graph_and_variables(sess=sess, tags=[tf.saved_model.tag_constants.SERVING],signature_def_map={'predict':prediction_signature,})builder.save()if __name__ == '__main__':model_file = './my_model.h5'if (os.path.isfile(model_file)):print('model file detected. Loading.')model = tf.keras.models.load_model(model_file)else:print('No model file detected.  Starting from scratch.')model = build_model()model.compile(loss='binary_crossentropy', optimizer="adam", metrics=['accuracy'])model.save(model_file)model.fit(X_train, y_train, batch_size=100, epochs=1, validation_data=(X_test, y_test))model.summary()export_path = "tf-model"save_model_for_production(model, "1", export_path)

上面的例子将模型保存到 tf-model目录下
tf-model目录结构如下:


tf-model/
└── 1├── saved_model.pb└── variables├── variables.data-00000-of-00001└── variables.index

saved_model.pb 是能在 tensorflow serving跑起来的模型。

3、跑模型

tensorflow_model_server --port=9000 --model_name="username" --model_base_path="/data/models/tf-model/"

标准输出如下(算法模型已成功跑起来了):


Running ModelServer at 0.0.0.0:00 ...

4、客户端代码

#!/usr/bin/env python
# encoding: utf-8  """
@version: v1.0
@author: zwqjoy
@contact: zwqjoy@163.com
@site: https://blog.csdn.net/zwqjoy
@file: client
@time: 2018/6/29 15:02
"""from __future__ import print_function
from grpc.beta import implementations
import tensorflow as tffrom tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2
import numpy as nptf.app.flags.DEFINE_string('server', 'localhost:9000','PredictionService host:port')
FLAGS = tf.app.flags.FLAGSdef main(_):host, port = FLAGS.server.split(':')channel = implementations.insecure_channel(host, int(port))stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)# Send request# See prediction_service.proto for gRPC request/response details.data = np.array([4, 0, 0, 0, 1, 0, 1])data = data.astype(np.float32)request = predict_pb2.PredictRequest()request.model_spec.name = 'username'  # 这个name跟tensorflow_model_server  --model_name="username" 对应request.model_spec.signature_name = 'predict'  # 这个signature_name  跟signature_def_map 对应request.inputs['inputs'].CopyFrom(tf.contrib.util.make_tensor_proto(data, shape=(1, 7)))  # shape跟 keras的model.input类型对应result = stub.Predict(request, 10.0)  # 10 secs timeoutprint(result)if __name__ == '__main__':tf.app.run()

客户端跑出的结果是:


outputs {key: "output"value {dtype: DT_FLOATtensor_shape {dim {size: 1}dim {size: 1}}float_val: 0.976889811523}
}

float_val: 0.976889811523 就是我们需要的结果(概率)

keras模型转 tensorflow模型的一些说明

1、 keras 保存模型

可以使用model.save(filepath)将Keras模型和权重保存在一个HDF5文件中,该文件将包含:

  • 模型的结构,以便重构该模型
  • 模型的权重
  • 训练配置(损失函数,优化器等)
  • 优化器的状态,以便于从上次训练中断的地方开始

当然这个 HDF5 也可以是用下面的代码生成

from keras.models import load_model
model.save('my_model.h5')

2、 keras 加载模型

keras 加载模型(中间部分代码省略了):

import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from keras.models import load_model
# 载入数据
(x_train,y_train),(x_test,y_test) = mnist.load_data()
# (60000,28,28)
print('x_shape:',x_train.shape)
# (60000)
print('y_shape:',y_train.shape)
# (60000,28,28)->(60000,784)
x_train = x_train.reshape(x_train.shape[0],-1)/255.0
x_test = x_test.reshape(x_test.shape[0],-1)/255.0
# 换one hot格式
y_train = np_utils.to_categorical(y_train,num_classes=10)
y_test = np_utils.to_categorical(y_test,num_classes=10)# 载入模型
model = load_model('model.h5')# 评估模型
loss,accuracy = model.evaluate(x_test,y_test)print('\ntest loss',loss)
print('accuracy',accuracy)# 训练模型
model.fit(x_train,y_train,batch_size=64,epochs=2)# 评估模型
loss,accuracy = model.evaluate(x_test,y_test)print('\ntest loss',loss)
print('accuracy',accuracy)# 保存参数,载入参数
model.save_weights('my_model_weights.h5')
model.load_weights('my_model_weights.h5')

keras 模型转tensorflow serving 模型的一些坑

希望能让新手少走一些弯路

坑1:过时的生成方法

有些方法已经过时了(例如下面这种):


from tensorflow_serving.session_bundle import exporterexport_path = ... # where to save the exported graph
export_version = ... # version number (integer)saver = tf.train.Saver(sharded=True)
model_exporter = exporter.Exporter(saver)
signature = exporter.classification_signature(input_tensor=model.input,scores_tensor=model.output)
model_exporter.init(sess.graph.as_graph_def(),default_graph_signature=signature)
model_exporter.export(export_path, tf.constant(export_version), sess)

如果使用这种过时的方法,用tensorflow serving 跑模型的时候会提示:


WARNING:tensorflow:From test.py:107: Exporter.export (from tensorflow.contrib.session_bundle.exporter) is deprecated and will be removed after 2017-06-30.
Instructions for updating:
No longer supported. Switch to SavedModel immediately.

从warning中 显然可以知道这种方法要被抛弃了,不再支持这种方法了, 建议我们转用 SaveModel方法。

填坑大法: 使用 SaveModel

def save_model_for_production(model, version, path='prod_models'):tf.keras.backend.set_learning_phase(1)if not os.path.exists(path):os.mkdir(path)export_path = os.path.join(tf.compat.as_bytes(path),tf.compat.as_bytes(version))builder = tf.saved_model.builder.SavedModelBuilder(export_path)model_input = tf.saved_model.utils.build_tensor_info(model.input)model_output = tf.saved_model.utils.build_tensor_info(model.output)prediction_signature = (tf.saved_model.signature_def_utils.build_signature_def(inputs={'inputs': model_input},outputs={'output': model_output},method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))with tf.keras.backend.get_session() as sess:builder.add_meta_graph_and_variables(sess=sess, tags=[tf.saved_model.tag_constants.SERVING],signature_def_map={'predict':prediction_signature,})builder.save()

参考:

https://www.jianshu.com/p/91aae37f1da6

Deploying Keras model on Tensorflow Serving with GPU support

https://github.com/amir-abdi/keras_to_tensorflow

Deploying Keras model on Tensorflow Serving相关推荐

  1. tensorflow从入门到精通100讲(六)-在TensorFlow Serving/Docker中做keras 模型部署

    前言 不知道大家研究过没有,tensorflow模型有三种保存方式: 训练时我们会一般会将模型保存成:checkpoint文件 为了方便python,C++或者其他语言部署你的模型,你可以将模型保存成 ...

  2. 使用tensorflow serving部署keras模型(tensorflow 2.0.0)

    点击上方"AI搞事情"关注我们 内容转载自知乎:https://zhuanlan.zhihu.com/p/96917543 Justin ho 〉 Tensorflow 2.0.0 ...

  3. Tensorflow Serving部署tensorflow、keras模型详解

    写在篇前   本篇介绍如何使用Tensorflow Serving组件导出训练好的Tensorflow模型,并使用标准tensorflow model server来部署深度学习模型预测服务.tens ...

  4. tensorflow serving部署keras或tf2.0模型

    一.安装docker 由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本: $ sudo apt-get remove docker docker-engine docker- ...

  5. 【Keras】TensorFlow Serving

    当我们将模型训练完毕后,往往需要将模型在生产环境中部署.最常见的方式,是在服务器上提供一个 API,即客户机向服务器的某个 API 发送特定格式的请求,服务器收到请求数据后通过模型进行计算,并返回结果 ...

  6. tensorflow/serving部署keras的h5模型服务

    当我们使用keras训练好模型之后,下一步就是部署服务了,采用flask直接加载keras的h5模型,服务的并发性能会很低.如果为了追求高并发性能,就可以采用Nginx+gunicorn+gevent ...

  7. TensorFlow Serving + Docker + Tornado机器学习模型生产级快速部署

    点击上方"AI搞事情"关注我们 内容转载自知乎:https://zhuanlan.zhihu.com/p/52096200 Justin ho 〉 本文将会介绍使用TensorFl ...

  8. 用Docker容器自带的tensorflow serving部署模型对外服务

    相信很多人和我一样,在试图安装tensorflow serving的时候,翻遍了网上的博客和官网文档,安装都是以失败而告终,我也是一样,这个问题折磨了我两个星期之久,都快放弃了.幸运的是在同事的建议下 ...

  9. 用Docker部署TensorFlow Serving服务

    文章目录 1. 安装 Docker 2. 使用 Docker 部署 3. 请求服务 3.1 手写数字例子 3.2 猫狗分类例子 参考: https://tf.wiki/zh_hans/deployme ...

最新文章

  1. 技术战“疫”,贾扬清、李飞飞要给程序员直播讲AI技术!
  2. python0b1010_笔记-python-字符串格式化-format()
  3. DeepMind训练AI玩足球,风骚走位比中国男足都强(狗头)
  4. Alpine Linux 中的 apk 命令讲解
  5. oracle / parallle /,Oracle海量数据迁移之使用shell启用多个动态并行
  6. mysql主主互备架构
  7. linux端口对ip开放,Linux 开放IP端口
  8. 【Machine Learning】TensorFlow实现K近邻算法预测房屋价格
  9. python使用字典描述学生信息_Python字典(Dictionary)操作详解
  10. dfs-girlcat
  11. Linux errno的含义【转】
  12. linux显卡驱动重装
  13. Python三目表达式
  14. Facebook母公司:混合现实走向市场还需要数年时间
  15. 555555555555555555555
  16. current account(经常账户)
  17. python open permission denied_spark-submit python 程序,/home/.python-eggs permission denied 问题解决...
  18. AI人工智能算法解析落地实践专栏列表
  19. F1 Delta Time 大奖赛每日挑战赛开启
  20. 浅谈Linux内核编程规范与代码风格

热门文章

  1. ios8 定位问题解决思路
  2. linux搜索关键字并定位,Linux系统中文件定位与查找(示例代码)
  3. 彻底理解链接器:二,符号决议
  4. 微信OAuth2.0网页授权设置一个域名需多个域名使用的问题
  5. 4-具体学习git--分支
  6. 开发自己的框架——(二)数据库工具类的封装
  7. Linux下OpenSSL的安装与使用
  8. iOS新上线注意事项
  9. JAVA基础学习笔记(2)
  10. BeanShell快速入门---Java应用