Гид по технологиям

Аугментация данных в TensorFlow: пошаговое руководство с примерами

6 min read Машинное обучение Обновлено 22 Nov 2025
Аугментация данных в TensorFlow
Аугментация данных в 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()

Вывод summary модели CNN в консоли

Этот вывод даёт представление о количестве параметров и слоях в модели.

Обучение модели

Обучаем модель с учётом генераторов. 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}')

Результаты оценки модели: loss и accuracy на тесте

Обычно модель с адекватной аугментацией показывает лучшее обобщение на невидимых данных. Без аугментации легко получить near-1.0 точность на обучении и плохую точность на тесте — классическое переобучение.

Когда аугментация не помогает

  • Когда набор данных уже большой и разнообразный: дополнительные трансформации не приносят пользы.
  • Когда набор слишком мал и не содержит ключевых признаков: аугментация не создаст новые семантики объектов.
  • Когда трансформации нарушают семантику метки: например, поворот на 90° может изменить смысл для текстовых изображений или ориентационно-зависимых объектов.
  • Когда задача чувствительна к цвету и яркости (например, медицинские снимки): агрессивное изменение яркости может исказить клиническую информацию.

Альтернативные подходы и дополнения

  • Transfer learning (предобученные модели): часто даёт лучший эффект при небольших наборах данных.
  • Генеративные модели (GAN, VAE): могут генерировать синтетические изображения с новой семантикой.
  • Mixup и CutMix: комбинируют изображения и метки для регуляризации.
  • Test-time augmentation (TTA): усреднение прогнозов по набору аугментированных версий теста.
  • self-supervised pretraining: обучить представления на массивах без меток, затем дообучить классификатор.

Мини‑методика применения аугментации — пошагово

  1. Проанализируйте данные: какие вариации реалистичны в проде (повороты, отражения, масштаб)?
  2. Выберите безопасные трансформации, которые не меняют метку.
  3. Настройте интенсивности (диапазон яркости, доля отражения) и вероятности применения.
  4. Обучите модель с контролем метрик на валидации и без аугментации на контрольной подвыборке.
  5. Проверьте TTA и сравните с transfer learning.
  6. Запустите A/B тестирование модели, если она идёт в продуктив.

Эвристики и ментальные модели

  • “Не ломай семантику”: любое преобразование должно сохранять метку.
  • “Меньше — лучше”: начните с консервативных трансформаций и увеличивайте агрессивность по необходимости.
  • “Панель признаков важнее пикселей”: аугментация помогает там, где признаки варьируются в реальном мире.
  • “Проверяй на реальных данных”: добавьте holdout-выборку, представляющую прод окружение.

Чек‑листы по ролям

ML-инженер:

  • Проверить, что аугментация не применяется к тест/валидации;
  • Экспериментировать с prob/диапазоном трансформаций;
  • Использовать коллбеки для ранней остановки и записи метрик.

Data-engineer:

  • Убедиться в корректности путей и подготовке данных;
  • Настроить пайплайн на tf.data при необходимости;
  • Мониторить баланс классов и дубликаты.

Ревьюер модели:

  • Сравнить кривые обучения с/без аугментации;
  • Проверить устойчивость на распределениях, отличных от train;
  • Проверить метрики по подгруппам (длина хвоста, капельные случаи).

Критерии приёмки

  • Тестовая точность (accuracy) не уменьшается по сравнению с baseline без аугментации, предпочтительно повышается.
  • Разрыв между train и validation accuracy сокращается (меньше переобучения).
  • Модель стабильна при TTA в продовой подвыборке.
  • Нет ухудшения качества на важных подгруппах данных.

Тестовые случаи и приёмочные сценарии

  1. Проверка целостности данных: все изображения загружаются корректно, нет ошибок формата.
  2. Проверка эффективности аугментации: сравнить ROC/PR-кривые для моделей с разной степенью аугментации.
  3. Сценарий регрессии: добавить шум и проверить устойчивость предсказаний.
  4. 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 и специализированные слои.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Исправить ошибку «Oops! Something went wrong» в YouTube
Техподдержка

Исправить ошибку «Oops! Something went wrong» в YouTube

Экран входа macOS — настройки и советы
macOS

Экран входа macOS — настройки и советы

Удалить историю Google Bard и отключить её
Конфиденциальность

Удалить историю Google Bard и отключить её

TinyLetter для блогеров: быстро и просто
Email-маркетинг

TinyLetter для блогеров: быстро и просто

Как включить и отключить блокировщик всплывающих окон IE11
браузер

Как включить и отключить блокировщик всплывающих окон IE11

Применение патчей при перемещённых файлах в Git
GIT

Применение патчей при перемещённых файлах в Git