3.4.5 · D5Convolutional Neural Networks

Question bank — CNN architecture design

1,579 words7 min readBack to topic

Before we start, three words we lean on constantly:


True or false — justify

Two stacked 3×3 conv layers have the same receptive field as one 5×5 conv layer.
True. The first 3×3 sees a 3×3 window; the second 3×3 sees a 3×3 window of those, so it reaches pixels back — a 5×5 view, exactly like one 5×5 conv.
Two stacked 3×3 convs have the same number of parameters as one 5×5 conv.
False. For channels, two 3×3s cost while one 5×5 costs — the stack is ~28% cheaper, and it adds a second nonlinearity.
Adding a residual skip connection increases the parameter count of a block.
False. An identity skip () adds a plain addition, which has zero weights. Only a projection skip (used when shapes change) adds a small 1×1 conv.
A deeper CNN always achieves lower training error than a shallower one.
False. This is the exact observation that motivated ResNet: past ~20 plain layers, training error rose, because gradients degrade — deeper is not automatically more trainable.
Max pooling reduces the number of learnable parameters in a layer.
True in the trivial sense — pooling has no parameters at all. It has a fixed rule (take the max), so it adds capacity of zero while shrinking spatial size.
Global average pooling lets one trained network accept images of different sizes.
True. It collapses each channel to a single average number, so the output length depends only on channel count, not on or — no fixed-size flatten needed.
A 1×1 convolution cannot change the receptive field.
True. A 1×1 kernel looks at a single spatial position, so it never widens the window — it only mixes/reshapes channels at each pixel.
Doubling the number of filters doubles the receptive field.
False. Filter count (width) changes capacity per layer; it does nothing to RF. RF grows only via kernel size, stride, pooling, and depth.
Using stride 2 instead of a 2×2 pool gives the network more information.
False. Both downsample by 2; stride-2 conv learns how to downsample (has weights) but still throws away spatial positions. Neither adds information — they compress it.

Spot the error

"VGG uses only 3×3 convs, so its receptive field is limited to 3×3."
Wrong — stacking is the whole point. stacked 3×3 convs give , so three of them already see 7×7, and across the deep VGG stack the final RF covers most of the image.
"The bottleneck 1×1→3×3→1×1 block in ResNet-50 is slower than a plain 3×3→3×3 block."
Wrong. The 1×1s squeeze channels before the costly 3×3 runs, cutting FLOPs by roughly 70%. It is faster, not slower — that is why it exists.
"Inception puts 1×1 convs before the 5×5 branch just to add nonlinearity."
The main reason is dimensionality reduction. Feeding 256 channels straight into a 5×5 costs ~1.6M params; reducing to 64 first drops it to ~426K (~74% saving). The extra nonlinearity is a bonus.
"To double the receptive field, I should double the kernel size."
Inefficient and usually wrong. Doubling blows up parameters (). Pooling doubles effective RF for free (), and stacking small kernels grows RF cheaply.
"ResNet works because the skip connection makes gradients larger."
Not "larger" — non-vanishing. Since , the "+1" guarantees a clean gradient path even if shrinks to near zero. It preserves flow, not amplifies it.
"When we halve spatial size we should also halve the channels to save compute."
Backwards. The standard rule doubles channels when spatial size halves. Because , halving and doubling keeps FLOPs roughly constant, balancing the network.
"AlexNet switched from tanh to ReLU mainly for better accuracy on the training set."
The headline reason was faster training and no vanishing gradient in the positive region. ReLU's slope is 1 for positive inputs, so gradients don't die like they do in tanh's flat tails (see 3.4.03-activation-functions).

Why questions

Why do classic CNNs double filters after each pooling step?
To keep compute balanced. Spatial area drops 4× per 2×2 pool while channels rise 2×, so per-layer FLOPs stay steady instead of collapsing — capacity moves from "where" to "what" as we go deeper.
Why does object recognition need a larger receptive field than edge detection?
An edge is local (a few pixels), but recognizing a whole object requires seeing the whole object at once. The final neurons must have an RF that spans the object, which forces depth and pooling.
Why is learning (identity via a residual block) easier than learning the identity through plain layers?
With a skip, the network only needs to push the residual weights toward zero to copy the input. Plain layers must learn an exact identity mapping from scratch, which is a much harder target.
Why can two 3×3 convs be better than one 5×5, not just equal?
Same RF, fewer parameters, and — crucially — two nonlinear activations instead of one. More nonlinearity means the block can represent more complex functions of the same window (see 3.4.03-activation-functions).
Why does Inception use several kernel sizes in parallel instead of picking one?
Objects appear at many scales. Rather than gambling on one filter size, it runs 1×1, 3×3, 5×5, and pooling branches together and lets training weight whichever scale the data actually needs.
Why does batch normalization help very deep architectures train?
It keeps each layer's input distribution stable, which steadies gradient magnitudes through the stack and lets you use higher learning rates — a partner fix alongside skip connections (see 3.4.04-batch-normalization).
Why replace the final FC layers with global average pooling in modern nets?
FC layers carry huge parameter counts and lock the input to a fixed size. GAP has zero parameters, adds translation invariance, and frees the network to accept any input resolution.

Edge cases

What is the receptive field of a single 1×1 convolution with stride 1?
Exactly 1×1. It touches one spatial location, so it can only remix channels — useful for channel reduction, never for widening context.
What happens to the ResNet gradient path if the residual branch learns to output all zeros?
The block becomes a pure identity: output = input, and gradient = 1 through the skip. The network safely "skips" that block rather than degrading — the worst case is harmless.
For stacked 3×3 convs, what does the formula give, and does it make sense?
It gives : with zero conv layers a neuron sees a single pixel of its input. Consistent — no convolution means no spatial context is gathered.
If input spatial size is smaller than the kernel (e.g. a 3×3 conv on a 2×2 feature map with no padding), what happens?
The kernel cannot fit, so a valid convolution produces a (empty) output. You must pad, use a smaller kernel, or stop pooling earlier — a real failure mode in over-deep designs.
Does pooling ever change the number of channels?
No. Pooling acts within each channel independently, shrinking and only. Channel count changes solely through convolutions — mixing these up mis-predicts output shapes.
When you fine-tune a pretrained network on a new task (transfer learning), why do you usually keep early conv layers frozen?
Early layers learn generic edges and textures that transfer across tasks, so re-learning them wastes data and risks overfitting. The task-specific reshaping happens in the later, higher-RF layers.
If you increase depth but keep the receptive field fixed with stride-1, 3×3 convs and no pooling, what grows and what doesn't?
RF still grows () — so RF does increase; what stays fixed is spatial resolution and (per rule) you'd add nonlinearity and parameters. The trap: with no pooling, compute stays high because never shrink.