无法绘制图像:TensorFlow数据集绘图时遇图像解码错误
解决TensorFlow图像解码错误:InvalidArgumentError: Unable to decode bytes as JPEG, PNG, GIF, or BMP
Hey,这个报错我之前踩过坑!本质就是你的训练数据集里混了无法被TensorFlow识别的文件——要么是损坏的图像,要么根本就不是图像格式的文件。下面给你一步步排查和解决的方案:
第一步:排查数据集里的问题文件
你的TRAIN_DIR下应该有0、5、10三个子目录,先快速扫一遍:
- 有没有Mac系统的
.DS_Store、Windows系统的Thumbs.db这类隐藏文件? - 有没有文件名后缀不对的文件?比如把PNG改成了JPG,或者文本/其他格式文件误用了图像后缀?
- 有没有下载中断、存储损坏导致的残缺图像?
手动检查麻烦的话,写个小脚本批量验证:
from PIL import Image import os def validate_images(dataset_dir): # 遍历所有子目录和文件 for root, _, files in os.walk(dataset_dir): for filename in files: file_path = os.path.join(root, filename) try: # 用PIL打开并验证图像完整性 with Image.open(file_path) as img: img.verify() print(f"✅ 有效图像: {file_path}") except (IOError, SyntaxError) as e: print(f"❌ 无效/损坏文件: {file_path} | 错误信息: {e}") # 传入你的训练目录路径 validate_images(TRAIN_DIR)
运行后把所有标记为❌的文件删掉,或者替换成完好的图像。
第二步:加载数据集时添加容错机制
如果不想手动清理文件,也可以让TensorFlow自动跳过无效图像。修改你的数据集加载逻辑:
# 先加载原始数据集 train_dataset = tf.keras.preprocessing.image_dataset_from_directory( directory=TRAIN_DIR, labels="inferred", label_mode="int", class_names=["0","5","10"], batch_size=BATCH_SIZE, image_size=(TARGETX, TARGETY), shuffle=True, seed=SEED, validation_split=None, subset=None, interpolation="bilinear", follow_links=False, ) # 过滤掉包含无效值(比如NaN、Inf)的图像批次 def filter_invalid_images(images, labels): # 检查图像张量是否全为有限值 is_valid = tf.reduce_all(tf.math.is_finite(images), axis=[1,2,3]) return images[is_valid], labels[is_valid] train_dataset = train_dataset.map(filter_invalid_images)
第三步:验证修复效果
处理完文件或者添加过滤后,再运行你的绘图代码:
plt.figure(figsize=(10, 10)) for images, labels in train_dataset.take(1): for i in range(9): ax = plt.subplot(3, 3, i + 1) plt.imshow(images[i].numpy().astype("uint8")) plt.title(class_names[labels[i]]) plt.axis("off")
这次应该就能正常显示图像了!
内容的提问来源于stack exchange,提问作者yudhiesh
相关产品推荐
相关产品推荐

