新的检查点格式会生成三个文件:model.ckpt-1000.data-00000-of-00001
,model.ckpt-1000.meta
,model.ckpt-1000.index
。旧检查点格式仅生成两个文件:model.ckpt-1000
和model.ckpt-1000.meta
。
当我使用代码saver.restore(sess, './model.ckpt-1000')
恢复使用新检查点格式编写的模型时,它可以成功恢复模型。现在,当前目录有三个文件model.ckpt-1000.data-00000-of-00001
,model.ckpt-1000.meta
,model.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。
它是如何保存模型的?它使用旧的检查点格式吗?
答案 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