保存模型
一个SavedModel
包含一个完整的TensorFlow程序,包括权重和计算。它不需要运行原始的模型构建代码,这使得它对于共享或部署(使用TFLite、TensorFlow.js、TensorFlow Serving或TensorFlow Hub)非常有用。
如果您有R中模型的代码,并且只想将权重加载到其中,请参阅训练检查点指南。
创建一个SavedModel
从Keras
为了快速介绍,本节导出一个预先训练好的Keras模型,并用它来处理图像分类请求。本指南的其余部分将补充细节并讨论其他创建方法SavedModel
年代。
图书馆(keras)图书馆(tensorflow)physical_devices < -特遣部队$配置$实验$list_physical_devices(“图形”)如果(长度(physical_devices)! =0)特遣部队$配置$实验$set_memory_growth(physical_devices [[1]],真正的)
我们将使用格蕾丝·霍珀(Grace Hopper)的一张图像作为示例,并使用Keras预先训练的图像分类模型,因为它很容易使用。自定义模型也可以,稍后将详细介绍。
文件< -get_file(“grace_hopper.jpg”,“https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg”)图书馆(魔法)#>链接到ImageMagick 6.9.9.39启用的特性:cairo, fontconfig, freetype, lcms, pango, rsvg, webp#>禁用功能:fftw, ghostscript, x11img < -image_read(文件)img < -image_draw(img)img
x < -image_load(文件,target_size =列表(224,224))% > %image_to_array()% > %mobilenet_preprocess_input昏暗的(x) < - - - - - -c(1,昏暗的(x))
pretrained_model < -特遣部队$keras$应用程序$MobileNet()result_before_save < -pretrained_model(x)仅仅< -imagenet_decode_predictions(as.matrix(result_before_save))
特遣部队$saved_model$保存(pretrained_model“/ tmp / mobilenet / 1 /”)
保存路径遵循TensorFlow Serving使用的约定,其中最后一个路径组件(1/这里)是你的模型的版本号——它允许TensorFlow Serving这样的工具推断相对新鲜度。
SavedModel
有命名函数称为签名。Keras模型在serving_default签名键下导出它们的正向传递。的SavedModel
命令行接口(见下面)用于检查SavedModel
在磁盘上:
我们可以加载SavedModel
使用tf.saved_model返回到Python。负载and see how Admiral Hopper’s image is classified.
加载< -特遣部队$saved_model$负载(“/ tmp / mobilenet / 1 /”)加载$签名$键()#(“serving_default”)# > KeysView (_SignatureMap({“serving_default”:< tensorflow.python.saved_model.load._WrapperFunction >}))
导入的签名总是返回字典。
推断出< -加载$签名(“serving_default”]推断出$structured_outputs# > act_softmax美元#> TensorSpec(shape=(None, 1000), dtype=tf。float32, name = ' act_softmax ')
运行推理从SavedModel
给出了与原始模型相同的结果。
标签< -推断出(特遣部队$常数(x,dtype =特遣部队$(pretrained_model float32))$output_names [1]]imagenet_decode_predictions(as.matrix(标签[[1]]))# > [[1]]#> class_name class_description#> 1 n03763968军装0.701242745#> 2 n02883205蝴蝶结0.186902404#> 3 n04350905适合0.026838219#> 4 n02817516熊皮0.021798020#> 5 n03929855 pickelhaube 0.008993604
的SavedModel
磁盘上的格式
一个SavedModel
是包含序列化签名和运行它们所需的状态(包括变量值和词汇表)的目录。
的saved_model.pb
文件存储了实际的TensorFlow程序或模型,以及一组命名签名,每个签名标识一个接受张量输入并产生张量输出的函数。
SavedModel
S可能包含模型的多个变体(多个v1 MetaGraphDefs美元
,以saved_model_cli的-tag_set标志标识),但这种情况很罕见。
的变量
目录包含一个标准训练检查点(请参阅训练检查点指南)。
的资产
目录包含TensorFlow图使用的文件,例如用于初始化词汇表的文本文件。在本例中不使用它。
SavedModel
S可能有一个额外的美元资产
目录用于TensorFlow图中未使用的任何文件,例如为使用者提供的关于如何处理的信息SavedModel
.TensorFlow本身并不使用这个目录。
加载一个SavedModel
在c++中
的c++版本SavedModel
loader提供了一个API来加载SavedModel
从一个路径,同时允许SessionOptions和runnoptions。您必须指定与要加载的图相关联的标记。的加载版本SavedModel
被称为SavedModel
Bundle,并包含MetaGraphDef和在其中加载它的会话。
的细节SavedModel
命令行接口
您可以使用SavedModel
命令行接口(Command Line Interface),用于检查和执行aSavedModel
.例如,您可以使用CLI来检查模型的SignatureDefs。CLI允许您快速确认输入张量的dtype和形状与模型匹配。此外,如果希望测试模型,可以使用CLI进行完整性检查,方法是传入各种格式的样例输入(例如,Python表达式),然后获取输出。
安装SavedModel
CLI
一般来说,你可以通过以下两种方式安装TensorFlow:
- 通过安装预构建的TensorFlow二进制文件。
- 通过从源代码构建TensorFlow。
如果你通过预构建的TensorFlow二进制文件安装TensorFlow,那么SavedModel
CLI已经安装在您的系统的路径名上bin / saved_model_cli
.
如果你从源代码构建TensorFlow,你必须运行以下附加命令来构建saved_model_cli:
概述的命令
的SavedModel
CLI在卡塔尔世界杯欧洲预选赛赛程表a上支持以下两个命令SavedModel
:
显示
,它显示了可用的计算SavedModel
.运行
,它运行一个从SavedModel
.
显示
命令
一个SavedModel
包含一个或多个模型变量(从技术上讲,v1。MetaGraphDef
S),由它们的标记集识别。为模特服务,你可能想知道是什么样的SignatureDefs
在每个模型变量中,它们的输入和输出是什么。的内容SavedModel
在分层秩序。这里的语法:
控件中所有可用的标记集SavedModel
:
下面的命令显示标签集所有可用的SignatureDef键:
如果标记集中有多个标记,则必须指定所有标记,每个标记用逗号分隔。例如:
显示所有的输入和输出TensorInfo
为一个特定的SignatureDef
,把SignatureDef
signature_def选项的键。当你想知道张量键值,dtype和输入张量的形状,以便以后执行计算图时,这是非常有用的。例如:
以显示所有可用的信息SavedModel
,使用-all选项。例如:
运行
命令
调用run命令来运行图形计算,传递输入,然后显示(可选地保存)输出。这里的语法:
使用: saved_model_cli run [-h]——dir dir——tag_set tag_set——signature_def .输出说明SIGNATURE_DEF_KEY(——输入输入)[——input_exprsINPUT_EXPRS][——input_examplesINPUT_EXAMPLES][——outdir outdir][——覆盖][——tf_debug]
run命令提供了以下三种向模型传递输入的方法:
——输入
选项使您能够传递numpyndarray
在文件中。——input_exprs
option允许您传递Python表达式。——input_examples
选项使您能够通过特遣部队训练美元的例子
.
——输入
要在文件中传递输入数据,请指定——输入
选项,该选项采用以下通用格式:
——输入<输入>
其中,INPUTS为以下格式之一:
< input_key > = <文件名>
< input_key > = <文件名> (< variable_name >)
您可以传递多个输入。如果要传递多个输入,则使用分号分隔每个输入。
saved_model_cli
使用numpy。负载to load the filename. The filename may be in any of the following formats:
.npy
.npz
- pickle格式
一个.npy
文件总是包含一个numpyndarray
.因此,当从.npy
文件中,内容将直接赋值给指定的输入张量。如果你用它指定一个variable_name.npy
文件,variable_name将被忽略,并发出警告。
当从.npz
(zip)文件,你可以选择指定一个variable_name来识别zip文件中的变量来加载输入张量键。如果不指定variable_name,则SavedModel
CLI将检查zip文件中只包含一个文件,并为指定的输入张量键加载它。
当从pickle文件加载时,如果方括号中没有指定variable_name,无论pickle文件中是什么,都将传递给指定的输入张量键。否则,SavedModel
命令行假定pickle文件中存储了一个字典,而对应的值是variable_name
就会被使用。
——input_exprs
要通过Python表达式传递输入,请指定——input_exprs
选择。当您没有数据文件,但仍然希望使用一些与模型的dtype和形状匹配的简单输入对模型进行完整性检查时,这可能很有用SignatureDefs
.例如:
< input_key > =[[1]、[2]、[3]]
除了Python表达式之外,还可以传递numpy函数。例如:
< input_key > = np.ones((32岁,32岁,3))
(注意,numpy
模块已经可以作为np
.)
——input_examples
通过特遣部队训练美元的例子
作为输入,指定——input_examples
选择。对于每个输入键,它接受一个字典列表,其中每个字典都是的实例特遣部队训练美元的例子
.字典键是特性,值是每个特性的值列表。例如:
< input_key > =[{“年龄”:(22日、24日),“教育”(“废话”,“女士”)})
保存输出
默认情况下,SavedModel
CLI将输出写入stdout。如果一个目录被传递到——outdir
选项,输出将被保存为.npy
在给定目录下以输出张量键命名的文件。
使用——覆盖
覆盖现有的输出文件。