我在“猫与狗”数据集上进行实验,我下载了数据集并将其保存为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
目录时,可以看到以下内容
根据我所了解的,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
函数。由于缩进错误,函数几乎是递归调用的。更正后的代码现在为相关问题 更多 >
编程相关推荐