Preenchimento VÁLIDO : este é com preenchimento zero. Espero que não haja confusão.
x = tf.constant([[1., 2., 3.], [4., 5., 6.],[ 7., 8., 9.], [ 7., 8., 9.]])
x = tf.reshape(x, [1, 4, 3, 1])
valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')
print (valid_pad.get_shape()) # output-->(1, 2, 1, 1)
MESMO preenchimento: isso é meio complicado de entender, porque precisamos considerar duas condições separadamente, conforme mencionado nos documentos oficiais .
Vamos considerar entrada como , saída como , preenchimento como , passo como e tamanho do kernel como (apenas uma única dimensão é considerada)
Caso 01 ::
Caso 02 ::
é calculado de modo que o valor mínimo que pode ser obtido para o preenchimento. Como o valor de é conhecido, o valor de pode ser encontrado usando esta fórmula .
Vamos elaborar este exemplo:
x = tf.constant([[1., 2., 3.], [4., 5., 6.],[ 7., 8., 9.], [ 7., 8., 9.]])
x = tf.reshape(x, [1, 4, 3, 1])
same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')
print (same_pad.get_shape()) # --> output (1, 2, 2, 1)
Aqui a dimensão de x é (3,4). Então, se a direção horizontal for tomada (3):
Se a direção vertical for tomada (4):
Espero que isso ajude a entender como realmente o MESMO preenchimento funciona no TF.