Sobes.tech
Middle — Senior
96

Можно ли заменить свёртку 3x3 на две последовательные свёртки 3x1 и 1x3? В чём выигрыш и потери?

Ответ от нейросети

sobes.tech AI

Да, свёртку 3x3 можно заменить двумя последовательными свёртками 3x1 и 1x3. Такой приём часто используется для уменьшения количества параметров и вычислительной нагрузки.

Выигрыш:

  • Меньше параметров: две свёртки 3x1 и 1x3 имеют суммарно меньше весов, чем одна 3x3.
  • Меньше вычислений: операции с меньшими ядрами проще и быстрее.
  • Более глубокая архитектура: добавляется дополнительный слой нелинейности между двумя свёртками, что может улучшить выразительность модели.

Потери:

  • Потенциально меньшее восприятие контекста за один слой, так как 3x3 охватывает сразу 9 пикселей, а 3x1 и 1x3 — по 3 пикселя за свёртку.
  • Возможна потеря информации, если не правильно настроить слои или активации.

Пример на PyTorch:

import torch.nn as nn

# Оригинальная свёртка 3x3
conv_3x3 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=1)

# Замена на две свёртки 3x1 и 1x3
conv_3x1 = nn.Conv2d(64, 128, kernel_size=(3,1), padding=(1,0))
conv_1x3 = nn.Conv2d(128, 128, kernel_size=(1,3), padding=(0,1))

# Последовательное применение conv_3x1 и conv_1x3 эквивалентно conv_3x3 с меньшими параметрами