TensorFlow Model export

以TensorFlow Sample中的iris分类任务为例。
sample git仓库地址:https://github.com/tensorflow/models
iris目录:models/samples/core/get_started/premade_estimator.py

这个例子创建一个鸢尾花分类模型。该模型将鸢尾花分为三个类型:Setosa(山鸢尾)、Versicolor(杂色鸢尾)、Virginica(弗吉尼亚鸢尾),模型根据[萼片和花瓣]的[长度和宽度]这四个属性来推断是哪种鸢尾花。种类的翻译可能有误,但是无所谓,就是一种类别...
训练样本和测试样本的数据是从csv中读取的,前四个是属性,最后一个是分类标签:

CSV_COLUMN_NAMES = ['SepalLength','SepalWidth','PetalLength','PetalWidth','Species']
#如下四组数据:
#5.9, 3.0, 4.2, 1.5, 1
#6.9, 3.1, 5.4, 2.1, 2
#5.1, 3.3, 1.7, 0.5, 0
#6.0, 3.4, 4.5, 1.6, 1

Sample中使用具有10*10隐藏层的三分类DNN分类器,默认激活函数是relu,损失函数是softmax_cross_entropy_loss。

Sample中的训练数据为120组,经过shuffle打乱,无限重复,然后分批次(每批次batch_size=100),按批迭代训练1000次(train_steps)。训练数据量:100 * 1000(即batch_size * train_steps)。
Sample中没有输出模型和输出模型的使用,在此补上相关知识。

  1. CLI方式导出
feature_map = {}
#定义cli输入属性名,并映射为模型的输入Tensor名
for i in range(len(iris_data.CSV_COLUMN_NAMES) -1):
    feature_map[iris_data.CSV_COLUMN_NAMES[i]] = tf.placeholder(tf.float32,shape=[None],name=iris_data.CSV_COLUMN_NAMES[i])
#将训练后的模型导出到目录./iris/下
classifier.export_savedmodel(export_dir_base='./iris/',serving_input_receiver_fn=tf.estimator.export.build_raw_serving_input_receiver_fn(feature_map))

导出后的模型位于当前目录下的iris文件夹下,以时间戳为名的文件夹中。
在TensorFlow安装目录的bin文件夹下有saved_model_cli,是cli执行文件。可在shell中执行如下指令,来使用导出的model:

saved_model_cli run --dir iris/1524451065/ --tag_set serve --signature_def predict --input_exprs 'SepalLength=[5.1, 5.9, 6.9];PetalLength=[1.7, 4.2, 5.4];PetalWidth=[0.5, 1.5, 2.1];SepalWidth=[3.3, 3.0, 3.1]'
//输出如下
Result for output key class_ids:
[[0]
 [1]
 [2]]
Result for output key classes:
[['0']
 ['1']
 ['2']]
Result for output key logits:
[[  4.9489717  -0.6004308 -24.400116 ]
 [ -5.10651     2.5732546  -3.476701 ]
 [ -7.8528028   1.4337913   5.3207707]]
Result for output key probabilities:
[[9.9612528e-01 3.8747080e-03 1.7871768e-13]
 [4.6078415e-04 9.9718791e-01 2.3513364e-03]
 [1.8619706e-06 2.0095062e-02 9.7990304e-01]]

上面在cli中输入了三组数据,运用模型预测结果分别输入分类0,1,2,logits和probabilities是模型输出结果和softmax结果,代表三组数据属于三个分类的概率。

也可以运行如下指令来查看导出model的SignatureDef,所谓SignatureDef就是模型的输入输出情况:

saved_model_cli show --dir iris/1524451065/ --tag_set serve --signature_def predict

//输出情况大致如下:
The given SavedModel SignatureDef contains the following input(s):
inputs['PetalLength'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1)
    name: PetalLength:0
inputs['PetalWidth'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1)
    name: PetalWidth:0
inputs['SepalLength'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1)
    name: SepalLength:0
inputs['SepalWidth'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1)
    name: SepalWidth:0
The given SavedModel SignatureDef contains the following output(s):
outputs['class_ids'] tensor_info:
    dtype: DT_INT64
    shape: (-1, 1)
    name: dnn/head/predictions/ExpandDims:0
outputs['classes'] tensor_info:
    dtype: DT_STRING
    shape: (-1, 1)
    name: dnn/head/predictions/str_classes:0
outputs['logits'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1, 3)
    name: dnn/logits/BiasAdd:0
outputs['probabilities'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1, 3)
    name: dnn/head/predictions/probabilities:0
Method name is: tensorflow/serving/predict
  1. Serving方式
    根据官网提供的Installing from source方法安装Serving。系统平台osx 10.11.6。主要步骤如下
# 在tensorFlow目录下拉代码:/Users/xxx/mycode/tensorFlow
cd tensorFlow
# 切换python环境virtualenv
source bin/activate

git clone --recurse-submodules https://github.com/tensorflow/serving
cd serving
# 开始编译
bazel build -c opt tensorflow_serving/...

#注意:
#1. mac上xcode的版本要在8.0版本以上,不然编译报错pthread。
#2. 编译过程中可能出现python依赖模块的缺失,安装好继续编译就好。
#3. python最好切换到virtualenv环境下,在系统环境下有些模块的版本无法升级,导致编译不通过。
#4. 编译产物在bazel-bin下,model server位置:
# bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容