我是 tensorflow 的新手,我已经被困了好几天了。现在我有以下预训练模型(4 个文件):
Classification.inception.model-27.data-0000-pf=00001
Classification.inception.model-27.index
Classification.inception.model-27.meta
checkpoint
我可以在新文件 test.py 中成功将此模型恢复为默认图形:
with tf.Session() as sess:
new_restore = tf.train.import_meta_graph('Classification.inception.model-27.meta')
new_restore.restore(sess, tf.train.latest_checkpoint('/'))
graph = tf.get_default_graph()
input_data = graph.get_tensor_by_name('input_data')
output = graph.get_tensor_by_name('logits/BiasAdd:0')
......
logits = sess.run(output, feed_dict = {input_data: mybatch})
......
上面的脚本运行良好,因为 test.py 独立于 train.py。所以我这样得到的图只是默认的。
但是,我不知道如何将此预训练模型集成到现有图形中,即将张量“输出”传递到新网络(python 代码,而不是恢复的图形)中,如下所示:
def main():
### load the meta file and restore the pretrained graph here #####
new_restore = tf.train.import_meta_graph('Classification.inception.model-27.meta')
new_restore.restore(sess, tf.train.latest_checkpoint('/'))
graph = tf.get_default_graph()
input_data = graph.get_tensor_by_name('input_data')
output1 = graph.get_tensor_by_name('logits/BiasAdd:0')
......
with tf.Graph().as_default():
with tf.variable_scope(scope, 'InceptionResnetV1', [inputs], reuse=reuse):
with slim.arg_scope([slim.batch_norm, slim.dropout], is_training = is_training):
with slim.arg_scope([slim.conv2d, slim.max_pool2d, slim.avg_pool2d]):
net = slim.conv2d(output1, 32, 3, stride = 2, scope= 'Conv2d_1a_3x3')
但是,当我将张量 output1 传递给 slim.conv2d() 时出现错误。消息是:
ValueError:Tensor("InceptionResnetV1/Conv2d_1a_3x3/BatchNorm/AssignMovingAvg:0".shape=(32,).dtype=float32_ref) 不是这个图的元素
人们通常如何处理这个问题(从 .meta 恢复图并将其输出张量连接到当前默认图的输入)?
我在网上搜索,发现与我的问题类似的东西(即连接两个不同图 tensorflow 的输入和输出张量)。但我觉得还是很不一样的。
此外,还有一些类似的方法可以恢复“.ckpt”文件,但我认为它们仍然不是我想要的。
任何意见和指导将不胜感激。谢谢。