如何在没有索引文件和元文件的情况下恢复tensorflow模型?

时间:2017-07-24 11:44:47

标签: python tensorflow

新的检查点格式会生成三个文件:model.ckpt-1000.data-00000-of-00001model.ckpt-1000.metamodel.ckpt-1000.index。旧检查点格式仅生成两个文件:model.ckpt-1000model.ckpt-1000.meta

当我使用代码saver.restore(sess, './model.ckpt-1000')恢复使用新检查点格式编写的模型时,它可以成功恢复模型。现在,当前目录有三个文件model.ckpt-1000.data-00000-of-00001model.ckpt-1000.metamodel.ckpt-1000.index。如果我删除model.ckpt-1000.index,则无法恢复模型。错误信息:DataLossError (see above for traceback): Unable to open table file ./model.ckpt-1000: 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?

但我注意到tensorflow pretrained model只有一个文件:*.ckpt。当我使用tensorflow提供的预训练模型时,它可以成功恢复。它不需要*.index文件。

我的张量流版本是1.1.0。

它是如何保存模型的?它使用旧的检查点格式吗?

1 个答案:

答案 0 :(得分:3)

我相信它确实使用了旧的检查点格式。这是我用来验证的一个简单例子:

import tensorflow as tf

slim = tf.contrib.slim

x = tf.placeholder(tf.float32, [None, 16])
y = slim.fully_connected(x, 4)

saver_v1 = tf.train.Saver(write_version=tf.train.SaverDef.V1)

saver_v2 = tf.train.Saver()

with tf.Session() as sess:

    sess.run(tf.global_variables_initializer())

    saver_v1.save(sess, 'model_v1.ckpt',
                  write_meta_graph=False,
                  write_state=False)

    saver_v2.save(sess, 'model_v2.ckpt',
                  write_meta_graph=False,
                  write_state=False)

运行脚本后ls model*的结果:

model_v1.ckpt  model_v2.ckpt.data-00000-of-00001  model_v2.ckpt.index