TensorFlow服务,托管模型并提供远程访问。TensorFlow服务有一个很好的文档的架构和有用的教程。不幸的是,这个有点难用,你需要做较大改动来为自己的模型提供服务。
安装测试使用请参看 安装并测试demo
作为一个例子,采取了一个GAN模型的半监督学习:
您可以在我的GitHub信息库中找到实现细节。
主要步骤是:
对于正在使用TensorFlow创建Deep Learning模型的任何人来说,前两个步骤非常简单,我不想在这里详细介绍。但是最后两个步骤对我来说是相当新的,我花了一些时间来了解它的工作原理和所需要的。
TensorFlow服务实现运行机器学习模型的服务器,并提供对它们的远程访问。常见的任务是提供数据(例如图像)的预测和分类。
几个技术亮点:
所以我需要将我的模型导出到Protobuf。Protobuf协议缓冲区(或Protobuf)允许高效的数据序列化。它是一个软件的开源软件,已经开发出来了…,对,谷歌:-)
TensorFlow服务提供SavedModelBuild类,将模型保存为Protobuf。这里描述很好。
我的GAN模型接受一个形状[batch_num,width,height,channels]的图像张量,其中批次数为1,用于投放(您只能预测一个图像在时间),宽度和高度为32像素,图像通道数为3必须对输入图像进行缩放,使每个像素在[-1,1]的范围内,而不在[0,255]的范围内。
从另一方面,服务模式必须接受JPEG图像作为输入,因此为了服务,我需要注入层以将JPEG转换为所需的图像张量。
首先,我实现了图像转换。这对我来说有点棘手。
serialized_tf_example = tf.placeholder(
tf.string,name ='input_image')
feature_configs = {'image / encoded':tf.FixedLenFeature(
shape = [],
dtype = tf.string),}
tf_example = tf.parse_example(serialized_tf_example,feature_configs)
jpegs = tf_example ['image / encoded']
images = tf.map_fn(preprocess_image,jpegs,dtype = tf.float32)
image = tf.squeeze(images,[0])
#现在图像形状是(1,?,?,3)
基本上,您需要一个占位符,用于串行输入图像,功能配置(字典名称到功能),您可以列出预期输入(在我的情况下为JPEG格式的图像/编码)和功能类型。然后,您解析序列化示例并从中提取JPEG。最后一步是将JPEG转换为所需的图像张量。请参阅我的GitHub的实现细节(preprocess_image方法)。
然后我可以使用该图像张量作为我的GAN模型的输入,创建会话对象并加载保存的检查点。
......
net = GAN(images,z_size,learning_rate,drop_rate = 0。)
......
saver = tf.train.Saver()
whth tf.Session() as sess:
#从上一个检查点恢复模型
ckpt = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir)
saver.restore(sess,ckpt.model_checkpoint_path)
......
接下来的挑战是,如何使用提供的SavedModelBuilder将还原的模型转换为Protobuf。
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
您必须使用输入,输出和方法名称(例如分类或预测)创建所谓的签名。TensorFlow提供了一个方法tf.saved_model.utils.build_tensor_info来创建张量信息。我用它来定义输入和输出(在我的情况下的分数)。
predict_tensor_inputs_info = \
tf.saved_model.utils.build_tensor_info(jpegs)
predict_tensor_scores_info = \
tf.saved_model.utils.build_tensor_info(net.discriminator_out)
现在我准备好创建签名。
prediction_signature =(
tf.saved_model.signature_def_utils.build_signature_def(
inputs = {'images':predict_tensor_inputs_info},
outputs = {'scores':predict_tensor_scores_info},
method_name = \
tf.saved_model.signature_constants.PREDICT_METHOD_NAME)
“图像”和“分数”是预定义的名称,您必须在输入和输出字典中使用它们。
在教程 TensorFlow团队中创建两个签名 – 一个用于分类,一个用于预测。我不想要任何分类结果,所以预测签名对我来说足够了。
最后一步 – 保存模型。
legacy_init_op = tf.group(tf.tables_initializer(),
name ='legacy_init_op')
builder.add_meta_graph_and_variables(
sess,
[tf.saved_model.tag_constants.SERVING],
signature_def_map = {'predict_images':prediction_signature},
legacy_init_op = legacy_init_op)
builder.save()
这是非常简单的,现在你的模型存储为Protobuf。导出文件夹的结构应该是:
工作的第一部分完成 – 模型成功导出为Protobuf。
我在以下环境中开发和测试:
以下是您需要执行的步骤,以便自己尝试。
cd ~
git clone <a class="markup--anchor markup--pre-anchor" href="https://github.com/Vetal1977/tf_serving_example.git" target="_blank" rel="nofollow noopener" data-href="https://github.com/Vetal1977/tf_serving_example.git">https://github.com/Vetal1977/tf_serving_example.git
</a>cd tf_serving_example
python3 svnh_semi_supervised_model_train.py
下载date 约需5-10分钟,并测试街景房屋号码数据集和另一个测试集合 需要20分钟训练模型(在我的环境中)。
ls ./checkpoints
您应该看到数据,索引和元数据文件。
python3 svnh_semi_supervised_model_saved.py --checkpoint-dir =。/ checkpoints --output_dir =。/ gan-export --model-version = 1
应打印出以下内容
成功将GAN模型版本'1'导出到'./gan-export'
如果你输入
ls ./gan-export/1
你应该得到变量文件夹和saved_model.pb文件。
启动接口服务
tensorflow_model_server --port=9000 --model_name=gan --model_base_path=/home/abc/Desktop/tf_serving_example-master/gan-export
首先从二进制文件中恢复为图像文件
python3 svnh_semi_supervised_model_save_test_images.py
可以从该目录下看到svnh_test_images 随机抽取64张的门派图像
发起请求
python svnh_semi_supervised_client.py --server=localhost:9000 --image=./svnh_test_images/image_22.jpg
返回信息如下:
outputs {
key: "scores"
value {
dtype: DT_FLOAT
tensor_shape {
dim {
size: 1
}
dim {
size: 10
}
}
float_val: 9.66807189862e-10
float_val: 0.000227736207307
float_val: 0.980206489563
float_val: 8.44745736686e-05
float_val: 0.0005895147915
float_val: 4.84909996601e-08
float_val: 2.95252248179e-05
float_val: 0.0188583470881
float_val: 3.83840551876e-06
float_val: 9.54504270761e-12
}
}
其中的float_val 就是其softmax的数值,可以这么理解,从上到下共计10行,代表该图对其数值 0-9的分别预测信心度,越靠近1则信心越高,
我测试的图是
则float第三行 的数值是最大的。说明预测对了
训练过程如下:
Raising pool_size_limit_ from 100 to 110
Classifier train accuracy: 0.19
Classifier test accuracy 0.136140135218
Step time: 0.05168628692626953
Epoch time: 22.38613224029541
Epoch 1
Classifier train accuracy: 0.244
Classifier test accuracy 0.274585125999
Step time: 0.030593395233154297
Epoch time: 21.693989753723145
Epoch 2
Classifier train accuracy: 0.394
Classifier test accuracy 0.445221266134
Step time: 0.030382871627807617
Epoch time: 21.80638337135315
Epoch 3
Classifier train accuracy: 0.58
Classifier test accuracy 0.533804548248
Step time: 0.03650689125061035
Epoch time: 21.941813707351685
原创文章,转载请注明: 转载自URl-team
本文链接地址: tensoflow serving 实战之GAN 识别门牌号的识别服务接口