python - 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
目录时可以看到以下内容
- 猫-v-狗 1.1 测试 1.1.1 猫 // 这个目录是空的 1.1.2 狗 // 这个目录是空的 1.2 训练 1.2.1 猫 // 这个目录是空的 1.2.2 狗 // 这个目录是空的
- PetImages 2.1 Cat // 这有所有的猫图像 2.2 Dog // 这有所有的狗图像
- kagglecatsanddogs_3376a.zip
- MSR-LA - 3467.docx
- 自述文件1 .txt /PetImages/Cat 和 /PetImages/Dog 包含实际图像
根据我所了解的,ImageDataGenerator
API 会查找包含包含实际图像的目录的目录。但是当我运行上面的代码时,我得到了以下错误
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
有人可以帮我找出错误出在哪里我可以做些什么来修复它们编辑-添加了目录的内容
解决方案
很抱歉回答了我自己的问题,但错误是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)
推荐阅读
- amazon-web-services - AWS Cognito OIDC 自定义
- c - 为什么`pthread_rwlock_t`的ABI在不同版本之间有很大差异?
- google-apps-script - 无法获取部署 ID 错误的详细信息
- java - java.lang.NoClassDefFoundError: java/sql/Date
- azure - 如何在 Azure Kubernetes 服务上模拟可用区中断?
- javascript - react如何将事件绑定到map生成的元素
- python - 可以从 Anaconda 的 Scripts 文件夹中安全地删除 .conda_trash 文件吗?
- bash - 文件有行,前 2 行变为 1 行,后 2 行变为 1 行
- javascript - 如何按升序替换另一个数组中未找到的元素的值?
- java - 使用 ResteasyClient 发送的日志请求