如何恢复只有一个扩展名为“.model”的文件的张量流模型

时间:2018-01-06 19:28:02

标签: tensorflow restore pre-trained-model

我想使用由未知作者提供的预训练张量流模型。我不知道他/她是如何设法将tensorflow模型(他/她使用tensorflow版本> = 1.2)保存到只有一个扩展名为“ .model ”的文件,因为通常我得到三个文件'.meta','。data','。index'或一个'.ckpt'文件。

如何恢复此预训练模型?如何在以后将模型保存为此格式?

感谢。

1 个答案:

答案 0 :(得分:1)

我还在很多平台上提出了这个问题,但还没有任何帮助。所以我决定做一些实验性工作,这就是我发现的。这可能很长,但请耐心等待。

要在Tensor-flow中导入模型,我们使用

with tf.Session() as sess:
  new_saver = tf.train.import_meta_graph('my_test_model-1000.meta')
  new_saver.restore(sess, tf.train.latest_checkpoint('./'))

.meta文件包含训练模型的所有变量,操作,集合等。 tf.train.latest_checkpoint('./')做的是使用检查点文件(只保存最新检查点文件的记录)来导入xxxx_model.data-00000-of-00001。此.data-00000-of-00001包含必须加载到my_test_model-1000.meta中包含的变量中的所有权重,偏差,渐变等。

摘要[半完整代码]

with tf.Session() as sess:
    new_saver = tf.train.import_meta_graph('my_test_model-1000.meta')
    #new_saver.restore(sess, tf.train.latest_checkpoint('./'))
    tensor_variable = tf.trainable_variables()
    for tensor_var in tensor_variable:
        #print(sess.run(tensor_var))
        print(tensor_var)

此初始代码将打印出.meta中可训练的所有变量。如果您尝试运行print(sess.run(tensor_var)),则会收到错误消息。这是因为,变量尚未初始化。但是,如果您取消评论new_saver.restore(sess, tf.train.latest_checkpoint('./'))并运行print(sess.run(tensor_var)),您将获得所有变量以及加载到变量中的值。

现在为“.model”

我最好的猜测是xxxxxx.model与tensorflow的xxxx_model.data-00000-of-00001非常相似。它不包含变量,所以如果你尝试

with tf.Session() as sess:
          new_saver = tf.train.import_meta_graph('xxx.model')

你会收到一个错误。请记住,原因是,此.model文件不包含任何形式的任何变量和操作图。如果你也试着做

with tf.Session() as sess:
          new_saver = tf.train.Saver()
          new_saver.restore(sess, "xxxx.model")

你同样会收到错误。这是因为没有相应的变量来加载值。因此,如果您获得xxx.model文件,则在尝试运行new_saver.restore(sess, "xxxx.model")之前,您将不得不经历复制所有变量和操作的痛苦。如果您能够复制架构,那么这将毫无问题地顺利运行。

对不起,这很长,但考虑到互联网上几乎没有答案,我不得不做一个演讲。 :)