Ошибка деления на ноль в выборке файлов: откуда она там могла появиться?
Реализую на Python в рамках задачи классификации картинок собак и кошек. Алгоритм: он берет из предустановленной базы данных изображения и раскладывает по двум классам. Однако странно, что получаю ошибку в выборке таких файлов:
ZeroDivisionError: integer division or modulo by zero
Код:
# функция-генератор загрузки обучающих данных с диска
# берем по 32 картинки в батче, т.к. в силу объема не можем загрузить их сразу все
def fit_generator(files, batch_size=32):
"""Функция принимает картинки (х) и возвращает 1 и 0 (собака или кот) - это y
Загружаем картинки для обучения"""
# выбираем, что меньше: если количество переданных файлов меньше batch_size=32,
# то за batch_size будет взято число len(files):
batch_size = min(batch_size, len(files))
while True:
shuffle(files) # перемешиваем файлы
# len(files) // batch_size - определяет количество батчей,
# на которые поделилось все множество:
for k in range(len(files) // batch_size):
i = k * batch_size # скажем, второй батч: i=2*32, затем: 3*32 и т.д.
j = i + batch_size
if j > len(files):
j = - j % len(files)
x = np.array([load_image(path) for path in files[i:j]])
y = np.array([1. if os.path.basename(path).startswith('dog') else 0.
for path in files[i:j]])
yield (x, y)
# Компилируем модель и запускаем обучение:
model.compile(optimizer='adam',
# binary_crossentropy принимает на вход вероятность 1 и 0: и считает, что вероятней, давая на выход 1 или 0
loss='binary_crossentropy',
metrics=['accuracy'])
# число изображений в валидационной выборке:
val_samples = 5
shuffle(train_files) # перемешиваем обучающую выборку
# считываем один батч для валидации
# здесь batch_size = val_samples = 5
validation_data = next(fit_generator(train_files[:val_samples], val_samples))
# считав 1 батч, оставшиеся файлы берем для обучения:
train_data = fit_generator(train_files[val_samples:]) # данные читаем функцией-генератором
# запускаем процесс обучения
model.fit(train_data,
steps_per_epoch=10, # количество вызовов генератора за эпоху
epochs=100, # количество эпох обучения
validation_data=validation_data)
Ответы (1 шт):
Автор решения: ПИТОНИСТ версия-3-8
→ Ссылка
Деления только два:
1.j = - j % len(files)
2.for k in range(len(files) // batch_size):
Значит либо len(files)=0, либо batch_size=0. Пересмотрите эти переменные / файлы