用Docker部署TensorFlow Serving服务

文章目录

    • 1. 安装 Docker
    • 2. 使用 Docker 部署
    • 3. 请求服务
      • 3.1 手写数字例子
      • 3.2 猫狗分类例子

参考:
https://tf.wiki/zh_hans/deployment/serving.html#
https://tensorflow.google.cn/tfx/serving/docker

1. 安装 Docker

以下均为 centos7 环境
参考文章:docker安装等操作

2. 使用 Docker 部署

  • 拉镜像 docker pull tensorflow/serving
  • 模型路径,版本号1,2,默认加载最大数字的

  • bash 输入命令,注意路径,mymodel跟请求的代码保持一致
docker run -p 8501:8501 --mount type=bind,source=/home/dnn/project/tf2,target=/models/mymodel -e MODEL_NAME=mymodel -t tensorflow/serving

  • 手写数字识别 模型代码+导出模型
# 手写数字 tf 实现
import numpy as np
import tensorflow as tfclass MNistLoader():def __init__(self):data = tf.keras.datasets.mnist# 加载数据(self.train_data, self.train_label), (self.test_data, self.test_label) = data.load_data()# 扩展维度,灰度图1通道 [batch_size, 28, 28, chanels=1]self.train_data = np.expand_dims(self.train_data.astype(np.float32) / 255.0, axis=-1)self.test_data = np.expand_dims(self.test_data.astype(np.float32) / 255.0, axis=-1)self.train_label = self.train_label.astype(np.int32)self.test_label = self.test_label.astype(np.int32)# 样本个数self.num_train_data, self.num_test_data = self.train_data.shape[0], self.test_data.shape[0]def get_batch(self, batch_size):# 从训练集里随机取出 batch_size 个样本idx = np.random.randint(0, self.num_train_data, batch_size)return self.train_data[idx, :], self.train_label[idx]# 自定义多层感知机模型
class MLPmodel(tf.keras.Model):def __init__(self):super().__init__()# 除第一维以外的维度展平self.flatten = tf.keras.layers.Flatten()self.dense1 = tf.keras.layers.Dense(units=100, activation='relu')self.dense2 = tf.keras.layers.Dense(units=10)@tf.function # 计算图模式,导出需要def call(self, input):x = self.flatten(input)x = self.dense1(x)x = self.dense2(x)output = tf.nn.softmax(x)return outputnum_epochs = 5
batch_size = 50
learning_rate = 1e-4mymodel = MLPmodel()data_loader = MNistLoader()mymodel.compile(optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate),loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=[tf.keras.metrics.sparse_categorical_accuracy]
)
mymodel.fit(data_loader.train_data, data_loader.train_label,batch_size=batch_size,epochs=num_epochs)# 导出模型
tf.saved_model.save(mymodel, "./2")
# 载入模型
mymodel = tf.saved_model.load('./2')res = mymodel.call(data_loader.test_data)
print(res)

3. 请求服务

3.1 手写数字例子

import numpy as np
import tensorflow as tf
import json
import requests
import matplotlib.pyplot as pltclass MNistLoader():def __init__(self):data = tf.keras.datasets.mnist# 加载数据(self.train_data, self.train_label), (self.test_data, self.test_label) = data.load_data()# 扩展维度,灰度图1通道 [batch_size, 28, 28, chanels=1]self.train_data = np.expand_dims(self.train_data.astype(np.float32) / 255.0, axis=-1)self.test_data = np.expand_dims(self.test_data.astype(np.float32) / 255.0, axis=-1)self.train_label = self.train_label.astype(np.int32)self.test_label = self.test_label.astype(np.int32)# 样本个数self.num_train_data, self.num_test_data = self.train_data.shape[0], self.test_data.shape[0]def get_batch(self, batch_size):# 从训练集里随机取出 batch_size 个样本idx = np.random.randint(0, self.num_train_data, batch_size)return self.train_data[idx, :], self.train_label[idx]size = 6
dataloader = MNistLoader()data = json.dumps({'instances': dataloader.test_data[0:size].tolist()
})headers = {'content-type': 'application/json'}json_response = requests.post(url='http://localhost:8501/v1/models/mymodel:predict',data=data, headers=headers
)pred = np.array(json.loads(json_response.text)['predictions'])
print("预测结果:", np.argmax(pred, axis=-1))# 打印图片
plt.subplots(1, size)
idx = 1
for img in dataloader.test_data[0:size]:plt.subplot(1, size, idx)plt.imshow(img)idx += 1
plt.show()

