Аугментация данных в TensorFlow: пошаговое руководство с примерами
Важно: аугментация применяется только к обучающей выборке; тестовые и валидационные данные должны отражать реальное распределение.
Что такое аугментация данных
Аугментация данных — это создание новых обучающих примеров путём применения управляемых преобразований к исходным образцам: повороты, сдвиги, масштаб, изменение яркости, отражения, шум и т.п. Цель — повысить робастность модели к вариациям данных и уменьшить переобучение.
Короткое определение: аугментация — программное расширение набора данных через допустимые изменения образов, сохраняющие метку.
Пример используемого набора данных
Вы будете использовать набор кошек и собак с Kaggle — около 3000 изображений, разделённых на train, test и validation.
Метка 1.0 — собака, 0.0 — кошка. Полный исходный код (с аугментацией и без) доступен в репозитории на GitHub.
Установка и импорт TensorFlow
Предпосылки: базовое знание Python и машинного обучения. Откройте Google Colab, поменяйте тип среды на GPU. В первую ячейку выполните установку:
!pip install tensorflowИмпортируйте модули TensorFlow и Keras, которые понадобятся:
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)
Создаём генераторы потоков из директорий. Изображения приведём к фиксированному размеру 64×64, используем batch_size=32 и бинарные метки.
# 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')Важно: генераторы потоков не меняют тестовую и валидационную выборки (кроме рескейлинга).
Определение архитектуры модели
Пример простой сверточной нейросети (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'))Компилируем модель с бинарной кросс-энтропией и оптимизатором Adam:
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()Этот вывод даёт представление о количестве параметров и слоях в модели.
Обучение модели
Обучаем модель с учётом генераторов. steps_per_epoch обычно равен train_data.n // train_data.batch_size. Задаём количество эпох (например, 50).
# 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)Замечание: аугментация делается «на лету», поэтому обучение медленнее, чем без аугментации. На GPU разница становится менее критичной.
Оценка модели
Проверяем модель на тестовой выборке и выводим 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}')Обычно модель с адекватной аугментацией показывает лучшее обобщение на невидимых данных. Без аугментации легко получить near-1.0 точность на обучении и плохую точность на тесте — классическое переобучение.
Когда аугментация не помогает
- Когда набор данных уже большой и разнообразный: дополнительные трансформации не приносят пользы.
- Когда набор слишком мал и не содержит ключевых признаков: аугментация не создаст новые семантики объектов.
- Когда трансформации нарушают семантику метки: например, поворот на 90° может изменить смысл для текстовых изображений или ориентационно-зависимых объектов.
- Когда задача чувствительна к цвету и яркости (например, медицинские снимки): агрессивное изменение яркости может исказить клиническую информацию.
Альтернативные подходы и дополнения
- Transfer learning (предобученные модели): часто даёт лучший эффект при небольших наборах данных.
- Генеративные модели (GAN, VAE): могут генерировать синтетические изображения с новой семантикой.
- Mixup и CutMix: комбинируют изображения и метки для регуляризации.
- Test-time augmentation (TTA): усреднение прогнозов по набору аугментированных версий теста.
- self-supervised pretraining: обучить представления на массивах без меток, затем дообучить классификатор.
Мини‑методика применения аугментации — пошагово
- Проанализируйте данные: какие вариации реалистичны в проде (повороты, отражения, масштаб)?
- Выберите безопасные трансформации, которые не меняют метку.
- Настройте интенсивности (диапазон яркости, доля отражения) и вероятности применения.
- Обучите модель с контролем метрик на валидации и без аугментации на контрольной подвыборке.
- Проверьте TTA и сравните с transfer learning.
- Запустите A/B тестирование модели, если она идёт в продуктив.
Эвристики и ментальные модели
- “Не ломай семантику”: любое преобразование должно сохранять метку.
- “Меньше — лучше”: начните с консервативных трансформаций и увеличивайте агрессивность по необходимости.
- “Панель признаков важнее пикселей”: аугментация помогает там, где признаки варьируются в реальном мире.
- “Проверяй на реальных данных”: добавьте holdout-выборку, представляющую прод окружение.
Чек‑листы по ролям
ML-инженер:
- Проверить, что аугментация не применяется к тест/валидации;
- Экспериментировать с prob/диапазоном трансформаций;
- Использовать коллбеки для ранней остановки и записи метрик.
Data-engineer:
- Убедиться в корректности путей и подготовке данных;
- Настроить пайплайн на tf.data при необходимости;
- Мониторить баланс классов и дубликаты.
Ревьюер модели:
- Сравнить кривые обучения с/без аугментации;
- Проверить устойчивость на распределениях, отличных от train;
- Проверить метрики по подгруппам (длина хвоста, капельные случаи).
Критерии приёмки
- Тестовая точность (accuracy) не уменьшается по сравнению с baseline без аугментации, предпочтительно повышается.
- Разрыв между train и validation accuracy сокращается (меньше переобучения).
- Модель стабильна при TTA в продовой подвыборке.
- Нет ухудшения качества на важных подгруппах данных.
Тестовые случаи и приёмочные сценарии
- Проверка целостности данных: все изображения загружаются корректно, нет ошибок формата.
- Проверка эффективности аугментации: сравнить ROC/PR-кривые для моделей с разной степенью аугментации.
- Сценарий регрессии: добавить шум и проверить устойчивость предсказаний.
- A/B тест: вывести новую модель в трафик на небольшой процент и сравнить ключевые метрики.
Совместимость, версии и миграция
- TensorFlow 2.x: ImageDataGenerator по‑прежнему поддерживается, но для масштабируемых пайплайнов рекомендуется переход на tf.data и специальные слои аугментации (tf.keras.layers.experimental.preprocessing).
- При миграции на tf.data можно переносить те же трансформации, но потребуется ручная реализация pipeline-а и управление семплингом.
- Проверяйте совместимость с версиями CUDA/CuDNN при использовании GPU.
Безопасность и конфиденциальность
- В наборе «кошки и собаки» обычно нет персональных данных. Если вы используете фотографии людей, учтите требования местного законодательства (GDPR) и получите согласия на обработку.
- Храните оригинальные изображения в контролируемом хранилище и логируйте доступ к данным.
Когда аугментация всё-таки не помогает — примеры
- Медицинские снимки: яркость и контраст влияют на клинические признаки.
- OCR и ориентационно-зависимые объекты: произвольный поворот ломает метки.
- Крайне небольшой набор с редкими классами: аугментация может усилить шум и сместить баланс.
FAQ
Нужно ли аугментировать тестовую выборку?
Нет. Тест и валидация должны отражать реальные данные без стохастических трансформаций. Исключение — Test-Time Augmentation (TTA) для улучшения предсказаний через усреднение — это отдельная техника.
Как выбрать диапазоны трансформаций?
Опирайтесь на реалистичные вариации в продакшене: если объекты редко поворачиваются, ставьте малые углы; если камеры меняют яркость сильно, увеличьте диапазон яркости.
ImageDataGenerator или tf.data — что выбрать?
Для небольших экспериментов ImageDataGenerator удобен и прост. Для производства и масштабируемых пайплайнов рекомендуется tf.data и встроенные слои аугментации.
Как отладить неправильную аугментацию?
Визуализируйте примеры после генератора (plot batch), проверьте метки и границы применяемых трансформаций.
Краткое резюме
- Аугментация помогает повышать обобщающую способность моделей и уменьшать переобучение.
- Применяйте аугментацию только к обучающим данным; тест и валидация — без стохастики.
- Начинайте с консервативных трансформаций и тестируйте расширение конфигураций.
- Рассмотрите альтернативы: transfer learning, GAN, mixup и tf.data для продакшн-пайплайнов.
Ключевые выводы:
- Аугментация — эффективный инструмент при ограниченных данных.
- Всегда проверяйте, что трансформации сохраняют метки.
- Для масштабируемости переходите на tf.data и специализированные слои.
Похожие материалы
Исправить ошибку «Oops! Something went wrong» в YouTube
Экран входа macOS — настройки и советы
Удалить историю Google Bard и отключить её
TinyLetter для блогеров: быстро и просто
Как включить и отключить блокировщик всплывающих окон IE11