Предотвратите переоснащение и повысьте точность модели машинного обучения, внедрив методы увеличения данных TensorFlow.
Увеличение данных — это процесс применения различных преобразований к обучающим данным. Это помогает увеличить разнообразие набора данных и предотвратить переоснащение. Переоснащение в основном происходит, когда у вас ограниченные данные для обучения вашей модели.
Здесь вы узнаете, как использовать модуль расширения данных TensorFlow для диверсификации набора данных. Это предотвратит переоснащение, создав новые точки данных, которые немного отличаются от исходных данных.
Образец набора данных, который вы будете использовать
Вы будете использовать набор данных о кошках и собаках из Каггл. Этот набор данных содержит около 3000 изображений кошек и собак. Эти изображения разделены на наборы для обучения, тестирования и проверки.
Метка 1.0 представляет собаку, а метка 0.0 — кошку.
Полный исходный код, реализующий методы увеличения данных, и тот, который не доступен в Репозиторий GitHub.
Установка и импорт TensorFlow
Для выполнения необходимо иметь базовое понимание Python. Вы также должны иметь базовые знания в области машинного обучения. Если вам требуется переподготовка, вы можете подумать о том, чтобы следовать некоторым туториалы по машинному обучению.
Открыть Google Колаб. Измените тип среды выполнения на GPU. Затем выполните следующую волшебную команду в первой ячейке кода, чтобы установить TensorFlow в вашей среде.
!pip установить тензорный поток
Импортируйте TensorFlow и соответствующие модули и классы.
Импортировать тензорный поток как тф
от tensorflow.keras.preprocessing.image Импортировать ImageDataGenerator
от тензорный поток.keras.models Импортировать последовательный
от тензорный поток.keras.слои Импортировать Conv2D, MaxPooling2D, Flatten, Dense, Dropout
tensorflow.keras.preprocessing.image позволит вам выполнить увеличение данных в вашем наборе данных.
Создание экземпляров класса ImageDataGenerator
Создайте экземпляр ImageDataGenerator класс для данных поезда. Вы будете использовать этот объект для предварительной обработки обучающих данных. Он будет генерировать пакеты дополненных данных изображения в режиме реального времени во время обучения модели.
В задаче классификации того, является ли изображение кошкой или собакой, вы можете использовать методы увеличения данных с переворотом, случайной шириной, случайной высотой, случайной яркостью и масштабированием. Эти методы будут генерировать новые данные, которые содержат варианты исходных данных, представляющих реальные сценарии.
# определить генератор данных изображения для обучения
train_datagen = ImageDataGenerator (масштаб =1./255,
Horizontal_flip=Истинный,
width_shift_range=0.2,
height_shift_range=0.2,
диапазон_яркости=[0.2,1.0],
зум_диапазон =0.2)
Создайте еще один экземпляр ImageDataGenerator класс для тестовых данных. Вам понадобится изменить масштаб параметр. Он нормализует значения пикселей тестовых изображений, чтобы они соответствовали формату, используемому во время обучения.
# определить генератор данных изображения для тестирования
test_datagen = ImageDataGenerator (масштаб =1./255)
Создайте окончательный экземпляр ImageDataGenerator класс для данных проверки. Измените масштаб проверочных данных так же, как и тестовые данные.
# определить генератор данных изображения для проверки
validation_datagen = ImageDataGenerator (масштабирование =1./255)
Вам не нужно применять другие методы дополнения к данным тестирования и проверки. Это связано с тем, что модель использует данные тестирования и проверки только для целей оценки. Они должны отражать исходное распределение данных.
Загрузка ваших данных
Создать Итератор каталогов объект из учебного каталога. Он будет генерировать пакеты дополненных изображений. Затем укажите каталог, в котором хранятся обучающие данные. Измените размер изображений до фиксированного размера 64x64 пикселей. Укажите количество изображений, которые будет использовать каждый пакет. Наконец, укажите тип метки, которая будет бинарный (например, кошка или собака).
# определяем тренировочный каталог
train_data = train_datagen.flow_from_directory (каталог =r'/content/drive/MyDrive/cats_and_dogs_filtered/train',
target_size=(64, 64),
размер партии =32,
класс_режим =двоичный)
Создать еще Итератор каталогов объект из каталога тестирования. Установите параметры на те же значения, что и у обучающих данных.
# определение каталога тестирования
test_data = test_datagen.flow_from_directory (каталог ='/content/drive/MyDrive/cats_and_dogs_filtered/тест',
target_size=(64, 64),
размер партии =32,
класс_режим =двоичный)
Создать окончательный Итератор каталогов объект из каталога проверки. Параметры остаются такими же, как и у данных обучения и тестирования.
# определение каталога проверки
validation_data = validation_datagen.flow_from_directory (каталог ='/content/drive/MyDrive/cats_and_dogs_filtered/validation',
target_size=(64, 64),
размер партии =32,
класс_режим =двоичный)
Итераторы каталога не дополняют наборы данных проверки и тестирования.
Определение вашей модели
Определите архитектуру вашей нейронной сети. Использовать Сверточная нейронная сеть (Си-Эн-Эн). CNN предназначены для распознавания шаблонов и особенностей изображений.
модель = Последовательный()
# сверточный слой с 32 фильтрами размером 3x3
model.add(Conv2D(32, (3, 3), активация='релу', input_shape=(64, 64, 3)))# максимальный слой пула с размером пула 2x2
model.add(MaxPooling2D(pool_size=(2, 2)))# сверточный слой с 64 фильтрами размером 3x3
model.add(Conv2D(64, (3, 3), активация='релу'))# максимальный слой пула с размером пула 2x2
model.add(MaxPooling2D(pool_size=(2, 2)))# выравниваем выходные данные сверточных слоев и слоев пула
model.add(Свести())# полносвязный слой со 128 юнитами и активацией ReLU
model.add(Плотный(128, активация='релу'))# случайным образом отбрасываем 50% юнитов, чтобы предотвратить переоснащение
model.add(Выпадение(0.5))
# выходной слой с сигмовидной активацией (бинарная классификация)
model.add(Плотный(1, активация=сигмовидная))
Скомпилируйте модель, используя двоичный файл кросс-энтропия функция потерь. В задачах бинарной классификации обычно используется It. Для оптимизатора используйте Адам оптимизатор. Это адаптивный алгоритм оптимизации скорости обучения. Наконец, оцените модель с точки зрения точности.
model.compile (потеря ='бинарная_кроссэнтропия', оптимизатор='Адам', метрики=['точность'])
Выведите на консоль сводную информацию об архитектуре модели.
модель.резюме()
На следующем снимке экрана показана визуализация архитектуры модели.
Это дает вам общее представление о том, как выглядит дизайн вашей модели.
Обучение вашей модели
Обучите модель с помощью соответствовать() метод. Установите количество шагов на эпоху равным количеству обучающих выборок, деленному на размер партии. Также задайте данные проверки и количество шагов проверки.
# Обучаем модель на обучающих данных
история = model.fit (train_data,
steps_per_epoch=train_data.n // train_data.batch_size,
эпохи =50,
валидация_данные=валидация_данные,
validation_steps=validation_data.n // validation_data.batch_size)
ImageDataGenerator class применяет увеличение данных к обучающим данным в режиме реального времени. Это замедляет процесс обучения модели.
Оценка вашей модели
Оцените производительность вашей модели на тестовых данных, используя оценивать() метод. Кроме того, выведите тестовые потери и точность на консоль.
test_loss, test_acc = model.evaluate (test_data,
шаги=test_data.n // test_data.batch_size)
Распечатать(f'Потеря теста: {тест_потеря}')
Распечатать(f'Точность теста: {test_acc}')
На следующем снимке экрана показана производительность модели.
Модель работает достаточно хорошо на никогда не виденных данных.
Когда вы запускаете код, который не реализует методы увеличения данных, точность обучения модели равна 1. Это означает, что он превосходит. Он также плохо работает с данными, которые никогда раньше не видел. Это потому, что он изучает особенности набора данных.
Когда увеличение данных бесполезно?
- Когда набор данных уже разнообразен и велик: Увеличение данных увеличивает размер и разнообразие набора данных. Если набор данных уже большой и разнообразный, увеличение данных будет бесполезным.
- Когда набор данных слишком мал: увеличение данных не может создавать новые объекты, которых нет в исходном наборе данных. Следовательно, он не может компенсировать небольшой набор данных, в котором отсутствует большинство функций, необходимых для изучения модели.
- Когда тип увеличения данных не подходит: например, поворот изображений может оказаться бесполезным, если важна ориентация объектов.
На что способен TensorFlow
TensorFlow — это разнообразная и мощная библиотека. Он способен обучать сложные модели глубокого обучения и может работать на различных устройствах, от смартфонов до кластеров серверов. Это помогло повысить мощность периферийных вычислительных устройств, использующих машинное обучение.