Аугментация данных в TensorFlow для задачи «кошки и собаки»
Введение
Аугментация данных — это применение преобразований (повороты, сдвиги, зеркалирование, изменение яркости и т. п.) к обучающим данным для увеличения их разнообразия. Это помогает снизить переобучение, особенно когда исходный набор небольшого размера.
Краткое определение: аугментация данных — метод увеличения объёма и разнообразия набора обучающих примеров без сбора новых данных.
О целевом наборе данных
В качестве примера используются изображения кошек и собак из набора с Kaggle. В наборе около 3 000 изображений, разбитых на обучающую, тестовую и валидационную части. Метки: 1.0 — собака, 0.0 — кошка.
Важно: аугментация не заменяет качество данных. Она полезна, когда хотите показать модели варианты входа, которые ожидаете увидеть в реальном мире (разные ракурсы, освещение, масштабы).
Установка и импорт TensorFlow
Предположения: вы знакомы с Python и базовыми концепциями машинного обучения. Для запуска в Google Colab выберите среду с GPU и выполните установку TensorFlow:
!pip install tensorflowИмпортируйте нужные модули:
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, DropoutМодуль tensorflow.keras.preprocessing.image предоставляет ImageDataGenerator, который выполняет аугментацию и подготовку пакетов изображений в реальном времени.
Создание экземпляров ImageDataGenerator
Для обучения используйте набор техник аугментации, которые соответствуют задаче классификации объектов на изображениях. В задаче «кошки и собаки» обычно безопасны горизонтальный флип, сдвиги по ширине/высоте, изменение яркости и масштабирование (zoom). Пример конфигурации:
# define the image data generator for training
train_datagen = ImageDataGenerator(rescale=1./255,
horizontal_flip=True,
width_shift_range=0.2,
height_shift_range=0.2,
brightness_range=[0.2,1.0],
zoom_range=0.2)Для теста и валидации используйте только нормализацию пикселей (rescale), чтобы оценка отражала реальное распределение данных:
# define the image data generator for testing
test_datagen = ImageDataGenerator(rescale=1./255)
# define the image data generator for validation
validation_datagen = ImageDataGenerator(rescale=1./255)Почему так: тестовый и валидационный наборы служат для честной оценки. Если вы аугментируете тест — вы меняете задачу оценки.
Загрузка данных (DirectoryIterator)
Создайте итераторы, которые будут подгружать и (для обучения) аугментировать изображения пакетами. Пример для обучающей директории:
# defining the training directory
train_data = train_datagen.flow_from_directory(directory=r'/content/drive/MyDrive/cats_and_dogs_filtered/train',
target_size=(64, 64),
batch_size=32,
class_mode='binary') Аналогично для теста и валидации:
# defining the testing directory
test_data = test_datagen.flow_from_directory(directory='/content/drive/MyDrive/cats_and_dogs_filtered/test',
target_size=(64, 64),
batch_size=32,
class_mode='binary')
# defining the validation directory
validation_data = validation_datagen.flow_from_directory(directory='/content/drive/MyDrive/cats_and_dogs_filtered/validation',
target_size=(64, 64),
batch_size=32,
class_mode='binary')Примечание: DirectoryIterator применяет аугментацию только к итератору, созданному на базе train_datagen.
Определение архитектуры модели
В примере используется простая свёрточная нейронная сеть (CNN). CNN эффективны для извлечения признаков из изображений:
model = Sequential()
# convolutional layer with 32 filters of size 3x3
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))
# max pooling layer with pool size 2x2
model.add(MaxPooling2D(pool_size=(2, 2)))
# convolutional layer with 64 filters of size 3x3
model.add(Conv2D(64, (3, 3), activation='relu'))
# max pooling layer with pool size 2x2
model.add(MaxPooling2D(pool_size=(2, 2)))
# flatten the output from the convolutional and pooling layers
model.add(Flatten())
# fully connected layer with 128 units and ReLU activation
model.add(Dense(128, activation='relu'))
# randomly drop out 50% of the units to prevent overfitting
model.add(Dropout(0.5))
# output layer with sigmoid activation (binary classification)
model.add(Dense(1, activation='sigmoid'))Компиляция модели:
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])Печать сводки архитектуры:
model.summary()Обучение модели
Запускайте обучение через fit(). Количество шагов за эпоху — число образцов, делённое на batch_size. Пример:
# Train the model on the training data
history = model.fit(train_data,
steps_per_epoch=train_data.n // train_data.batch_size,
epochs=50,
validation_data=validation_data,
validation_steps=validation_data.n // validation_data.batch_size)Замечание: аугментация в реальном времени увеличивает вычислительную нагрузку и время одной эпохи.
Оценка модели
Выполните оценку на тестовом наборе и выведите loss и accuracy:
test_loss, test_acc = model.evaluate(test_data,
steps=test_data.n // test_data.batch_size)
print(f'Test loss: {test_loss}')
print(f'Test accuracy: {test_acc}')Если модель обучается без аугментации и достигает точности 1.0 на обучающем наборе, это явный симптом переобучения: модель выучила особенности тренировочных примеров и плохо обобщает на новые данные.
Когда аугментация данных не помогает
- Когда набор данных уже очень большой и разнообразный. Аугментация в таком случае даёт небольшой прирост.
- Когда набор слишком мал и не содержит базовых признаков: аугментация не создаст новые семантические признаки, которые отсутствуют в данных.
- Когда выбранная аугментация меняет смысл изображения (например, поворот на 180° может быть недопустим для ориентированных объектов).
Важно: выбор техники аугментации должен соответствовать физике задачи и ожидаемым искажениям в продакшене.
Альтернативные подходы к борьбе с переобучением
- Сбор дополнительных реальных данных.
- Предобученные модели (transfer learning) и дообучение (fine-tuning).
- Регуляризация: L1/L2, Dropout, Batch Normalization.
- Cross-validation и стратифицированные разбиения.
- Генеративные модели (например, GAN) для синтетической генерации реалистичных примеров.
Когда использовать что: если у вас есть бюджет на сбор данных — соберите данные. Если времени мало — начните с аугментации и transfer learning.
Ментальные модели и эвристики
- «Аугментируй, как ожидаем в проде»: моделируйте реальные искажения, которые произойдут при эксплуатации.
- «Маленький набор → агрессивная аугментация»: чем меньше данных, тем шире набор корректных преобразований (с осторожностью).
- «Оценка на чистых данных»: всегда тестируйте на нормализованном, но не аугментированном тесте.
Быстрая методика (mini-methodology)
- Проанализируйте данные — осмотрите ракурсы, освещение, размеры объектов.
- Выберите безопасные преобразования (флип, сдвиги, масштабирование).
- Настройте диапазоны параметров (не переборщите с яркостью/вращением).
- Тренируйте модель с аугментацией и без — сравните поведение validation/test.
- При необходимости комбинируйте с transfer learning и регуляризацией.
Роль‑базовые чек‑листы
Для команды: кто за что отвечает.
- Data Scientist: проверить распределение классов, найти недостатки; подобрать начальные аугментации; настроить метрики.
- ML-инженер: интегрировать ImageDataGenerator в пайплайн; обеспечить воспроизводимость (seed); оптимизировать загрузку данных (prefetch, num_workers).
- DevOps/MLOps: мониторинг SLO, автоматизированные тесты на деградацию качества после развёртывания.
Руководство по внедрению (SOP)
- Подготовить репозитории с исходными изображениями и метаданными.
- Создать скрипт/Notebook с конфигурацией ImageDataGenerator и фиксированным seed.
- Запустить серию экспериментов: без аугментации, с базовой аугментацией, с расширенной.
- Зафиксировать результаты (validation/test loss & accuracy, confusion matrix).
- Выбрать модель и настройки, пройти критерии приёмки.
- Подготовить CI для автоматической регресс-тестовой оценки.
Критерии приёмки
- Validation accuracy стабильно лучше базовой (без аугментации) или уменьшилось переобучение (gap train/val сократился).
- Тестовые метрики на hold-out не ухудшились по сравнению с базой.
- Модель выдерживает целевые сценарии продакшена по времени ответа и памяти.
Decision tree для решения использовать ли аугментацию
flowchart TD
A[Есть ли достаточный объём и разнообразие данных?] -->|Да| B[Проверить baseline без аугментации]
A -->|Нет| C[Использовать аугментацию]
B --> D{Baseline плохой на валидации?}
D -->|Да| C
D -->|Нет| E[Аугментация необязательна, можно улучшить модель другими методами]
C --> F[Выбрать безопасные преобразования по задаче]
F --> G[Провести контрольные эксперименты и оценить на hold-out]
G --> H{Метрики улучшены?}
H -->|Да| I[Внедрить аугментацию в пайплайн]
H -->|Нет| EФакто-бокс — ключевые заметки
- ImageDataGenerator применяет аугментацию в реальном времени и не сохраняет модифицированные файлы на диск по умолчанию.
- Не аугментируйте тест/валидацию — они нужны для честной оценки.
- Аугментация часто замедляет обучение, но улучшает обобщающую способность.
Критические ошибки и крайние случаи
- Применение агрессивных трансформаций, ухудшающих семантику (например, слишком сильное затемнение).
- Аугментация, несовместимая с меткой (поворот, меняющий ориентацию считываемой метки).
- Отсутствие контроля случайности (seed) — эксперименты нельзя воспроизвести.
Глоссарий (одно предложение на термин)
- Аугментация: преобразование данных с целью увеличить разнообразие обучающего набора.
- ImageDataGenerator: класс TensorFlow/Keras для генерации и аугментации пакетов изображений.
- DirectoryIterator: итератор, который загружает изображения из директорий и создаёт батчи.
Тестовые сценарии и критерии приёмки
- Тест 1: Модель с аугментацией не должна иметь заметно хуже test accuracy, чем модель без аугментации на hold-out.
- Тест 2: Разрыв между train и val accuracy должен уменьшиться при корректной аугментации.
- Тест 3: Конфигурации аугментации должны быть детерминируемы (воспроизводимы) при фиксированном seed.
Итог и рекомендации
Аугментация — мощный инструмент для повышения устойчивости модели к изменчивости реального мира. Используйте её разумно: проектируйте преобразования исходя из предметной области, контролируйте диапазоны параметров и всегда проверяйте результаты на чистом тестовом наборе. Если у вас ограниченный бюджет на сбор данных — начните с аугментации и transfer learning. Если есть возможность — собирайте больше реальных примеров.
Сводка:
- Аугментация увеличивает разнообразие данных и уменьшает переобучение.
- Применяйте аугментацию только к обучающему набору.
- Сравнивайте поведение модели с и без аугментации и фиксируйте воспроизводимость.
Примечание: для воспроизводимости и производительности рассмотрите использование tf.data API с map + prefetch в продакшн-пайплайнах.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone