Keras/TensorFlow写入TFRecord时触发encode缺参、文件不存在报错
TensorFlow 保存TFRecords 双报错修复方案
触发的报错信息
- 第一处报错:
TypeError: encode() missing 1 required positional argument: 'encoding' - 注释第一处报错对应代码后,第二处报错:
NotFoundError: 519_IM-2131-2001.dcm.png; No such file or directory [Op:ReadFile]
根因定位
两个报错相互独立,不存在因果关系:
- 编码报错:代码中写的
caption.str.encode()存在两个问题:一是单条caption是Python原生字符串类型,不存在.str访问器(该访问器是pandas Series专属的字符串处理接口);二是Python原生字符串的encode()方法必须传入编码参数,缺省参数就会触发该类型错误。 - 文件找不到报错:传入
tf.io.read_file()的图片路径不完整/路径错误,代码未做路径校验直接读取不存在的文件,触发文件不存在错误。
核心报错代码片段
def bytes_feature(value): return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) def create_example(image_path, caption): feature = { "caption": bytes_feature(caption.str.encode()), # 第一处报错行 "raw_image": bytes_feature(tf.io.read_file(image_path).numpy()), # 第二处报错行 } return tf.train.Example(features=tf.train.Features(feature=feature))
修复步骤
1. 修正caption编码逻辑
单条字符串直接调用encode方法,传入utf-8编码参数即可,删除多余的.str访问器:
"caption": bytes_feature(caption.encode("utf-8")),
只有批量处理pandas Series格式的caption列时,才需要使用
.str.encode("utf-8")写法,遍历得到的单条caption是原生字符串,不需要该访问器。
2. 修正图片路径,增加有效性校验
- 先确认
image_paths列表中存储的是文件名、相对路径还是绝对路径:如果是文件名/相对路径,需要先拼接图片存储的根目录,生成完整绝对路径再传入读取接口 - 批量写入前过滤掉不存在的路径,避免任务运行中途中断
参考修复代码:
import os # 配置图片存储的根目录,替换为你实际的图片文件夹路径 IMAGE_ROOT_DIR = "/path/to/your/dataset/images" def filter_valid_paths(path_list): valid_paths = [] for path in path_list: # 拼接成完整绝对路径 full_path = path if os.path.isabs(path) else os.path.join(IMAGE_ROOT_DIR, path) if os.path.exists(full_path): valid_paths.append(full_path) return valid_paths # 初始化训练、验证集路径时先做过滤 train_image_paths = filter_valid_paths(image_paths[:train_size]) valid_image_paths = filter_valid_paths(image_paths[-valid_size:])
3. 写入前验证
正式批量写入前,先打印3-5条处理后的image_path,手动确认路径对应文件存在,再启动全量写入任务即可。
内容的提问来源于stack exchange,提问作者albert
相关产品推荐
相关产品推荐

