3.4.4 · D2Convolutional Neural Networks

Visual walkthrough — Feature maps and receptive fields

2,224 words10 min readBack to topic

This is a picture-first walkthrough of Feature maps and receptive fields. We start from one pixel and never use a symbol before it is drawn.


Step 1 — One pixel is its own receptive field

WHAT. Before any filter touches the image, ask: how much of the input influences a single input pixel? Only itself. So we define the receptive field .

WHY. Every recursion needs a starting point (a "base case") — a known value we can build on top of. Growth formulas that don't state where they start are useless, so we pin down the smallest, most obvious case: a lone pixel sees a region.

PICTURE. In the figure the input row is a strip of squares. One square is highlighted in pale yellow; the bracket under it spans exactly one square — width . That bracket is .

Figure — Feature maps and receptive fields

Symbol check:

  • — the subscript means "layer 0", i.e. the raw input. Its value is pixel.

Step 2 — One convolution layer: the filter sets the first width

WHAT. Slide a filter of width over the input. Each output value is computed from neighbouring input pixels. So the first-layer receptive field is

WHY. We use (the kernel size) and not anything else because the kernel size is literally how many input pixels the filter reaches across in one placement. Stride does not enter yet: stride tells you how far apart different outputs sit, but a single output's reach is fixed by the kernel width alone. (Full size bookkeeping for outputs lives in Padding and stride.)

PICTURE. A window of squares in chalk blue sits over the input; the arrow drops down to one output square. The bracket over the three input squares is .

Figure — Feature maps and receptive fields

Symbol check:

  • — width of the layer-1 filter, in input pixels. Here .
  • — for the first layer only, RF equals kernel size.

Reveal:

Why is stride absent from ?
Stride changes where the next output sits, not how many inputs one output reads — one output still reads pixels.

Step 3 — The stride "zoom factor": the jump register

WHAT. Define the cumulative stride after layer as with . It says: moving one step in this layer's grid = moving pixels in the input.

WHY. We need this because upcoming layers count neighbours in their own grid, but we insist on measuring RF in input pixels. is the exchange rate that converts "one step here" into "this many input pixels". We use a product (not a sum) because each stride multiplies the previous scaling — a stride 2 after a stride 2 means one deep step skips input pixels.

PICTURE. Two stacked grids: the top (input) has fine squares; the bottom (after stride 2) has coarse squares. One coarse square spans two fine squares — the pink bracket labels this gap .

Figure — Feature maps and receptive fields

Symbol check:

  • — the stride of layer (how many input-grid steps the filter jumps).
  • — "multiply them all together".
  • — the pixels-per-step exchange rate after layers.

Step 4 — Adding a second layer: neighbours cost stride-sized jumps

WHAT. A layer-2 filter of width reads layer-1 values. The centre one already sees input pixels. The other values sit further out, and each extra step out is input pixels away. So the new width is

WHY. We split the neighbours into "the centre one" ( already accounted for) plus " extra ones". Each extra neighbour is one layer-1 step away, and Step 3 told us one layer-1 step input pixels. That is exactly why (the exchange rate) multiplies — we're converting extra layer-1 steps into input pixels.

PICTURE. Top strip = input. Middle strip = layer-1 outputs, each labelled with the block it covers. A layer-2 window of middle-cells is drawn; its outer two cells reach fresh input pixels. The total bracket over the input is .

Figure — Feature maps and receptive fields

Term-by-term:

  • — width the centre neighbour already covers.
  • — the number of extra neighbours beyond the centre.
  • — input pixels each extra neighbour reaches further out.

Step 5 — The general recursion (peel one layer at a time)

WHAT. Nothing about Step 4 was special to layer 2. Let be the ==kernel size at layer == — the number of values that layer's filter reads across, measured in the grid of layer . At any layer , the extra neighbours each cost input pixels:

WHY. We reuse the Step-4 argument instead of re-deriving it because the geometry repeats identically at every layer — that is the whole point of a recursion: one rule, applied over and over. We use (strides before layer ) because layer 's own stride affects later layers, not the reach of its own neurons.

PICTURE. A staircase: each step up is a layer; the horizontal bar (RF) gets wider each step, and next to each widening is the label showing exactly how much was added.

Figure — Feature maps and receptive fields

Reveal:

Why and not ?
Layer 's own stride spreads apart outputs of layer l, which only matters for layers after it — not for how far layer itself reaches.

Step 6 — Pooling is just another layer

WHAT. A pooling window of size and stride obeys the same two updates — the RF recursion and the jump update: Just plug and into the exact rules from Steps 3 and 5.

WHY. Pooling reads a patch and jumps by — geometrically identical to a strided conv. The math cannot tell them apart, so neither should we. Forgetting to count pooling is the #1 receptive-field bug. Note the jump update is written right next to the RF update so the pool's two effects — widen now, amplify later — stay visible together.

PICTURE. A pool (yellow) sits over two conv outputs; the RF widens by , then the pool's stride doubles for everything downstream.

Figure — Feature maps and receptive fields

Step 7 — Edge and degenerate cases

WHAT & WHY. A formula you trust only in the "nice" case is a trap. Check the corners by driving the boxed recursion into each extreme:

  • All strides (): the recursion becomes . For uniform this is linear growth. Small kernels stacked deeply grow RF slowly.
  • All strides , uniform : now , so using the geometric sum . This is exponential growth — the reason real architectures downsample. (Check: gives ✓.)
  • (1×1 conv): contributes . RF does not grow — a conv mixes channels, never widens spatial reach.
  • Dilation : replace by an effective kernel — derived just below.

WHY ? A dilation inserts empty gaps between consecutive filter taps. Picture taps laid on the input: there are gaps between them. With no dilation () each gap is pixel wide, so the taps span pixels. With dilation each gap is stretched to pixels — so each of the gaps gains extra pixels. Total span: At this correctly gives (no stretch). Feeding into the same recursion:

  • Layer 1, : .
  • Layer 2, : .
  • Layer 3, : .

RF explodes with no extra parameters — the trick behind dense prediction in object detection and segmentation.

PICTURE. Two curves on the same axes: linear (stride 1) crawling up, exponential (stride 2) rocketing — both drawn from the boxed recursion.

Figure — Feature maps and receptive fields

The one-picture summary

Figure — Feature maps and receptive fields

The single figure stacks the whole chain: input pixel → conv widens by → each further layer adds → pooling multiplies → RF fans out over the input. Read it left-to-right and you have re-derived the recursion.

Recall Feynman retelling — say it in plain words

Start with one dot: it only sees itself, width one. Put a filter of width three on top — now that spot sees three input dots. Add another filter: it reads three of the layer-below spots, but the ones off to the sides reach further input dots. How much further? That depends on how much we've been skipping so far — the jump factor , which is just all the strides multiplied. So each new layer widens the view by "how many extra taps" times "how big each skip is". Pooling is just a filter that also skips, so it counts too, and its skip doubles the jump factor for everyone after it. Stack a few of these with skipping and the tiny dot ends up seeing a huge chunk of the picture — that's how a deep neuron knows "this edge belongs to a face, not a random line."

Recall Key equations to reconstruct

Base ::: , Recursion ::: Jump ::: Stride-1 uniform ::: Stride-2 uniform ::: Dilated kernel :::