При разработке модели глубокого обучения нам необходимо обучить ее на наборе данных, чтобы она могла изучить закономерности в данных. Однако нам необходимо убедиться, что он не переоснащается и хорошо обобщается на новые, невидимые данные. Просто обучение модели на всех данных — это нормально, но мы не можем проверить ее точность на тех же данных. Следовательно, у нас должен быть какой-то механизм для оценки производительности модели и проверки того, насколько хорошо модель обобщает. Поэтому мы обучаем модели на одной части данных и оставляем часть для тестирования модели. Чтобы обучить и оценить, насколько хорошо работает наша модель, нам нужно разделить набор данных на наборы для обучения, проверки/разработки и тестирования.

  1. Для обучения модели используется Набор поездов. Модель изучает шаблоны данных из этого набора данных.
  2. Набор проверки (Val), также называемый Набор разработки (Dev), используется для оценки производительности модели во время обучения. Он используется для приблизительной проверки модели на каждой эпохе. Это помогает настраивать гиперпараметры модели.
  3. Набор тестов используется для объективной оценки окончательной модели перед развертыванием.

Разделение данных на обучающие, проверочные и тестовые наборы — это первые и наиболее важные шаги в разработке моделей глубокого обучения. При работе с большими наборами данных нам может не хватить памяти для загрузки всех данных. В такой ситуации мы можем использовать генераторы данных для пакетной загрузки данных.

Разделение данных на диске дает вам преимущество использования генераторов данных для загрузки данных в пакеты. Если вы загружаете данные пакетами с диска, не требуется загружать все данные в VRAM графического процессора, так вы можете эффективно управлять памятью графического процессора. В противном случае будет выдано сообщение об ошибке типа «ResourceExhaustedError: не удалось выделить память».

Мы можем использовать утилиту tf.keras.utils.image_dataset_from_directory() для пакетной загрузки данных, и при этом вы можете указать параметр 'validation_split' для разделения данных. .

Однако эта утилита от Keras поддерживает только форматы изображений jpeg, png, bmp и gif. Если вы работаете, скажем, с медицинскими изображениями в форматах DICOM или NIFTI или со спутниковыми изображениями в формате NetCDF или HDF или массивы данных в формате npy, то вы не сможете использовать утилиту Keras для разделения набора данных и загрузки его пакетами.

В этой статье мы в основном сосредоточимся на том, как разделить данные. В следующей статье мы увидим, как написать собственный генератор данных для пакетной загрузки данных. Однако для использования генераторов данных данные должны быть правильно организованы в папках, таких как train, val и test.

Поезд-Тестовый Сплит

Наиболее распространенный подход к разделению данных — это случайное разделение данных на три набора: обучающий набор, набор проверки и тестовый набор. Однако важно отметить, что эти наборы должны иметь одинаковое распределение.

Не существует установленного правила для коэффициентов разделения, но обычно имеется набор проверки такого же размера, что и тестовый набор, или немного больше. Например, если у вас есть набор данных изображений, вы можете разделить его случайным образом на 80 % в обучающем наборе, 10 % в проверочном наборе и 10 % в тестовом наборе.

В зависимости от размера набора данных вы можете выбрать коэффициент разделения, подобный показанному в таблице 1.

Примечание

Если во время работы над проектом вам были предоставлены

1. Только одна папка набора данных изображений. Затем, прежде чем начать проект, вы разделяете набор данных на наборы для обучения, проверки и тестирования.

2. Набор данных для обучения и тестирования. Затем перед началом проекта вы разделяете набор поездов на наборы для обучения и проверки и используете набор тестов для целей тестирования модели.

Здесь мы будем использовать библиотеку Разделенные папки.

Установка

pip install split-folders

Работая над задачей классификации, организуйте входные данные, как показано ниже.

После разделения данных на наборы обучения и проверки ожидаемая структура будет следующей:

После разделения данных на обучающие, проверочные и тестовые наборы ожидаемая структура будет следующей:

Теперь, чтобы разделить данные, у вас есть 3 разных варианта:

А) Разделить данные на обучающий и проверочный наборы с использованием коэффициента разделения

Укажите путь к входной папке, выходной папке и коэффициент разделения (в виде кортежа). Чтобы разделить данные, скажем, на 80 % элементов в обучающем наборе и 20 % в проверочном наборе, укажите коэффициент разделения как (.8, .2). Он создает две папки в выходной_папке, а именно «train» и «val».

