经过一番研究后,您问题的最终答案是不,他们不。这是非常明显的,直到您意识到variables
目录在saved_model
是空的。
对象检测模型zoo提供的检查点文件包含以下文件:
.
|-- checkpoint
|-- frozen_inference_graph.pb
|-- model.ckpt.data-00000-of-00001
|-- model.ckpt.index
|-- model.ckpt.meta
|-- pipeline.config
`-- saved_model
|-- saved_model.pb
`-- variables
The pipeline.config
是保存的模型的配置文件,frozen_inference_graph.pb
用于现成的推理。请注意checkpoint
, model.ckpt.data-00000-of-00001
, model.ckpt.meta
and model.ckpt.index
都对应检查点. (Here https://stackoverflow.com/a/44521818/1621414你可以找到一个很好的解释)
因此,当您想要获得可训练变量时,唯一有用的是saved_model
目录。
使用 SavedModel 保存和加载模型 - 变量、图形和图形的元数据。这是一种语言中立、可恢复、密封的序列化格式,使更高级别的系统和工具能够生成、使用和转换 TensorFlow 模型。
为了恢复SavedModel
你可以使用APItf.saved_model.loader.load() https://www.tensorflow.org/guide/saved_model#loading_a_savedmodel_in_python,并且此 api 包含一个称为tags
,它指定了类型MetaGraphDef
。所以如果你想得到可训练的变量,你需要指定tag_constants.TRAINING
调用api时。
我尝试调用此 api 来恢复变量,但它给了我错误:
在 SavedModel 中找不到与标签“train”关联的 MetaGraphDef。要检查 SavedModel 中的可用标签集,请使用 SavedModel CLI:saved_model_cli
所以我这样做了saved_model_cli
命令检查所有可用的标签SavedModel
.
#from directory saved_model
saved_model_cli show --dir . --all
输出是
MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:
...
signature_def['serving_default']:
...
所以没有标签train
但只有serve
在此之内SavedModel
. The SavedModel
因此这里仅用于张量流服务。这意味着当创建这些文件时,未使用标签指定training
,无法从这些文件中恢复任何训练变量。
P.S.:以下代码是我用来恢复的SavedModel
。设置时tag_constants.TRAINING
,加载无法完成但设置时tag_constants.SERVING
,加载成功但变量为空。
graph = tf.Graph()
with tf.Session(graph=graph) as sess:
tf.saved_model.loader.load(sess, [tf.saved_model.tag_constants.TRAINING], export_dir)
variables = graph.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)
print(variables)
P.P.S:我找到了创建的脚本SavedModel
here https://github.com/tensorflow/models/blob/e7b4d364de5dc9d66d23085a5c52b5d7631576a7/research/object_detection/exporter.py#L289。可以看出确实没有train
创建时的标签SavedModel
.