One transposed convolution, a 2 × 2 input with a 3 × 3 kernel at stride 2,
computed two ways. Deposits: each input value is multiplied by every
kernel weight, and the resulting patch is added to the output, the stride
spacing the patches apart; where they overlap, they sum.
Fractionally strided: put a zero between the input samples, pad the
border, and run an ordinary stride-1 convolution. The kernel arrives rotated
180°, and the output is the same 5 × 5, number for number. A stride-1 sweep over a zero-stuffed input
advances half an input sample per step: a stride of ½, hence the name.
Both views are recomputed against each other in figures/verify_numbers.py.