import splitfolders
input_folder = './XYZ/' # path of input folder
output_folder = './ABC/' # Path of output folder
# Split with a ratio
splitfolders.ratio(input_folder, output=output_folder, seed=42, ratio=(.8, .2), group_prefix=None)

Б) Разделение данных на обучающие, проверочные и тестовые наборы с использованием коэффициента разделения

Укажите путь к входной папке, выходной папке и коэффициент разделения (в виде кортежа). Чтобы разделить данные, скажем, на 75 % элементов в обучающем наборе, 15 % в проверочном наборе и 10 % в тестовом наборе, укажите коэффициент разделения как (0,75, 0,15, 0,1). Он создает 3 папки в выходной_папке, а именно. «поезд», «вал» и «тест».

import splitfolders
input_folder = './XYZ/' # path of input folder
output_folder = './ABC/' # Path of output folder
# Split with a ratio
splitfolders.ratio(input_folder, output=output_folder, seed=42, ratio=(.7, .15, .1), group_prefix=None)

C) Разделить данные на обучающие, проверочные и тестовые наборы с фиксированным количеством элементов

Укажите путь к входной папке, выходной папке и количество элементов (в виде кортежа). Например, если мы хотим, чтобы набор проверки состоял из 100 изображений, тестовый набор состоял из 70 изображений, а все оставшиеся изображения из входного набора были в обучающем наборе, тогда укажите (val, test) с фиксированным количеством элементов, т.е. фиксированным = (100, 70). Он создает 3 папки в папке вывода, а именно: «train», «test» и «val», и вы найдете 100 элементов в папке «val», 70 элементов в папке «test» и оставшиеся все элементы в папке «train». .

import splitfolders
input_folder = './XYZ/' # path of input folder
output_folder = './ABC/' # Path of output folder
# Split val/test with a fixed number of items, e.g. '(100, 70),
splitfolders.fixed("input_folder", output="output", seed=42, fixed=(100, 70), oversample=False, group_prefix=None, move=False)

Пример

Чтобы понять концепцию разделения данных, мы будем использовать подмножество «набора данных цветов». «Набор данных цветов» состоит из изображений цветов с 5 метками классов. Давайте рассмотрим только 3 класса: ромашку, подсолнух и тюльпан, и каждый класс содержит только 80 изображений цветов. Этот код применим к файлам данных в любом формате, например DICOM, NIFTI, HDF, NPY и т. д.

Наша структура input_folder:

Для простоты на рисунке выше показаны только три имени файла изображения из каждой папки класса (фактически в каждом классе содержится 80 изображений).

Чтобы визуализировать структуру папок, запустите следующий код

# pip install seedir
# pip install emoji
import seedir as sd
input_folder = '.\input_data' # path of input folder
sd.seedir(input_folder,  itemlimit=3, style='emoji')

Чтобы проверить количество элементов/изображений в каждой папке класса,

import os
for dirpath, _, filenames in os.walk('.\input_data'):
    if len(filenames)==0:
        continue
    print(f"There are {len(filenames)} images in '{dirpath}'")

Теперь давайте создадим папку с именем «output_data» в текущем рабочем каталоге и разделим входные данные в соотношении: 80% данных для обучения и 20% для проверки.

import os
import splitfolders
input_folder = '.\input_data' # path of input folder
output_folder = '.\output_data' # Path of output folder
# Split with a ratio
splitfolders.ratio(input_folder, output=output_folder, seed=42, ratio=(.8, .2), group_prefix=None)

Визуализируйте структуру выходных_данных

import seedir as sd
sd.seedir('.\output_data',  itemlimit=3, depthlimit=3, style='emoji')

Он показывает, что в выходных_данных у нас есть две папки: «train» и «val». Папка «train» содержит 3 папки классов, а папка «val» также содержит 3 папки классов. Для простоты на рисунке выше показаны только три имени файла изображения из каждой папки класса.

Теперь давайте проверим количество элементов/изображений в каждой папке класса.

import os
for dirpath, _, filenames in os.walk('.\output_data'):
    if len(filenames)==0:
        continue
    print(f"There are {len(filenames)} images in '{dirpath}'")

Он показывает, что 64 изображения (80% из 80 изображений) находятся в каждом классе папки поезда и 16 изображений (20% из 80 изображений) находятся в каждом классе папки val.

В этой статье показано, как можно разделить данные на наборы поездов, значений и тестов на диске. Эта функция разделения данных работает с элементами данных любого формата и поэтому наиболее подходит для медицинских и спутниковых изображений.

Спасибо, что прочитали статью! Если вам нравится контент, подпишитесь на меня на Medium.