← Назад к вопросам

Что такое data augmentation?

2.0 Middle🔥 161 комментариев
#Глубокое обучение#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Data Augmentation (Увеличение данных)

Определение

Data Augmentation (аугментация данных) — это техника, которая синтетически увеличивает размер обучающего набора путём создания новых примеров на основе существующих. Новые примеры создаются применением различных трансформаций к исходным данным, сохраняя при этом их метки (labels).

Зачем нужна augmentation

  1. Недостаточно данных: если датасет мал, модель переобучается. Аугментация синтетически расширяет датасет
  2. Баланс классов: если один класс встречается редко, можно аугментировать его примеры
  3. Робастность модели: модель учится на разных вариаций одних и тех же объектов, становится устойчивей к шумам
  4. Регуляризация: aaugmentation работает как регуляризатор, снижает переобучение
  5. Инвариантность: модель учится извлекать признаки, инвариантные к трансформациям

Аугментация для изображений (Computer Vision)

Основные трансформации:

import albumentations as A
from albumentations.pytorch import ToTensorV2
import cv2
import numpy as np
from torchvision import transforms
from PIL import Image

# Способ 1: использование albumentations (рекомендуется)
transform = A.Compose([
    A.Resize(224, 224),
    A.HorizontalFlip(p=0.5),          # отразить по горизонтали
    A.VerticalFlip(p=0.3),            # отразить по вертикали
    A.Rotate(limit=30, p=0.5),        # повернуть на -30 до +30 градусов
    A.GaussNoise(p=0.2),              # добавить гауссов шум
    A.Blur(blur_limit=5, p=0.3),      # размытие
    A.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, p=0.3),
    A.RandomRain(p=0.1),              # случайный дождь
    A.RandomFog(p=0.1),               # случайный туман
    A.Normalize(),
    ToTensorV2()
], bbox_params=A.BboxParams(format='pascal_voc'))  # если есть боксы

# Применение
image = cv2.imread('image.jpg')
augmented = transform(image=image)
augmented_image = augmented['image']

# Способ 2: torchvision transforms (более простые трансформации)
transform_simple = transforms.Compose([
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.RandomRotation(degrees=15),
    transforms.ColorJitter(brightness=0.1, contrast=0.1),
    transforms.RandomAffine(degrees=0, translate=(0.1, 0.1)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                        std=[0.229, 0.224, 0.225])
])

Безопасные трансформации для CV:

# Трансформации, которые НЕ должны менять метку:
# ✓ Горизонтальное отражение (для большинства объектов)
# ✓ Ротация на малые углы (15-30 градусов)
# ✓ Небольшое масштабирование
# ✓ Шум, размытие
# ✗ Вертикальное отражение (для лиц, цифр)
# ✗ Сильная ротация (ассиметричные объекты)
# ✗ Обрезание важных частей объекта

# Пример правильного выбора:
transform_for_faces = A.Compose([
    A.HorizontalFlip(p=0.5),  # ОК для лиц
    A.Rotate(limit=15, p=0.3),  # Малая ротация
    A.GaussNoise(p=0.2),
    # НЕ используем VerticalFlip для лиц!
])

transform_for_digits = A.Compose([
    A.Rotate(limit=20, p=0.5),
    A.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.2, rotate_limit=20, p=0.3),
    A.Perspective(scale=(0.05, 0.1), p=0.3),
    # НЕ используем HorizontalFlip для цифр (6 станет 9)!
])

Аугментация для текста (NLP)

import nlpaug.augmenter.word as naw
import nlpaug.augmenter.sentence as nas

# Способ 1: замена синонимов
aug_synonym = naw.SynonymAug(aug_src='wordnet')
text = "The movie was very good and entertaining"
augmented_texts = [
    aug_synonym.augment(text) for _ in range(3)
]
print(augmented_texts)
# ['The film was very good and entertaining',
#  'The movie was quite good and engaging',
#  'The motion picture was very good and fun']

# Способ 2: случайная замена слов
aug_word = naw.RandomWordAug(action="swap")  # поменять слова местами
text = "The quick brown fox jumps"
augmented = aug_word.augment(text)
print(augmented)  # "The brown quick fox jumps"

