在做resnet分类的测试时,出现了这个bug:
网上给出的原因是文件导入路径的字符太长,很明显我这个不符合这个原因。还有一个说法是绝对路径相对路径的问题,具体描述如下:
在调用tf.train.Saver#save时,如果使用的路径是绝对路径(“\”),那么保存的checkpoint里面用的就是绝对路径;如果使用的是相对路径,那么保存的checkpoint里面用的就是相对路径。正确的方法应该是使用相对路径(“/”)进行保存,这样才能保证较好的可移植性。
如果使用相对路径,复制到本地之后,会报找不到文件的错误。
解决办法[1]:手动修改checkpoint文件,将绝对路径改成相对路径。checkpoint文件是一个文本文件。
我的ckpt是从服务器下载的,没有checkpoint文件,我直接改的测试文件的ckpt文件读取路径,将“//”改成了"/",成功!
验证方法;import tensorflow as tf
import os
a = tf.Variable(3)
saver = tf.train.Saver(tf.global_variables(), )
with tf.Session()as sess:
sess.run(tf.global_variables_initializer())
saver.save(sess, os.path.abspath('gen/test/'))#os.path.abspath:获取文件当前路径
插一点关于os.path.abspath()函数的介绍:
1. 输入为''./''的时候,获取的就是当前的工作路径,和os.getcwd是一样的
2.如果输入的是一个文件名称,那么就是获取当前路径和输入文件组合成的路径,与os.path.join类似
3. 如果输入的是 __file__:录取才是真正的当前文件的绝对路径。与os.path.dirname(abs_file_path)一致。
三种情况,感觉只有输入 __file__ 的时候,才是真正有用的,其他的虽然可以用,但是不小心就会用错,不值当。
比如 2,即使 工程中不存在test.py 这个文件,也会给你组合出来,并且你组合的时候并不认为自己是错的。
如果是使用os.path.join的时候,你会思考一下,这个路径是不是组合对了,但是用abspath的时候,你会想,这个是函数自己提炼出来的绝对路径,不会错。发生错误的时候,你根本就不会在意。