← Назад к вопросам
Что такое data augmentation?
2.0 Middle🔥 161 комментариев
#Глубокое обучение#Машинное обучение
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Data Augmentation (Увеличение данных)
Определение
Data Augmentation (аугментация данных) — это техника, которая синтетически увеличивает размер обучающего набора путём создания новых примеров на основе существующих. Новые примеры создаются применением различных трансформаций к исходным данным, сохраняя при этом их метки (labels).
Зачем нужна augmentation
- Недостаточно данных: если датасет мал, модель переобучается. Аугментация синтетически расширяет датасет
- Баланс классов: если один класс встречается редко, можно аугментировать его примеры
- Робастность модели: модель учится на разных вариаций одних и тех же объектов, становится устойчивей к шумам
- Регуляризация: aaugmentation работает как регуляризатор, снижает переобучение
- Инвариантность: модель учится извлекать признаки, инвариантные к трансформациям
Аугментация для изображений (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)
Важные правила
- Аугментация только на train set: не трансформируй валидацию и тест!
- Сохрани метку: трансформация не должна менять класс примера
- Реалистичность: создаёшь примеры, которые похожи на реальные данные
- Не переусложняй: слишком экстремальные трансформации вредят обучению
- Экспериментируй: разные комбинации работают для разных задач
Эффект аугментации
# Пример влияния на овerfitting
# Без аугментации:
# train_loss: 0.01, val_loss: 0.50 <- переобучение (зазор 49x)
# С аугментацией:
# train_loss: 0.08, val_loss: 0.12 <- хорошее обобщение (зазор 1.5x)
Продвинутые техники
- AutoAugment: автоматический поиск лучшей стратегии аугментации
- RandAugment: случайная выборка трансформаций из пула
- CutOut: обнуление случайных регионов изображения
- Mosaic: комбинирование нескольких изображений в одно
- SpecAugment: аугментация спектрограмм для аудио
Augmentation — это критический инструмент для получения хороших моделей при ограниченных данных.