← Назад к вопросам
Что такое операция свертки? Какие у неё свойства?
2.0 Middle🔥 251 комментариев
#Глубокое обучение
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Операция свертки (Convolution Operation)
Свертка — это математическая операция, которая применяет фильтр (kernel) к входным данным для извлечения локальных признаков. Основа CNN (Convolutional Neural Networks).
Математическое определение
(f * g)(x) = ∫ f(t) × g(x - t) dt (интегральная свертка)
Для дискретных данных (изображения):
Output(i,j) = Σ Σ Input(i+m, j+n) × Kernel(m, n)
Пример: 2D свертка
Входное изображение (5×5): Kernel (3×3):
[1 2 3 4 5] [1 0 -1]
[2 3 4 5 6] [2 0 -2]
[3 4 5 6 7] [1 0 -1]
[4 5 6 7 8] (Sobel edge detector)
[5 6 7 8 9]
Процесс:
1. Поместить kernel в позицию (0,0)
2. Перемножить элементы и просуммировать
3. Результат → output пиксель
4. Сдвинуть kernel на шаг (stride) и повторить
Реализация в PyTorch
import torch
import torch.nn.functional as F
# Входные данные: (batch_size, channels, height, width)
X = torch.randn(1, 3, 224, 224) # одно RGB изображение
# Kernel (filter): (out_channels, in_channels, kernel_h, kernel_w)
kernel = torch.randn(32, 3, 3, 3) # 32 фильтра 3×3
# Свертка
output = F.conv2d(X, kernel, stride=1, padding=1)
print(output.shape) # (1, 32, 224, 224)
# Или через слой
conv_layer = torch.nn.Conv2d(
in_channels=3,
out_channels=32,
kernel_size=3,
stride=1,
padding=1
)
output = conv_layer(X)
Свойства свертки
1. Локальность (Locality)
Каждый выходной пиксель зависит только от локальной области входа
Преимущество:
- Экономит память (не нужно обрабатывать весь экран одновременно)
- Находит локальные признаки (edges, textures)
2. Перестановочность (Commutativity)
f * g = g * f (в математике)
Но в глубоком обучении:
- Kernel(фильтр) НЕ коммутативен с Input
- Conv2d(image, kernel) ≠ Conv2d(kernel, image)
3. Трансляционная инвариантность (Translation Invariance)
Если подвинуть объект на одно место на изображении,
свертка найдет его в любой позиции
Примерно: у кота в левом углу и правом углу одинаковые признаки
4. Параметризация (Parameter Sharing)
Один kernel используется для всего изображения
- Уменьшает количество параметров
- Ускоряет обучение
Сравнение:
Полносвязный слой (FC): 224×224×3 входа × 32 выхода = 4.8M параметров
Swertka: 3×3×3 kernel × 32 = 864 параметров (5000x меньше!)
Гиперпараметры свертки
conv = nn.Conv2d(
in_channels=3,
out_channels=32,
kernel_size=3, # размер фильтра (3×3)
stride=1, # шаг смещения (на сколько пиксель сдвигаем)
padding=1, # добавляем нули по краям
dilation=1, # расстояние между элементами kernel
groups=1 # групповая свертка (1 = обычная)
)
# Формула выходного размера:
output_size = (input_size - kernel_size + 2×padding) / stride + 1
# Пример:
input_size = 224
kernel_size = 3
padding = 1
stride = 1
output_size = (224 - 3 + 2×1) / 1 + 1 = 224 (same size!)
Примеры ядер (Kernels)
import numpy as np
# Edge detection (Sobel X)
sobel_x = np.array([
[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]
])
# Blur (Gaussian)
blur = np.array([
[1, 2, 1],
[2, 4, 2],
[1, 2, 1]
]) / 16
# Sharpen
sharpen = np.array([
[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]
])
# В CNN: kernel учится автоматически!
Типы сверток
1. Standard Convolution
conv = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3)
2. Dilated Convolution (расширенная)
conv_dilated = nn.Conv2d(
in_channels=64,
out_channels=128,
kernel_size=3,
dilation=2 # пропускаем каждый второй пиксель
)
# Receptive field больше, параметров меньше
3. Depthwise Separable Convolution
# Разделяем на две операции: глубинная + точечная
# в 9x раз меньше параметров
4. Transposed Convolution (Upsampling)
deconv = nn.ConvTranspose2d(
in_channels=128,
out_channels=64,
kernel_size=3
) # увеличивает размер (для segmentation, style transfer)
Применение в архитектурах
from torchvision import models
# ResNet
resnet = models.resnet50() # много Conv2d слоев
# VGG
vgg = models.vgg16() # 13 conv слоев + pooling
# MobileNet (эффективная архитектура)
mobilenet = models.mobilenet_v2() # depthwise separable convolutions
Рецептивное поле (Receptive Field)
Какую область входа "видит" один выходной пиксель?
Один Conv2d слой: RF = kernel_size
Два Conv2d слоя: RF растёт
Много слоёв: RF охватывает всё изображение
Пример:
- Conv(k=3) + Conv(k=3) → RF = 5×5
- Conv(k=3) + Conv(k=3) + Conv(k=3) → RF = 7×7
Преимущества свертки для изображений
✓ Локальность: находит локальные признаки
✓ Общий параметры: меньше параметров, быстрее обучение
✓ Трансляционная инвариантность: находит объекты везде
✓ Иерархия: ранние слои = простые признаки
последние слои = сложные объекты
Резюме
Свертка (Convolution):
- Применяет фильтр к входным данным
- Основа CNN
- Параметры: kernel_size, stride, padding, dilation
- Свойства: локальность, параметризация, трансляционная инвариантность
- Типы: standard, dilated, depthwise separable, transposed
- Создает иерархию признаков (edges → shapes → objects)