You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法绘制图像: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 00:47:39