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:
- Валидация: \(\mathbf{I}.\text{shape}[1] = V\), \(\mathbf{I}.\text{shape}[2] = C\).
- Resize (при необходимости): если \((H, W) \neq (H_\text{in}, W_\text{in})\), то бицифровая интерполяция: $$ \mathbf{I}' = \text{Interpolate}\text{bilinear}(\mathbf{I},\; (H\text{in}, W_\text{in})) $$
- Привязка входов: слот \(i \leftarrow \mathbf{I}'[:, i, :, :, :]\) для \(i \in V_\text{in}\).
- Топологический обход
MergeNodeStep-ов изExecutionPlan(в порядке топологической сортировки). - Финальный 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}} $$
- Пустой граф (нет активных путей вход→выход): \(\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}\).