#keras #deep-learning
#keras #глубокое обучение
Вопрос:
Допустим, у меня есть несколько изображений, разделенных на 3 категории («кошка», «собака», «мышь»), и моя сеть DL написана на keras. Дизайн, который я использовал, такой же, как на этом рисунке (1):
Я разделил данные на три разные папки: обучение, проверка и тестирование. Сеть должна быть способна распознавать кошку, собаку или мышь по изображению. Точность, которую я получаю, составляет около 98%.
Это работает. Но мне нужно по некоторым причинам изменить этот дизайн. Я хотел бы использовать K-кратный процесс перекрестной проверки, и теперь схема должна выглядеть как (2):
Теперь моя проблема в том, что я не знаю, как разделить и распределить исходные данные в соответствии со схемой на рис. 2.
Я могу представить только 2 разных способа. Давайте на мгновение забудем о тестовом каталоге:
-
Я создаю 2 папки: «Обучение» и «Проверка». В обоих случаях структура такая же, как на фиг. 1: Три подкаталога для каждой категории. Теперь проблема в следующем: должен ли я перемещать данные при переходе от сгиба 1 к сгибу 3? Или я могу один раз распределить изображения по подкаталогам?
-
Я создаю 2 папки: «Обучение» и «Проверка», НО я смешиваю все изображения вместе. Нет подкаталога. В этом случае у меня проблема в том, что я теряю связь между именем изображения и домашним животным на нем. Как я могу сообщить Keras, какое животное следует идентифицировать?
Лично я бы смешал все изображения вместе, независимо от того, что они показывают. Но я бы сохранил информацию о содержимом в файле. В этом случае я передаю Keras каталог (для проверки или обучения) и файл, содержащий имена всех файлов и их содержимое.
Что бы вы предложили?
Ответ №1:
Хорошо, я могу ответить на свой собственный вопрос.
Самый простой способ — просто Kfold
создать форму пользователя sklearn
в скрипте python
from sklearn.model_selection import KFold
После этого вам необходимо выполнить проверку KFold
kfold = KFold(n_splits = 4, shuffle = True)
и вы выполняете итерацию по разделенному набору данных, например:
datagen = ImageDataGenerator(rescale = 1. / 255.)
for train, test in kfold.split(df_data):
# df is the whole dataset (all together!)
df_train = df.iloc[train, :] # Look that train is coming from the for in .. loop
df_test = df.iloc[test, :] # The same for test
train_generator = datagen.flow_from_dataframe(dataframe = df_train,
directory = dataset_dir,
... )
test_generator = datagen.flow_from_dataframe(dataframe = df_test,
directory = dataset_dir,
...)
model = models.Sequential()
.....
model.compile(...)
model.fit(...)
и это сделано! Набор данных теперь разделен на разделы!!!
Обратите внимание, что класс ImageDataGenerator отсутствует в цикле for!!!
И обратите внимание, пожалуйста, что методы (модель creation, compile() and fit()
) должны быть в цикле for.
Приведенный выше код работает для меня очень хорошо.