Перейти к содержанию

Convolution

3.3 Геометрия свёртки

Для ребра \(u \to w\) с \(\mathbf{s}(u) = (H_u, W_u)\) и \(\mathbf{s}(w) = (H_w, W_w)\) функция _kp_for_edge задаёт размер ядра и padding независимо по каждой оси \(d \in \{h, w\}\):

Условие \(k_d\) \(p_d\) Интерпретация
\(H_u > H_w\) (downsampling) \(H_u - H_w + 1\) \(0\) Сжимающая свёртка
\(H_u < H_w\) (upsampling) \(1\) \(\lfloor (H_w - H_u) / 2 \rfloor\) Расширяющая свёртка + padding
\(H_u = H_w\) (same-size) \(1\) \(0\) Свёртка \(1\times1\)

Stride всегда \(s = 1\) (неизменно).

Размер тензора после Conv2d (формула PyTorch при \(s=1\)):

\[ H' = H_u + 2p_h - k_h + 1, \qquad W' = W_u + 2p_w - k_w + 1 \]

Проверка: при downsampling \(H' = H_u + 0 - (H_u - H_w + 1) + 1 = H_w\)

Пример (CIFAR-10, \(32 \to 1\)): ребро \(0 \to o\) с \(H_u = 32\), \(H_w = 1\):

\[ k_h = 32 - 1 + 1 = 32, \quad p_h = 0 \quad \Rightarrow \quad H' = 32 + 0 - 32 + 1 = 1 \checkmark \]

Это эквивалент «глобальной» свёртки — один фильтр размером \(32 \times 32\) покрывает всё изображение.



3.4 Оператор на ребре

Для батча \(\mathbf{X} \in \mathbb{R}^{B \times C \times H_u \times W_u}\) на ребре \(u \to w\):

\[ \mathbf{Y} = \text{Conv2d}_{\theta_{u,w}}(\mathbf{X}) \]

где параметры \(\theta_{u,w} = (\mathbf{W}, \mathbf{b})\) при фиксированных \(C = C_\text{in} = C_\text{out} = 3\):

\[ \mathbf{W} \in \mathbb{R}^{3 \times 3 \times k_h \times k_w}, \qquad \mathbf{b} \in \mathbb{R}^3 \]

Поэлементная кросс-корреляция (padding_mode='zeros', stride \(s=1\)):

\[ Y_{b,c',h',w'} = b_{c'} + \sum_{c=0}^{2} \sum_{i=0}^{k_h-1} \sum_{j=0}^{k_w-1} W_{c',c,i,j} \cdot X_{b,c,\, h' + i - p_h,\, w' + j - p_w} \]

(значения вне границ карты приравниваются нулю.)

Число параметров на ребре (при \(C = 3\)):

\[ |\theta_{u,w}| = 3 \cdot 3 \cdot k_h \cdot k_w + 3 = 9 k_h k_w + 3 \]

Пример: прямое ребро \(32 \to 1\): \(|\theta| = 9 \cdot 32 \cdot 32 + 3 = 9\,219\) параметров.