The two assumptions that make it work
A convolutional network is a dense network with two constraints imposed on the weights, and both constraints are statements about images.
Locality says a pixel is explained by its neighbours. Sharing says a pattern is worth finding wherever it appears.
Those constraints are what make the parameter count independent of image size, and they are the entire reason images are tractable.
The stack, and what it does to the shapes
The usual pattern is a block of convolutions, then a downsample, repeated. Spatial size halves and channel count doubles at each stage.
That halves the activation volume per stage while keeping the arithmetic per layer roughly level, which is the trade the design is built around.
Early layers are cheap in parameters and expensive in arithmetic, because the maps are large. Late layers are the reverse.
One forward pass, in order
- Convolve, producing one map per filter.
- Normalise across the batch, then apply ReLU.
- Repeat for the other convolutions in the block.
- Downsample by pooling or by a stride-2 convolution.
- Repeat the block at the next scale, with more channels.
- Global average pool to one vector, then a single dense layer to the classes.
Counting the cost of a layer
A 3 by 3 layer from 256 to 256 channels on a 28 by 28 map is 590,000 parameters and about 925 million operations per image.
Training memory is dominated by activations rather than weights, because every map is held for the backward pass and the batch multiplies all of them.
That is why batch size is the first thing to cut when a convolutional model does not fit.
What the constraints cost
Weight sharing gives equivariance rather than invariance: shifting the input shifts the feature map, and it takes pooling or augmentation to stop caring where.
Nothing in a convolution is invariant to rotation or scale, so those have to come from data augmentation. A network trained on upright faces does not recognise upside down ones.
A vision transformer drops both constraints and learns the relationships instead, which needs far more data to reach the same place and then keeps going past it.