conv2d_maxpool.md 1.2 KB

2D convolution and MaxPooling

TF equivalent

layers.Conv2d(
  filters=32,
  kernel_size=5,
  strides=(1, 1),
  padding='valid',
  data_format='channels_last',
  dilation_rate=(1, 1),
  activation='relu',
  use_bias=False,
  trainable=True
)

layers.MaxPooling2D(
  pool_size=(224, 224),
  strides=(2, 2),
  padding='valid',
  data_format='channels_last'
)

Tensor sizes

Input:

  • from TF: [batchSize, imageY, imageX, channels]
  • to FPGA: [imageY, imageX, channels]

Filter:

  • from TF: [kernelY, kernelX, channels, outputChannels]
  • to FPGA: [kernelY, kernelX, channels, outputChannels]

Output:

  • from FPGA: [imageY2, imageX2, outputChannels]
  • to TF: [batchSize, imageY2, imageX2, outputChannels]

Parallelization

  • (batchSize) jobs will be created.
  • layer can be called in parallel (functional model)
for sample in range(batchSize):
    output[sample] = job(
      input[sample], 
      kernel
    )

Constraints

  imageX  = imageY  = 228
  kernelX = kernelY = 5
  imageX2 = imageY2 = 112
  channels = 3
  outputChannels = 32

Job lengths

  • to FPGA: 5 * 5 * 3 * 32 + 228 * 228 * 3 = 158352
  • from FPGA: 112 * 112 * 32 = 401408

Gradient

tbd