如何正确拼接Google Cloud Bucket路径与目录以加载TFRecords文件?
首先咱们来拆解你遇到的两个错误:
第一个错误的根源
你用StringIO(file_io.read_file_to_string(...))把传入的Bucket路径变成了StringIO对象,而不是字符串类型。当你尝试把这个对象和DATA_DIR(字符串)相加时,Python自然会抛出类型不兼容的错误——毕竟对象和字符串没法直接拼接。
第二个错误的根源
file_io.read_file_to_string()是用来读取文件内容的,而你传入的gs://MYBucket/demo2/是一个文件夹路径,不是可读取的文件。这会导致读取失败,最终BUCKET变量变成了空值或无效内容,拼接后路径变成了TFRecords/train/train-00000-of-00002.tfrecord(相对路径),TensorFlow自然找不到存储在GCS上的文件。
正确的解决步骤
1. 直接使用传入的路径字符串
你通过--train-files传入的gs://MYBucket/demo2/本身就是一个字符串路径,根本不需要用file_io去读取它。修改main函数里的BUCKET赋值逻辑:
def main(unused_args): parser.add_argument('--train-files', help='BUCKET path to training data', nargs='+', required=True) args = parser.parse_args() global BUCKET # 直接取传入的路径字符串,不需要任何读取操作 BUCKET = args.train_files[0] ~Some other code that internally calls **Load_input()**~
2. 规范路径拼接(可选但推荐)
为了避免手动拼接字符串可能出现的斜杠问题,建议用os.path.join多参数拼接路径,替代BUCKET+DATA_DIR的写法:
def Load_input(): global BUCKET # 用os.path.join组合根路径、子目录和文件名,自动处理斜杠 filenames = [os.path.join(BUCKET, DATA_DIR, "train-0000%d-of-00002.tfrecord" % i) for i in xrange(0, 1)] for f in filenames: if not tf.gfile.Exists(f): raise ValueError("Failed to find file: " + f) filename_queue = tf.train.string_input_producer(filenames)
验证效果
修改后,生成的文件路径会是gs://MYBucket/demo2/TFRecords/train/train-00000-of-00002.tfrecord,完全匹配你GCS Bucket里的文件位置,TensorFlow的tf.gfile.Exists也能正确识别GCS路径,不会再抛出找不到文件的错误。
内容的提问来源于stack exchange,提问作者Pratik Kumar

