7.2 导出训练好的模型
一旦模型训练完毕并准备进行评估,便需要将数据流图及其变量值导出,以使其可为产品所用。
模型的数据流图应当与其训练版本有所区分,因为它必须从占位符接收输入,并对其进行单步推断以计算输出。对于Inception模型这个例子,以及对于任意一般图像识别模型,我们希望输入是一个表示了JPEG编码的图像字符串,这样就可轻易地将它传送到消费App中。这与从TFRecord文件读取训练输入颇为不同。
定义输入的一般形式如下:
在上述代码中,为输入定义了占位符,并调用了一个函数将用占位符表示的外部输入转换为原始推断模型所需的输入格式。例如,我们需要将JPEG字符串转换为Inception模型所需的图像格式。最后,调用原始模型推断方法,依据转换后的输入得到推断结果。
例如,对于Inception模型,应当有下列方法:
这个推断方法要求各参数都被赋值。我们将从一个训练检查点恢复这些参数值。你可能还记得,在前面的章节中,我们周期性地保存模型的训练检查点文件。那些文件中包含了当时学习到的参数,因此当出现异常时,训练进展不会受到影响。
训练结束时,最后一次保存的训练检查点文件中将包含最后更新的模型参数,这正是我们希望在产品中使用的版本。
要恢复检查点文件,可使用下列代码:
对于Inception模型,可从下列链接下载一个预训练的检查点文件:http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gz。
最后,利用tensorflow_serving.session_bundle.exporter.Exporter类将模型导出。我们通过传入一个保存器实例创建了一个它的实例。然后,需要利用exporter.classification_signature方法创建该模型的签名。该签名指定了什么是input_tensor以及哪些是输出张量。输出由classes_tensor构成,它包含了输出类名称列表以及模型分配给各类别的分值(或概率)的socres_tensor。通常,在一个包含的类别数相当多的模型中,应当通过配置指定仅返回tf.nn.top_k所选择的那些类别,即按模型分配的分数按降序排列后的前K个类别。
最后一步是应用这个调用了exporter.Exporter.init方法的签名,并通过export方法导出模型,该方法接收一个输出路径、一个模型的版本号和会话对象。
由于对Exporter类代码中自动生成的代码存在依赖,所以需要在Docker容器内部使用bazel运行我们的导出器。
为此,需要将代码保存到之前启动的bazel工作区内的exporter.py中。此外,还需要一个带有构建规则的BUILD文件,类似于下列内容:
然后,可在容器中通过下列命令运行导出器:
它将依据可从/tmp/inception-v3中提取到的检查点文件在/tmp/inception-v3/{current_timestamp}/中创建导出器。
注意,首次运行它时需要花费一些时间,因为它必须要对TensorFlow进行编译。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论