输出:

预测结果: [7 2 1 0 4 1]

跟图片显示一致

3.2 猫狗分类例子

模型代码

训练完后,导出模型

tf.saved_model.save(model, './3')
import numpy as np
import tensorflow as tf
import json
import requests
import matplotlib.pyplot as plttest_pic = ["./dogs-vs-cats/test/1.jpg","./dogs-vs-cats/test/7.jpg"]# 狗1, 猫0
test_data = np.array([_decode_and_resize(f).numpy() for f in test_pic])data = json.dumps({'instances': test_data.tolist()
})headers = {'content-type': 'application/json'}json_response = requests.post(url='http://localhost:8501/v1/models/mymodel:predict',data=data, headers=headers
)
pred = np.array(json.loads(json_response.text)['predictions'])
print("预测结果:", np.argmax(pred, axis=-1))for img in test_data:plt.imshow(img)plt.show()

输出:

预测结果: [1 0] # 狗,猫

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K-Means算法和K-Means++算法的聚类

在构成圆形的30000个随机样本点上,设置7个簇,使用K-Means算法聚类 from math import pi, sin, cos from collections import namedtuple from random import random, choice from copy import copy import matplotlib.pyplot as plt import numpy as np…

convert.todatetime指定日期格式_MATLAB的时间与日期

7 日期和时间MATLAB在2014b版本中将日期和时间独立成了一个数据类型,新的版本中对于时间数据的处理功能更为强大。比如datetime和duration等函数,可以支持对时间的高效计算、对比、格式化显示。对这类数组的操作方法和对普通数组的操作是基本一致的。下…

dategurd oracle_Oracle 时间和日期处理

-- Oracle时间SELECT SYSDATE FROM dual; -- 系统时间SELECT SYSTIMESTAMP FROM dual; -- 当前系统时间戳SELECT CURRENT_TIMESTAMP FROM dual; -- 与时区设置有关,返回的秒是系统的,返回的日期和时间是根据时区转换过的SELECT current_date FROM dual; …

关于有多个Fragment中的textview跑马灯问题

问题描述一个activity里面有多个Fragment,1,2,3,4其中fragment1中有2个textview,在第一次启动fragment1的时候跑马灯能正常跑马; 当跳转到其他fragment后,再回到fragment1的时候,跑马灯已经不跑马了?关于这个是textview的焦点问题吗?求大神解答,,,求大神解决.... 解决方案1应…

跨设备链路聚合_路由与交换技术(华为设备)第五讲---链路聚合

前言:随着网络规模不断扩大,用户对骨干链路的带宽和可靠性提出了越来越高的要求。在传统技术中,常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽,但这种方案需要付出高额的费用,而且不够灵活。采…

电影评论分类:二分类问题

根据电影评论的 文字内容将其划分为正面或负面。 使用IMDB 数据集,它包含来自互联网电影数据库(IMDB)的50 000 条严重两极分 化的评论。数据集被分为用于训练的25 000 条评论与用于测试的25 000 条评论,训练集和测试 集都包含50%…

TensorFlow 2.0 - tf.distribute 分布式训练

文章目录1. 单机多卡 MirroredStrategy2. 多机训练 MultiWorkerMirroredStrategy3. TPU 张量处理单元学习于:简单粗暴 TensorFlow 2 1. 单机多卡 MirroredStrategy # 分布式训练 import tensorflow as tf import tensorflow_datasets as tfds# 1 单机多卡 Mirrore…

python抽象基类的作用_Python:多态、鸭子模型和抽象基类

1. 多态什么是多态-- 多态,指的是一种事务具有多种形态;-- python是一种动态语言,默认支持多态,同一个方法 调用 不同的类对象 ,执行的 结果各不相同;多态实现-- 继承:不同子类 继承 同一父类&a…