# Способ 3: вставка/удаление слов
aug_insert = naw.ContextualWordEmbsAug(model_path="bert-base-multilingual-uncased", 
                                       action="insert")
text = "I love this movie"
augmented = aug_insert.augment(text)
print(augmented)  # "I absolutely love this great movie"

# Способ 4: перефразирование (backtranslation)
# Google Translate: text -> fr -> en -> text2
# Это хороший способ создать синтетические примеры

Аугментация для табличных данных

import numpy as np
from sklearn.preprocessing import StandardScaler

# Способ 1: добавление шума (Gaussian noise)
def augment_tabular_noise(X, noise_std=0.01):
    """
    Добавить гауссов шум к признакам.
    """
    noise = np.random.normal(0, noise_std, X.shape)
    return X + noise

X_train = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
X_augmented = augment_tabular_noise(X_train, noise_std=0.1)
print(X_augmented)

# Способ 2: SMOTE (Synthetic Minority Oversampling Technique)
# для балансировки классов
from imblearn.over_sampling import SMOTE

X = np.array([[0, 0], [1, 1], [2, 2], [3, 3]])
y = np.array([0, 0, 1, 1])  # несбалансированные классы

smote = SMOTE(k_neighbors=2)
X_resampled, y_resampled = smote.fit_resample(X, y)
print(f"Исходные данные: {len(X)} примеров")
print(f"После SMOTE: {len(X_resampled)} примеров")

# Способ 3: mixup (линейная комбинация двух примеров)
def mixup(X, y, alpha=1.0):
    """
    Mixup: x_new = lambda * x1 + (1 - lambda) * x2
            y_new = lambda * y1 + (1 - lambda) * y2
    """
    lam = np.random.beta(alpha, alpha)
    indices = np.random.permutation(len(X))
    
    X_mixed = lam * X + (1 - lam) * X[indices]
    y_mixed = lam * y + (1 - lam) * y[indices]
    
    return X_mixed, y_mixed

# Способ 4: CutMix для табличных данных
# (комбинирование случайных подмножеств признаков)

Аугментация в PyTorch Dataset

import torch
from torch.utils.data import Dataset, DataLoader
import torchvision.transforms as transforms
from albumentations.pytorch import ToTensorV2
import albumentations as A

class AugmentedImageDataset(Dataset):
    def __init__(self, images, labels, transform=None):
        self.images = images
        self.labels = labels
        self.transform = transform
    
    def __len__(self):
        return len(self.images)
    
    def __getitem__(self, idx):
        image = self.images[idx]
        label = self.labels[idx]
        
        # Применяем аугментацию на лету (на этапе загрузки)
        if self.transform:
            augmented = self.transform(image=image)
            image = augmented['image']
        
        return image, label

# Разные трансформации для train и test
train_transform = A.Compose([
    A.HorizontalFlip(p=0.5),
    A.Rotate(limit=30, p=0.3),
    A.GaussNoise(p=0.2),
    A.Normalize(),
    ToTensorV2()
])

test_transform = A.Compose([
    A.Normalize(),
    ToTensorV2()
])

train_dataset = AugmentedImageDataset(train_images, train_labels, train_transform)
test_dataset = AugmentedImageDataset(test_images, test_labels, test_transform)

train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)

Важные правила

  1. Аугментация только на train set: не трансформируй валидацию и тест!
  2. Сохрани метку: трансформация не должна менять класс примера
  3. Реалистичность: создаёшь примеры, которые похожи на реальные данные
  4. Не переусложняй: слишком экстремальные трансформации вредят обучению
  5. Экспериментируй: разные комбинации работают для разных задач

Эффект аугментации

# Пример влияния на овerfitting
# Без аугментации:
# train_loss: 0.01, val_loss: 0.50  <- переобучение (зазор 49x)

# С аугментацией:
# train_loss: 0.08, val_loss: 0.12  <- хорошее обобщение (зазор 1.5x)

Продвинутые техники

  1. AutoAugment: автоматический поиск лучшей стратегии аугментации
  2. RandAugment: случайная выборка трансформаций из пула
  3. CutOut: обнуление случайных регионов изображения
  4. Mosaic: комбинирование нескольких изображений в одно
  5. SpecAugment: аугментация спектрограмм для аудио

Augmentation — это критический инструмент для получения хороших моделей при ограниченных данных.