# max pooling size=2,stride=1 outputs same size

While working with darkflow, I encountered something that I can't understand.

I understand that maxpooling with size=2,stride=2 would decrease the output size to half of its size.

However, if the max-pooling is size=2,stride=1 then it would simply decrease the width and height of the output by 1 only.

However, the darkflow model doesn't seem to decrease the output by 1.

Here is the model structure when I load the example model tiny-yolo-voc.cfg.

Source | Train? | Layer description                | Output size
-------+--------+----------------------------------+---------------
|        | input                            | (?, 416, 416, 3)
Init  |  Yep!  | conv 3x3p1_1  +bnorm  leaky      | (?, 416, 416, 16)
Load  |  Yep!  | maxp 2x2p0_2                     | (?, 208, 208, 16)
Init  |  Yep!  | conv 3x3p1_1  +bnorm  leaky      | (?, 208, 208, 32)
Load  |  Yep!  | maxp 2x2p0_2                     | (?, 104, 104, 32)
Init  |  Yep!  | conv 3x3p1_1  +bnorm  leaky      | (?, 104, 104, 64)
Load  |  Yep!  | maxp 2x2p0_2                     | (?, 52, 52, 64)
Init  |  Yep!  | conv 3x3p1_1  +bnorm  leaky      | (?, 52, 52, 128)
Load  |  Yep!  | maxp 2x2p0_2                     | (?, 26, 26, 128)
Init  |  Yep!  | conv 3x3p1_1  +bnorm  leaky      | (?, 26, 26, 256)
Load  |  Yep!  | maxp 2x2p0_2                     | (?, 13, 13, 256)
Init  |  Yep!  | conv 3x3p1_1  +bnorm  leaky      | (?, 13, 13, 512)
**Load  |  Yep!  | maxp 2x2p0_1                     | (?, 13, 13, 512)**
Init  |  Yep!  | conv 3x3p1_1  +bnorm  leaky      | (?, 13, 13, 1024)
Init  |  Yep!  | conv 3x3p1_1  +bnorm  leaky      | (?, 13, 13, 1024)
Init  |  Yep!  | conv 1x1p0_1    linear           | (?, 13, 13, 125)
-------+--------+----------------------------------+---------------


The bold text part is causing the confusion. My expectation what (?,12,12,512) but it is not. It retains the same size (13,13)

The corresponding model info from the .cfg file is:

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
activation=leaky

[maxpool]
size=2
stride=1


Why is the output height/width not decreasing by 1?

I wondered about the same input/output size problem you described.

For the stride = 1 / size = 2 maxpool layers the padding option is set to zero by default, therefore one can wonder why the output is still the same size.

I checked all indices and thats what I observed:

The implemention of the forward_maxpool_layer-function "adds" a column and a row to the matrix, increasing its width and height by one.

Lets say we have a 3x3 matrix as follows:

    1    2    3
4    5    6
7    8    9


To actually get a 3x3 matrix as an output, something like this is done:

    1    2    3    -FM
4    5    6    -FM
7    8    9    -FM
-FM  -FM  -FM  -FM

where FM = FLOAT_MAX


They do not literally add a row and a column. If the index is to high, you simply do nothing.

Hope this helped to clarify stuff. Furthermore I am not a native speaker, so sorry for any mistake!

Darkflow uses padding when applying the pooling layer. Padding is a common mechanism for maxpooling. This allows you to keep the size the same.

I recommend the chapter "Stride and Padding" from the article A Beginner's Guide To Understanding Convolutional Neural Networks (part 2) to see how padding works in detail.

Please also note that there have been recent issues with the implementation of padding in darkflow.

• I've read the link. But the formula inside it suggest that with filter_size=2,stride=1 and for the output size to be same as the input, then the padding should be 0.5 . Is a non integer value allowed for a padding? – kwagjj Oct 6 '17 at 14:24
• Non integer value is not allowed I think – KillerSnail Nov 12 '18 at 6:41