在做resnet分类的测试时,出现了这个bug:

               ValueError: The passed save_path is not a valid checkpoint_相对路径

        网上给出的原因是文件导入路径的字符太长,很明显我这个不符合这个原因。还有一个说法是绝对路径相对路径的问题,具体描述如下:

        在调用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的时候,你会想,这个是函数自己提炼出来的绝对路径,不会错。发生错误的时候,你根本就不会在意。