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

Аугментация данных в TensorFlow для задачи «кошки и собаки»

6 min read Машинное обучение Обновлено 06 Jan 2026
Аугментация данных в TensorFlow — пример с кошками и собаками
Аугментация данных в TensorFlow — пример с кошками и собаками

Введение

Аугментация данных — это применение преобразований (повороты, сдвиги, зеркалирование, изменение яркости и т. п.) к обучающим данным для увеличения их разнообразия. Это помогает снизить переобучение, особенно когда исходный набор небольшого размера.

Краткое определение: аугментация данных — метод увеличения объёма и разнообразия набора обучающих примеров без сбора новых данных.

Фрагмент кода для работы с изображениями в 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()

Результат 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}')

Выводы оценки модели: loss и accuracy на тестовом наборе

Если модель обучается без аугментации и достигает точности 1.0 на обучающем наборе, это явный симптом переобучения: модель выучила особенности тренировочных примеров и плохо обобщает на новые данные.

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

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

Важно: выбор техники аугментации должен соответствовать физике задачи и ожидаемым искажениям в продакшене.

Альтернативные подходы к борьбе с переобучением

  • Сбор дополнительных реальных данных.
  • Предобученные модели (transfer learning) и дообучение (fine-tuning).
  • Регуляризация: L1/L2, Dropout, Batch Normalization.
  • Cross-validation и стратифицированные разбиения.
  • Генеративные модели (например, GAN) для синтетической генерации реалистичных примеров.

Когда использовать что: если у вас есть бюджет на сбор данных — соберите данные. Если времени мало — начните с аугментации и transfer learning.

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

  • «Аугментируй, как ожидаем в проде»: моделируйте реальные искажения, которые произойдут при эксплуатации.
  • «Маленький набор → агрессивная аугментация»: чем меньше данных, тем шире набор корректных преобразований (с осторожностью).
  • «Оценка на чистых данных»: всегда тестируйте на нормализованном, но не аугментированном тесте.

Быстрая методика (mini-methodology)

  1. Проанализируйте данные — осмотрите ракурсы, освещение, размеры объектов.
  2. Выберите безопасные преобразования (флип, сдвиги, масштабирование).
  3. Настройте диапазоны параметров (не переборщите с яркостью/вращением).
  4. Тренируйте модель с аугментацией и без — сравните поведение validation/test.
  5. При необходимости комбинируйте с transfer learning и регуляризацией.

Роль‑базовые чек‑листы

Для команды: кто за что отвечает.

  • Data Scientist: проверить распределение классов, найти недостатки; подобрать начальные аугментации; настроить метрики.
  • ML-инженер: интегрировать ImageDataGenerator в пайплайн; обеспечить воспроизводимость (seed); оптимизировать загрузку данных (prefetch, num_workers).
  • DevOps/MLOps: мониторинг SLO, автоматизированные тесты на деградацию качества после развёртывания.

Руководство по внедрению (SOP)

  1. Подготовить репозитории с исходными изображениями и метаданными.
  2. Создать скрипт/Notebook с конфигурацией ImageDataGenerator и фиксированным seed.
  3. Запустить серию экспериментов: без аугментации, с базовой аугментацией, с расширенной.
  4. Зафиксировать результаты (validation/test loss & accuracy, confusion matrix).
  5. Выбрать модель и настройки, пройти критерии приёмки.
  6. Подготовить 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 в продакшн-пайплайнах.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

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

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство