我正在尝试使用在此处找到的 tensorflow 中实现的预训练 FaceNet 模型,以便对当前模型的输出运行前向传递,从而在当前模型上产生新的损失。我不想在 FaceNet 模型中训练权重,所以我会tf.stop_gradient()
在某个时候利用它。
为了在我当前的图表中添加前向传递,我正在导入整个模型结构,network = importlib.import_module(models.inception_resnet_v1))
或多或少遵循链接中的预训练网络的训练方案。因此,在我当前的模型结构中,我添加了如下内容:
network = importlib.import_module("models.inception_resnet_v1")
# set model_dir to where the ckpt file is
self.pretrained_model = os.path.expanduser(self.model_dir)
... previous model structure
然后我通过查看生成数据的 L2 和通过 facenet 推理传递的真实数据来添加我的新损失函数network.inference()
:
gen_embed = network.inference(...)
real_embed = network.inference(...)
embed_loss = tf.nn.l2-loss(real_embed-gen_embed)
然后在训练中我打电话
saver = tf.train.Saver()
sess=tf.Session()
with sess.as_default():
saver.restore(sess, self.pretrained_model)
sess.run(tf.global_variables_initializer())
但是,我得到了很多这样的输出
W tensorflow/core/framework/op_kernel.cc:993] Data loss: Unable to open table file /data/models/20170512-110547/model-20170512-110547.ckpt-250000.data-00000-of-00001: Data loss: not an sstable (bad magic number): perhaps your file is in a different file format and you need to use a different restore operator?
我只找到了一种在会话中导入训练模型和调用张量的方法。我需要使用类似的东西直接添加到我的模型结构中network.inference(data,...)
。我确信我遗漏了一些明显的东西,但我找不到任何这样的例子。我猜我的问题是:
- 我正在导入错误的模型文件或
- 我没有指定
network
需要恢复的特定变量
关于如何解决这个问题的任何想法?
澄清:
- 我正在使用版本 tf 1.0
- 我正在使用我下载的 ckpt 文件
事实证明,我需要指定网络中需要恢复的特定变量。
fn_saver = tf.train.Saver(tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,
scope='InceptionResnetV1'))
Saver 需要指定 var 以指示要恢复的权重。否则,我认为默认情况下会尝试为要训练的模型找到所有可训练的变量权重,但我只需要恢复一个模型。