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

Forward pass

3.7 Полный forward pass

Входной тензор:

\[ \mathbf{I} \in \mathbb{R}^{B \times V \times C \times H_\text{in} \times W_\text{in}}, \quad C = 3 \]

Алгоритм ConvolutionalNeuralNetwork.forward:

  1. Валидация: \(\mathbf{I}.\text{shape}[1] = V\), \(\mathbf{I}.\text{shape}[2] = C\).
  2. Resize (при необходимости): если \((H, W) \neq (H_\text{in}, W_\text{in})\), то бицифровая интерполяция: $$ \mathbf{I}' = \text{Interpolate}\text{bilinear}(\mathbf{I},\; (H\text{in}, W_\text{in})) $$
  3. Привязка входов: слот \(i \leftarrow \mathbf{I}'[:, i, :, :, :]\) для \(i \in V_\text{in}\).
  4. Топологический обход MergeNodeStep-ов из ExecutionPlan (в порядке топологической сортировки).
  5. Финальный pool выходного слота: $$ \mathbf{F} = \text{AdaptiveAvgPool2d}(\mathbf{A}o,\; (H\text{out}, W_\text{out})) \in \mathbb{R}^{B \times 3 \times H_\text{out} \times W_\text{out}} $$
  6. Пустой граф (нет активных путей вход→выход): \(\mathbf{F} = \mathbf{0}\).

Pruning рёбер: исполняются только рёбра, лежащие на путях от входов к выходу (_connections_on_output_paths). «Мёртвые ветви» (enabled, но не достижимые из output) не создают Conv2d-модулей.

Глубина вершины \(d(v)\) — минимальное число рёбер от любого входа до \(v\) (_compute_graph_depths).

Матричная форма (для сети без скрытых вершин, \(V=1\), \(K\) прямых рёбер \(0 \to o\)):

\[ \mathbf{F} = \text{Pool}\!\left(\frac{1}{K}\sum_{k=1}^K \mathbf{W}_k \ast \mathbf{I}\right) \]

Это взвешенная сумма \(K\) линейных фильтров — линейный оператор по \(\mathbf{I}\).