首页 > 解决方案 > keras 图像生成器显示“找到属于 2 个类别的 0 个图像”

问题描述

我正在对猫与狗数据集进行试验,我已将数据集下载并保存为 .zip 文件的 zip 文件/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/kagglecatsanddogs_3367a.zip。我正在使用的代码是

import os
import zipfile
import random
import tensorflow as tf
import shutil
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from shutil import copyfile

path_cats_and_dogs = "/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/kagglecatsanddogs_3367a.zip"

local_zip = path_cats_and_dogs
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir')
zip_ref.close()
try:
    shutil.rmtree("/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs")
except:
    pass
print(len(os.listdir('/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/PetImages/Cat/')))
print(len(os.listdir('/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/PetImages/Dog/')))

to_create = [
    '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs',
    '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/training',
    '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/testing',
    '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/training/cats',
    '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/training/dogs',
    '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/testing/cats',
    '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/testing/dogs'
]
for directory in to_create:
    try:
        os.mkdir(directory)
        print(directory, 'created')
    except:
        print(directory, 'failed')


def split_data(SOURCE, TRAINING, TESTING, SPLIT_SIZE):
    all_files = []
    for file_name in os.listdir(SOURCE):
        file_path = SOURCE + file_name

        if os.path.getsize(file_path):
            all_files.append(file_name)
        else:
            print('{} is zero length, so ignoring'.format(file_name))
    n_files = len(all_files)
    split_point = int(n_files * SPLIT_SIZE)

    shuffled = random.sample(all_files, n_files)

    train_set = shuffled[:split_point]
    test_set = shuffled[split_point:]

    for file_name in train_set:
        copyfile(SOURCE + file_name, TRAINING + file_name)

    for file_name in test_set:
        copyfile(SOURCE + file_name, TESTING + file_name)

    CAT_SOURCE_DIR = r'/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/PetImages/Cat/'
    TRAINING_CATS_DIR = r'/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/training/cats/'
    TESTING_CATS_DIR = r'/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/testing/cats/'

    DOG_SOURCE_DIR = r'/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/PetImages/Dog/'
    TRAINING_DOGS_DIR = r'/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/training/dogs/'
    TESTING_DOGS_DIR = r'/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/testing/dogs/'

    split_size = 0.9
    split_data(CAT_SOURCE_DIR, TRAINING_CATS_DIR, TESTING_CATS_DIR, split_size)
    split_data(DOG_SOURCE_DIR, TRAINING_DOGS_DIR, TESTING_DOGS_DIR, split_size)


model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])
model.summary()
model.compile(optimizer=RMSprop(lr=0.001), loss='binary_crossentropy', metrics=['acc'])

TRAINING_DIR = '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/training'
train_datagen = ImageDataGenerator(rescale=1. / 255)
train_generator = train_datagen.flow_from_directory(
    TRAINING_DIR,
    batch_size=10,
    class_mode='binary',
    target_size=(150, 150)
)
VALIDATION_DIR = '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/testing'
validation_datagen = ImageDataGenerator(rescale=1. / 255)
validation_generator = validation_datagen.flow_from_directory(
    VALIDATION_DIR,
    batch_size=10,
    class_mode='binary',
    target_size=(150, 150)
)

model.fit(train_generator, epochs=2, verbose=1, validation_data=validation_generator)

当我手动查看tempdir目录时可以看到以下内容

  1. 猫-v-狗 1.1 测试 1.1.1 猫 // 这个目录是空的 1.1.2 狗 // 这个目录是空的 1.2 训练 1.2.1 猫 // 这个目录是空的 1.2.2 狗 // 这个目录是空的
  2. PetImages 2.1 Cat // 这有所有的猫图像 2.2 Dog // 这有所有的狗图像
  3. kagglecatsanddogs_3376a.zip
  4. MSR-LA - 3467.docx
  5. 自述文件1 .txt /PetImages/Cat 和 /PetImages/Dog 包含实际图像

根据我所了解的,ImageDataGeneratorAPI 会查找包含包含实际图像的目录的目录。但是当我运行上面的代码时,我得到了以下错误