非抢占式优先级调度算法_华为鸿蒙操作系统内核真面目之抢占式和非抢占式内核...

华为鸿蒙操作系统内核真面目之抢占式和非抢占式内核众所周知华为鸿蒙操作系统内核是Linux内核。而Linux内核即是抢占式内核也是非抢占式内核。设置软件优先级在优先级在0-99之间是抢占式优先级。设置优先级在100-139之间是非抢占式优先级。从华为官方发布的信息--优先级高的任务…

windows下python 使用CRF++ python接口的配置

1. 下载包含python接口的版本的CRF并安装,安装成功后查看python文件夹包含setup.py 文件,内容如下: #!/usr/bin/env python from distutils.core import setup,Extension,os import string setup(name "mecab-python", p…

TensorFlow 2.0 - Hub 模型复用

文章目录1. tfhub2. 例子:神经风格转换3. retrain 例子学习于:简单粗暴 TensorFlow 2 1. tfhub 网址: https://hub.tensorflow.google.cn/ https://tfhub.dev/ 可以搜索,下载模型 安装包 pip install tensorflow-hub import…

微服务 注册中心的作用_102,谈谈微服务注册中心zookeeperamp;Eureka

首先,大家要明确一点微服务注册中心是一个重要的组件,解决的是服务的注册和发现的问题,而zookeeper,Eureka都只是其中一款落地实现的产品,再比如Nacos也是如此,所以关键是掌握注册中心的工作原理&#xff0…

python2转python3代码_2to3 – 自动Python 2到3代码翻译 – 开发工具(Python教程)(参考资料)...

使用2to3 2to3通常与Python解释器一起安装为脚本。它也位于Python根目录的Tools/scripts目录下 2to3的基本参数是要转换的文件或目录列表。这些目录以递归方式遍历Python源. 这是一个示例Python 2.x源文件, def greet(name): print "Hello, {0}!".format(…

文本表示

1 one-hot representation 该单词对应所在元素为1,向量中其他元素均为0,向量的维度就等于词库中的单词数目  所有向量都是互相正交的,我们无法有效的表示两个向量间的相似度  向量维度过大。 from sklearn.feature_extraction.text…

天池 在线编程 课程表(拓扑排序 + 回溯)

文章目录1. 题目2. 解题1. 题目 总共有n个课程,从0到n-1。 有些课程可能有先决条件,例如,你想修课程0,你必须先修一门课程1,这两门课之间的关系表示为:[0,1] 给定课程的总数和先决条件对的列表,返回你可以…

fence机制 linux_Linux ha fence设备测试

另外,在配置RHCS5.3时,Fence设备只ping通还不行,还必须经过测试,我在网上找了一篇IPMI的文章,现粘贴如下:What is IPMI?Intelligent Platform Management Interface[edit]AdvantagesLow cost.Available on…

Apache2.4 与 PHP 5.5 64位版的安装配置

我的环境:windows7 旗舰版 64位 首先下载相关文件: php 5.5.0 windows 64版 http://windows.php.net/download/#php-5.5 (选择 64位的下载) apache2.4 压缩版下载 http://www.apachelounge.com/download/VC11/ 下载版本一定要对应…

java 父子级json组装不用递归_2020面试阿里Java研发岗题库总结,想虐面试官不能错过的面试宝典...

前言:虽然天猫,蚂蚁金,菜鸟都归属阿里旗下,但每个面试官问的问题都不一样,相同点主要在流程方面。面试开始会让自我介绍,主要业务架构和技术架构两部分。业务架构一般不会深究,但要面试官听明白&#xff0c…

LeetCode 1748. 唯一元素的和

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 。 数组中唯一元素是那些只出现 恰好一次 的元素。 请你返回 nums 中唯一元素的 和 。 示例 1: 输入:nums [1,2,3,2] 输出:4 解释:唯一元素为 [1,3] ,和为 4…

朵唯机器人怎么连网_平遥古城推出机器人导游 可伴游还可骑行

近日,一组集景点讲解、语音互动等多种功能于一身的机器人亮相平遥古城,引发游客关注。2月27日,北京青年报记者从景区旅游公司处了解到,这批机器人导游已经上岗5天,主要是为了填补下午5点人工导游下班后,古城…