深度学习笔记:tf.keras.preprocessing.image_dataset_from_directory运行错误

目录

1. 概要

2. 问题描述

2.1 数据集下载和预处理

2.2 用image_dataset_from_directory加载数据

2.3 生成的三个数据集中的batch数不对?

3. 后记

  1. 概要

被tf.keras.preprocessing.image_dataset_from_directory逼疯了。。。

昨天刚写了一个博客,记录学习使用image_dataset_from_directory从目录中加载大型数据集的过程,觉得感觉不错。今天准备正式用用这个做一个深度学习模型训练实验,自信满满地开始,然后。。。遭到了暴击。。。先记录一下这个问题,不知道有没有人碰到过同样的问题。

  1. 问题描述

2.1 数据集下载和预处理

实验用数据集:猫狗数据集(cats-vs-dogs)

关于下载参见:深度学习笔记:Tensorflow BatchDataset应用示例

原始数据包存放于cats_vs_dogs目录下,其中包含cats和dogs两个子目录

为了迎合image_dataset_from_directory()的使用,基于以下代码处理从原始数据集中取一部分分别构成train, test和validation set,目录结构如下所示,每个下面都进一步包含cats和dogs两个子目录。

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras import utils

print(tf.__version__)

def make_subset(subset_name, start_index, end_index):
    for category in ("cat", "dog"):
        dir = new_base_dir / subset_name / category
        src_dir = original_dir / category
        print(dir)
        os.makedirs(dir)
        fnames = [f"{i}.jpg" for i in range(start_index, end_index)]
        for fname in fnames:
            shutil.copyfile(src=src_dir / fname, dst=dir / fname)
import os, shutil, pathlib

original_dir = pathlib.Path("F:\DL\cats-vs-dogs")
new_base_dir = pathlib.Path("F:\DL\cats_vs_dogs_small")

print(original_dir, new_base_dir)

if not os.path.exists(new_base_dir):
    make_subset("train", start_index=0, end_index=1000)
    make_subset("validation", start_index=1000, end_index=1500)
    make_subset("test", start_index=1500, end_index=2500)
else:
    print('{0} already exists, no need to copy the data again!'.format(new_base_dir))

运行后,您将得到以下目录结构:

[En]

After running, you will get the following directory structure:

深度学习笔记:tf.keras.preprocessing.image_dataset_from_directory运行错误

2.2 用image_dataset_from_directory加载数据

from tensorflow.keras.preprocessing import image_dataset_from_directory

train_dataset = image_dataset_from_directory(
    new_base_dir / "train",
    image_size=(180, 180),
    batch_size=32)
validation_dataset = image_dataset_from_directory(
    new_base_dir / "validation",
    image_size=(180, 180),
    batch_size=32)
test_dataset = image_dataset_from_directory(
    new_base_dir / "test",
    image_size=(180, 180),
    batch_size=32)

深度学习笔记:tf.keras.preprocessing.image_dataset_from_directory运行错误

到目前为止,一切都在控制之中。

[En]

So far, everything is under control.

2.3 生成的三个数据集中的batch数不对?

接下来用train_dataset进行模型训练时,运行到中途报告错误退出了,似乎是运行到一个epoch的中途没有数据了。莫名其妙。。。百思不得其解。于是回头来查看以上image_dataset_from_directory()所生成的三个数据集的内容是否正确,我用以下代码来确认以上三个数据集中的batch数是不是正确。

k = 0
for next_batch in test_dataset:
    print('k = ', k)
    k = k + 1
print(k)

深度学习笔记:tf.keras.preprocessing.image_dataset_from_directory运行错误

。。。

深度学习笔记:tf.keras.preprocessing.image_dataset_from_directory运行错误

接下来看看train_dataset什么情况:

k = 0
for next_batch in train_dataset:
    print('k = ', k)
    k = k + 1
print(k)

运行到k=37时退出,但是报告的错误跟上面的test_dataset还不一样:

深度学习笔记:tf.keras.preprocessing.image_dataset_from_directory运行错误

然后是validation_dataset什么情况:

k = 0
for next_batch in validation_dataset:
    print('k = ', k)
    k = k + 1
print(k)

这个运行到k=31正常退出,ceil(1000/32) =32符合预期(因为k是从0开始计数的)

三个dataset有两个有问题,两个有问题的数据集所报告的错误信息还不一样。 最关键的是,当我重复运行的话,每次出错的情况并不一样(test_dataset和train_dataset出错退出时的k值不一样)。。。

  1. 后记

到目前为止,我坚信,无论你遇到什么样的问题,你总是可以相信,在万能的互联网上的某个地方,肯定有人遇到了它,并给出了解决方案。但这一次,各种搜索,墙内外,中文和英文。没有发现任何描述相同或类似问题的博客或论坛帖子。我真不敢相信会有这么好的运气。

[En]

So far, I have a firm belief that no matter what kind of problem you encounter, you can always believe that someone must have encountered it and have given a solution, somewhere in the almighty Internet. But this time, all kinds of searches, inside and outside the wall, Chinese and English. No blog or forum posts or anything describing the same or similar problems were found. I can’t believe there is such good luck.

在做完上述笔记后,我想到了一种可能性:

[En]

After taking the above notes, I thought of a possibility:

我从微软网站上下载的猫狗数据集本身有问题,而恰好validation中的1000张照片是全部好照片,而train/test中则包含有错误的照片,因此每次重复运行(并没有重新创建cats_vs_dog_small目录结构)以上测试代码时,validation_dataset都没有问题,而train/test_dataset由于image_dataset_from_directory的随机性处理使得问题照片出现的batch的顺序号不同。

上述可能性还需要进一步验证。

[En]

The above possibilities need to be further verified.

Original: https://blog.csdn.net/chenxy_bwave/article/details/122146042
Author: 笨牛慢耕
Title: 深度学习笔记:tf.keras.preprocessing.image_dataset_from_directory运行错误

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/496969/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球