#python #tensorflow #tf.keras #data-preprocessing
Вопрос:
Я хочу классифицировать около 2000 классов изображений. поэтому я использовал ImageDataGenerator, каталог flow_from_directory.
Я создал основной каталог и 2000 подкаталогов.
в главном каталоге(тест1)
В каждом подкаталоге есть 20 изображений
(всего около 40 тыс. изображений)
И я проверил генератор по этому сценарию.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
trainDataGen = ImageDataGenerator(rescale=1./255)
trainGenSet = trainDataGen.flow_from_directory(
'./test1',
batch_size=8,
target_size=(64,64),
class_mode='categorical',
color_mode='grayscale'
)
import numpy as np
import matplotlib.pyplot as plt
a = trainGenSet.next()
plt.imshow(a[0][0])
print(np.argmax(a[1][0]))
plt.show()
Затем я увидел, что изображение не соответствует этикетке
например) a[0][0] имеет 300-е изображения, но a[1][0] имеет 1948-е!!
Но генератор нормально работал менее чем в 10 классах.
Я протестировал 10 классов(изображение цифры 0 ~ 9)
Тогда генератор работал нормально!
Почему генератор может генерировать правильную пару менее чем для 10 классов и не может генерировать правильную пару более чем для 10 классов??
Ответ №1:
В каталоге flow_from_directory вы не указали значение параметра shuffle, поэтому по умолчанию оно равно True. Попробуйте установить значение False. Также помните, что в файлах и каталогах python a выбирается в алфавитно-цифровом порядке. Например, ваш список классов выглядит так [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] каталоги классов будут извлечены генератором в порядке 0,1,10,11,12,13,14,15,16,17,18,19,2,20, 3,4,5,6,7,8,9. Вот почему у вас, когда у вас более 10 подкаталогов, порядок не такой, как вы ожидаете. Вы можете избежать этого, используя заполнение «нулями» для имен ваших подкаталогов, таких как 0000 0001 0002 0003 и т. Д. 0001999 Помните, что файлы также извлекаются в алфавитно-цифровом порядке