struct Conv2D {
&heap float weight;
&heap float bias;
unsigned long inChannels;
unsigned long outChannels;
unsigned long kH;
unsigned long kW;
unsigned long stride;
unsigned long padding;
}out[oc][oh][ow] = bias[oc] + sum_ic sum_kh sum_kw weight[oc][ic][kh][kw] * in[ic][ohstride+kh-padding][owstride+kw-padding] (input positions outside [0,height)x[0,width) — i.e. inside the zero padding — contribute 0). Output spatial size is (dim + 2*padding - kernel)/stride + 1; caller must choose dimensions that divide evenly (no implicit ceil/floor rounding surprises).
Fields
[outChannels, inChannels, kH, kW]
[outChannels]
Methods
Convolution + bias, computed as im2col + sgemm (std/simd/gemm.h): SIMD on any target, and split across std/sync/parallel.h's thread pool when the layer is large enough.
relu(layer.forward(input)), in one pass.
= drop()
§
static struct Conv2D new(
unsigned long inChannels,
unsigned long outChannels,
unsigned long kH,
unsigned long kW,
unsigned long stride,
unsigned long padding,
)source · definition