Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TF目标检测动物园模型不';你没有可训练的变量吗?_Python_Tensorflow_Object Detection_Object Detection Api_Pre Trained Model - Fatal编程技术网

Python TF目标检测动物园模型不';你没有可训练的变量吗?

Python TF目标检测动物园模型不';你没有可训练的变量吗?,python,tensorflow,object-detection,object-detection-api,pre-trained-model,Python,Tensorflow,Object Detection,Object Detection Api,Pre Trained Model,中的模型有meta+ckpt文件、freezed.pb文件和保存的_模型文件 我尝试使用meta+ckpt文件进行进一步训练,并提取特定张量的权重,以用于研究目的。我看到模型没有任何可训练的变量 vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES) print(vars) 上面的代码片段给出了一个[]列表。我还试着使用以下方法 vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABL

中的模型有meta+ckpt文件、freezed.pb文件和保存的_模型文件

我尝试使用meta+ckpt文件进行进一步训练,并提取特定张量的权重,以用于研究目的。我看到模型没有任何可训练的变量

vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)
print(vars)
上面的代码片段给出了一个
[]
列表。我还试着使用以下方法

vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES)
print(vars)
我再次得到一个
[]
列表

这怎么可能?模型是否去掉了变量?或者是
tf.变量(trainable=False)
?在哪里可以获得带有有效可训练变量的meta+ckpt文件。我特别关注SSD+mobilnet型号

更新:

下面是我用来还原的代码片段。它位于类中,因为我正在为某些应用程序制作自定义工具

def _importer(self):
    sess = tf.InteractiveSession()
    with sess.as_default():
        reader = tf.train.import_meta_graph(self.metafile,
                                            clear_devices=True)
        reader.restore(sess, self.ckptfile)

def _read_graph(self):
    sess = tf.get_default_session()
    with sess.as_default():
        vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)
        print(vars)
更新2:

我还尝试了以下代码片段。简单的恢复风格

model_dir = 'ssd_mobilenet_v2/'

meta = glob.glob(model_dir+"*.meta")[0]
ckpt = meta.replace('.meta','').strip()

sess = tf.InteractiveSession()
graph = tf.Graph()
with graph.as_default():
    with tf.Session() as sess:
        reader = tf.train.import_meta_graph(meta,clear_devices=True)
        reader.restore(sess,ckpt)

        vari = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)
        for var in vari:
            print(var.name,"\n")

上面的代码片段还提供了变量列表。经过一点研究,您的问题的最终答案是:不,他们没有。很明显,直到您意识到
saved_model
中的
variables
目录是空的

对象检测模型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
pipeline.config
是保存的模型的配置文件,
freezed\u expression\u graph.pb
用于现成的推理。请注意,
checkpoint
model.ckpt.data-00000-of-00001
model.ckpt.meta
model.ckpt.index
都对应于检查点。(你可以找到一个很好的解释)

因此,当您想要获取可训练变量时,唯一有用的是
保存的\u model
目录

使用SavedModel保存和加载模型变量、图形和图形的元数据。这是一种与语言无关的、可恢复的、封闭的序列化格式,使更高级别的系统和工具能够生成、使用和转换TensorFlow模型

要恢复
SavedModel
,您可以使用该api,该api包含一个名为
tags
的参数,该参数指定
MetaGraphDef
的类型。因此,如果要获取可训练变量,则需要在调用api时指定
tag_常量.TRAINING

我试图调用这个api来恢复变量,但它却给了我一个错误

在SavedModel中找不到与标记“train”关联的MetaGraphDef。要检查SavedModel中的可用标记集,请使用SavedModel CLI:
saved\u model\u CLI

因此,我执行了这个
saved\u model\u 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']:
  ...
因此,在这个
SavedModel
中没有标签
train
,只有
service
。因此,此处的
SavedModel
仅用于tensorflow服务。这意味着当这些文件在创建时未使用标记
training
指定时,无法从这些文件中恢复任何训练变量

注意:下面的代码是我用来恢复
SavedModel
的。当设置
tag_常量。TRAINING
时,加载无法完成,但当设置
tag_常量。service
时,加载成功,但变量为空

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
的脚本。可以看出,在创建
SavedModel

时,确实没有
train
标记。为了提高性能,图形可能已将变量替换为常量。但是,我不知道在哪里可以找到可训练的模型。@Addy我知道
.Pb
文件会将变量转换为常量以提高推理性能。但是meta+ckpt是用来访问变量进行进一步培训的。如果我错了,请纠正我。因为,这些都是相同的
chkpt
,可用于恢复和优化tf管道配置文件中的模型。从您提供的链接中我看到,
.ckpt
文件也应该包含可训练的变量。因此,我唯一没有看到代码的地方是,您可能没有正确加载检查点,或者它没有加载到默认图形。如果您提供了一个包含还原本身的代码示例,则可以说得更多。@Addy我已经用我为导入所做的最小代码片段进行了更新。此代码段经过了许多其他模型的完美测试,这些模型是
meta+ckpt
。现在我在想,detection zoo模型是否可能是meta+ckpt的不同版本?不清楚,谢谢你的详细解释。因此,在结论中,你是说,Tf没有给一个模型提供链接,这个模型有可训练的变量,但只有可推理的模型?另外,添加到您提到的管道配置中,我是否可以使用上述检查点运行管道,并在配置中指定保存可训练模型的保存方法?但我必须说,有一种方法可以获得所有可训练变量。只要通过运行
model_main.py
启动培训课程,就会创建一个图表,您可以拥有可培训变量(使用tensorboard,您可以检查链接到操作
培训的所有变量)。但是对于动物园里提供的预训练模型,你似乎无法从中获得可训练的变量。太好了。我一定会试试的。最后一个问题,我是否应该单独构建
tensorflow/models
repo?或者只是克隆可以直接运行?如果你能告诉我哪里是
model\u main.py
,那会很有帮助。只需克隆repo。但是您必须安装api fir
#from directory saved_model
saved_model_cli show --dir . --all