Found 0 images belonging to 2 classes.
Found 0 images belonging to 2 classes.
Traceback (most recent call last):
  File "/Users/supreethrao/PycharmProjects/LearnTensorFlow/cats_vs_dogs.py", line 107, in <module>
    model.fit(train_generator, epochs=2, verbose=1, validation_data=validation_generator)
  File "/Users/supreethrao/PycharmProjects/LearnTensorFlow/venv/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py", line 108, in _method_wrapper
    return method(self, *args, **kwargs)
  File "/Users/supreethrao/PycharmProjects/LearnTensorFlow/venv/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py", line 1063, in fit
    steps_per_execution=self._steps_per_execution)
  File "/Users/supreethrao/PycharmProjects/LearnTensorFlow/venv/lib/python3.7/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 1117, in __init__
    model=model)
  File "/Users/supreethrao/PycharmProjects/LearnTensorFlow/venv/lib/python3.7/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 916, in __init__
    **kwargs)
  File "/Users/supreethrao/PycharmProjects/LearnTensorFlow/venv/lib/python3.7/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 786, in __init__
    peek, x = self._peek_and_restore(x)
  File "/Users/supreethrao/PycharmProjects/LearnTensorFlow/venv/lib/python3.7/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 920, in _peek_and_restore
    return x[0], x
  File "/Users/supreethrao/PycharmProjects/LearnTensorFlow/venv/lib/python3.7/site-packages/keras_preprocessing/image/iterator.py", line 57, in __getitem__
    length=len(self)))
ValueError: Asked to retrieve element 0, but the Sequence has length 0

Process finished with exit code 1

有人可以帮我找出错误出在哪里我可以做些什么来修复它们编辑-添加了目录的内容

标签: pythonpython-3.xtensorflowkeras

解决方案


很抱歉回答了我自己的问题,但错误是split_data函数的调用方式。由于缩进中的错误,该函数几乎被递归调用。更正后的代码现在为

import os
import shutil
import zipfile
from random import shuffle

import tensorflow as tf
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.preprocessing.image import ImageDataGenerator

path_cats_and_dogs = "/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/kagglecatsanddogs_3367a.zip"

local_zip = path_cats_and_dogs
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir')
zip_ref.close()
try:
    shutil.rmtree("/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs")
except:
    pass
print(len(os.listdir('/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/PetImages/Cat/')))
print(len(os.listdir('/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/PetImages/Dog/')))

to_create = [
    '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs',
    '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/training',
    '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/testing',
    '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/training/cats',
    '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/training/dogs',
    '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/testing/cats',
    '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/testing/dogs'
]
for directory in to_create:
    try:
        os.mkdir(directory)
        print(directory, 'created')
    except:
        print(directory, 'failed')


def split_data(SOURCE, TRAINING, TESTING, SPLIT_SIZE):
    # YOUR CODE STARTS HERE
    all_images = os.listdir(SOURCE)
    shuffle(all_images)
    splitting_index = round(SPLIT_SIZE*len(all_images))
    train_images = all_images[:splitting_index]
    test_images = all_images[splitting_index:]

    for img in train_images:
        src = os.path.join(SOURCE, img)
        dst = os.path.join(TRAINING, img)
        if os.path.getsize(src) <= 0:
            print(img+" is zero length, so ignoring!!")
        else:
            shutil.copyfile(src, dst)

    for img in test_images:
        src = os.path.join(SOURCE, img)
        dst = os.path.join(TESTING, img)
        if os.path.getsize(src) <= 0:
            print(img+" is zero length, so ignoring!!")
        else:
            shutil.copyfile(src, dst)

CAT_SOURCE_DIR = '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/PetImages/Cat/'
TRAINING_CATS_DIR = '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/training/cats/'
TESTING_CATS_DIR = '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/testing/cats/'

DOG_SOURCE_DIR = '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/PetImages/Dog/'
TRAINING_DOGS_DIR = '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/training/dogs/'
TESTING_DOGS_DIR = '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/testing/dogs/'

split_size = 0.9
split_data(CAT_SOURCE_DIR, TRAINING_CATS_DIR, TESTING_CATS_DIR, split_size)
split_data(DOG_SOURCE_DIR, TRAINING_DOGS_DIR, TESTING_DOGS_DIR, split_size)


model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])
model.summary()
model.compile(optimizer=RMSprop(lr=0.001), loss='binary_crossentropy', metrics=['acc'])

TRAINING_DIR = '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/training'
train_datagen = ImageDataGenerator(rescale=1. / 255)
train_generator = train_datagen.flow_from_directory(
    TRAINING_DIR,
    batch_size=10,
    class_mode='binary',
    target_size=(150, 150)
)
VALIDATION_DIR = '/Users/supreethrao/PycharmProjects/LearnTensorFlow/tempdir/cats-v-dogs/testing'
validation_datagen = ImageDataGenerator(rescale=1. / 255)
validation_generator = validation_datagen.flow_from_directory(
    VALIDATION_DIR,
    batch_size=10,
    class_mode='binary',
    target_size=(150, 150)
)

model.fit(train_generator, epochs=2, verbose=1, validation_data=validation_generator)

推荐阅读