Abstract
VGGNet (Simonyan and Zisserman, Visual Geometry Group, Oxford, 2014), also called OxfordNet, made one decisive point: a large convolution can be replaced by a stack of small convolutions, and depth built entirely from kernels outperforms shallower networks with large ones. But the paper’s real method was a clean controlled experiment in depth, and its legacy is as much the uniform “VGG block” template as the idea itself. This note covers all three, the idea, the experiment, and the cautionary parameter cost, pointing to the full receptive-field proof where it lives elsewhere on the site.

The one idea: small kernels, stacked
VGG’s lasting discovery, still used today, is that there is no need for large convolution kernels. A convolution with a big kernel can be factored into a cascade of smaller ones:
- a convolution is equivalent, in receptive field, to two stacked convolutions;
- a convolution is equivalent to three stacked convolutions.
Equivalence of receptive field, not of weights
The equivalence is not an algebraic identity between the kernels; it is an equivalence of receptive field, the region of the input that influences one output unit.
The full derivation (the formula, the worked and cases, and the two reasons the factorization is worth doing) is developed in stacking small kernels. It is not repeated here; only the conclusions VGG drew from it are.
The two advantages that follow, both established in that note, are what made the design win:
- Fewer parameters. Three kernels cost weights against a single kernel’s , a reduction of about at the same receptive field (and for versus two ).
- More nonlinearity. Each layer is followed by its own ReLU, so a stack interposes several nonlinearities where a single large kernel interposes one, and the stack can represent a strictly richer class of functions over the same region.
Why , and not smaller
A kernel is the smallest one that still has a sense of direction. A kernel has no spatial extent at all (it sees one pixel, so it cannot tell left from right or detect an edge); a kernel has no central pixel, so it has no symmetric notion of “a center and its neighbors.” A kernel is the first to place a center pixel among all eight of its neighbors, the minimum needed to represent an oriented edge or a corner. This is why, once VGG showed that depth could supply the receptive field, became the near-universal kernel size: it is the smallest unit of spatial pattern worth stacking.
The receptive field is nominal, not effective
By its last convolutional layer a deep VGG has a nominal receptive field covering most of the image. The effective receptive field, the region that actually carries weight in an output unit’s gradient, is far smaller and roughly Gaussian, concentrated near the centre (Luo et al., 2016). Stacking small kernels grows the nominal field linearly with depth but the effective field only as its square root, so a network can in principle see the whole image long before it meaningfully does. This gap is part of why even very deep plain CNNs handle truly global, long-range relationships poorly, the weakness that attention was later built to fix.
Depth was the experiment
The popular memory of VGG is “stack kernels,” but the paper’s actual contribution was an experiment. Fixing the kernel at removes nearly every other variable, which let the authors vary one thing in isolation, depth, and measure its effect alone. They trained a family of configurations of growing depth:
| Configuration | Weight layers |
|---|---|
| VGG11 (A) | |
| VGG13 (B) | |
| VGG16 (D) | |
| VGG19 (E) |
Accuracy improved monotonically with depth up to to layers, then saturated. At the time this was among the cleanest pieces of evidence that, given the right building block, deeper is better, which is why “VGG16” and “VGG19” are named for their depth rather than any other feature. The saturation past layers was itself informative: it foreshadowed the degradation problem that ResNet would diagnose and fix a year later, namely that plain stacks cannot be pushed arbitrarily deep.
The architecture: uniformity as a principle
VGG turns that single idea into an entire design philosophy: use nothing but convolutions (stride , padding , which preserves spatial size), interleaved with max pooling, and simply make the network deep. The result is two standard configurations, named for their number of weight layers:
- VGG16: 13 convolutional layers and 3 fully connected, 16 in total;
- VGG19: 16 convolutional layers and 3 fully connected.
The regularity is the point. There are almost no architectural decisions to make per layer, only how many blocks to stack before each pooling step, which made VGG easy to understand, reproduce, and transfer.
The channel-doubling rule, and the "VGG block"
VGG fixed two patterns the field still uses. First, the block: a short run of convolutions followed by a pool, repeated. Second, the channel-doubling rule: every time pooling halves the height and width, the next block doubles the channel count (). The two move in opposite directions on purpose. Halving each spatial dimension cuts the number of positions by four, while doubling the channels only multiplies by two, so the activation volume shrinks by a factor of two per stage even as the representation grows richer per position. This “stage” structure, narrowing space while widening channels in step, became the template that almost every later backbone, ResNet included, inherited.
Result
VGG took first place in localization and second in classification at ILSVRC 2014, behind GoogLeNet. Its top-5 classification error of about was a large step down from the previous year, achieved with a strikingly plain design.
Checking the dimensions against the formulas
The diagram of VGG16 reports a spatial chain . Every number in it follows directly from the output-size formulas derived in padding and stride and pooling, using only the two operations VGG is built from.
The convolutions preserve the spatial size. They run with stride and padding , so the stride- output formula gives
That is exactly the same-padding value , which is why a convolution changes only the channel count and leaves height and width untouched. It is the reason an entire block of convolutions sits at one resolution in the diagram (for instance the two layers, or the three layers).
The max pooling halves it. Each downsampling step is a pool with stride and no padding, whose output size is
Applying it five times from the input reproduces the chain exactly:
| Pool | |||
|---|---|---|---|
| 1 | |||
| 2 | |||
| 3 | |||
| 4 | |||
| 5 |
The chain lands on , confirming the final feature map of drawn just before the dense layers. Each convolutional block leaves the resolution fixed; each pool halves it; the channel count, meanwhile, doubles at every stage () until it saturates at . Everything in the figure is accounted for.
Why the halving stays exact
Every pooling input () is even, so is already a whole number and the floor discards nothing. This is not luck: the input is a multiple of (indeed ), and five clean halvings of a multiple of land exactly on . An input that was not a multiple of would lose a pixel to the floor at some stage, and the chain would not close so neatly: this is precisely why is the standard ImageNet resolution.
That final map is where VGG’s cost is paid, which is the subject of the next section.
Training a deep net in 2014
VGG arrived before batch normalization and residual connections, which is easy to forget and central to appreciating it. A 19-layer network trained from scratch by plain SGD was, at the time, genuinely hard to optimize: the vanishing gradient made the early layers learn slowly, and a poor initialization could stall training entirely. The authors worked around this by training the shallowest configuration first and using its weights to initialize the deeper ones, growing the network in stages.
That this awkward staged procedure was necessary is exactly the difficulty that batch normalization and residual connections would soon remove: only a year later, ResNet trained a -layer network from scratch in a single run. VGG sits precisely on the boundary between the two eras, which is why it is at once the high-water mark of plain deep networks and the clearest motivation for what replaced them.
Multi-scale training and testing, the forgotten half of VGG's accuracy
VGG’s published numbers were not obtained at a single resolution. Images were rescaled so that the shorter side varied (training with jittered in , testing over several scales and averaging the results), which shows each filter objects at many sizes and acts as a powerful, nearly free augmentation. This “scale jittering” contributed a sizable share of VGG’s accuracy, and it is routinely dropped when the network is summarized as merely “deep stacks of “.
The cost: a parameter-heavy head
VGG’s weakness is the mirror image of its strength. The uniform convolutional stack is parameter-efficient, but the network ends in three large fully connected layers, and those dominate the count: VGG16 has about 138 million parameters, of which roughly 123 million live in the dense head.
The single most expensive layer is the first fully connected one, which flattens the final feature map into a -unit layer:
in one layer, more than the entire convolutional stack beneath it.
VGG is expensive at both ends, in two different currencies
The parameters and the compute do not live in the same place. The million parameters are dominated by the fully connected head (about M), so VGG is heavy to store. The floating-point operations, by contrast, are dominated by the early convolutional layers, which run filters over the largest, feature maps: VGG16 costs roughly billion multiply-adds per image, several times more than AlexNet and an order of magnitude more than GoogLeNet. So VGG is painful in two distinct ways, large on disk because of the head and slow at inference because of the front. Parameter count and compute are decoupled, and VGG is the clearest example of the gap between them.
VGG is the worked example of the dense-head problem
These exact numbers are the running example in replacing the dense head with convolutions. VGG is where the conv-to-dense parameter explosion is most visible, and the reason later backbones replaced the flattened dense head with global average pooling. VGG simplified the convolutional body to perfection and left the head untouched; the next architectures fixed the head.
Why VGG outlived its leaderboard ranking
VGG was overtaken on accuracy within a year, yet it remained one of the most widely reused backbones for far longer, and not merely out of habit. Its uniform stack grows the receptive field gradually and produces a smooth, well-behaved hierarchy of features, which turned out to be ideal for measuring perceptual similarity between images rather than classifying them. The style transfer of Gatys et al. (2015) reads texture and style off the correlations (Gram matrices) of VGG’s convolutional features; the perceptual losses of Johnson et al. (2016) train image generators by matching VGG activations. A network can stop being the best classifier and still be the most useful feature extractor, which is exactly the backbone idea in action.