Практически все туториалы по Tensorflow для начинающих рассчитаны на то, что вы загружаете уже готовый, размеченный dataset и используете его. Но не рассказывается как собрать свой датасет и передать его в модель для обучения, как объяснить какое изображение к какому классу относится, как разделить данные на обучающие и проверочные. Я потратил много времени на то, чтобы разобраться с этой проблемой и теперь хочу помочь другим начинающим дата сайентистам.
Первым делом создаем папку 'train' (назвать можно как вам удобно). В этой папке создаем по отдельной папке для каждого класса, который будет в обучении. Для бинарной классификации будет две папки, для трех классов - три папки и т.д. Папки стоит называть в соответствии с именами классов. Дальше в каждую папку нужно поместить те файлы, на которых будет обучаться нейросеть.
В Tensorflow есть модуль tensorflow.keras.utils.image_dataset_from_directory(), именно с его помощью можно создавать датасет изображений для обучения нейронной сети. Если вы хотите обучать нейронку на текстовых данных, то следует использовать tensorflow.keras.utils.text_dataset_from_directory(). Отмечу, что текстовые данные читаются только из файлов формата '.txt'. Дальше буду рассказывать на примере с изображениями. для текста все будет аналогично.
Модуль tensorflow.keras.utils.image_dataset_from_directory() имеет несколько аргументов, подробнее про каждый можно прочитать в документации к tensorflow, я расскажу про основные, которые сам использую. В первый аргумент 'directory=train' передается путь к той самой папке 'train'. Дальше идет 'validation_split', который отвечает за разделение файлов на обучающую и тестовую выборку. Если не указывать его, то все 100% будут использоваться для обучения, но рекомендую делить датасет в пропорциях 80/20, так обучение будет проходить корректнее. Соответственно в 'validation_split=0.2' указываем процент, который будет отведен на валидацию, а следующим аргументом subset="training" указываем, что это будет тренировочная выборка. Для проверочный выборки subset="validation". Также можно указать параметр 'image_size=(img_height, img_width)', который будет приводить все изображения к одному размеру. Ниже приведу пример, как я создаю тренировочный и проверочный датасеты.
train_ds = tf.keras.utils.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="training",
seed=123,
image_size=(img_height, img_width),
batch_size=batch_size)
val_ds = tf.keras.utils.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="validation",
seed=123,
image_size=(img_height, img_width),
batch_size=batch_size)
Теперь для обучения модели будут использоваться переменные 'train_ds' и 'val_ds'.
history = model.fit(train_ds, epochs=10,
validation_data=train_ds,
validation_steps=30)
В конце хочу добавить, что от качества обучающих данных зависит больше половины успеха. Поэтому подготовке и разделению датасета стоит уделять внимания не меньше чем построению модели и выбору метрик качества и потерь.
Этим небольшим туториалом я хочу начать рубрику "Ошибки начинающего", в которой буду рассказывать о сложностях, с которыми столкнулся при изучении Python и Data Science, и о том какими способами мне удалось их решить. Надеюсь этот материал будет полезен начинающим дата сайентистам, буду рад обратной связи от опытных программистов и с удовольствием отвечу на оставшиеся у вас вопросы!