Relleno VÁLIDO : esto es con relleno cero. Espero que no haya confusión.
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)
El mismo relleno: es un poco difícil de entender en primer lugar porque tenemos que considerar dos condiciones por separado como se menciona en los documentos oficiales .
Tomemos input as , output as , padding as , stride as y kernel size as (solo se considera una sola dimensión)
Caso 01 ::
Caso 02 ::
se calcula de tal manera que el valor mínimo que se puede tomar para el relleno. Como se conoce el valor de, se puede encontrar el valor de utilizando esta fórmula .
Analicemos este ejemplo:
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)
Aquí la dimensión de x es (3,4). Entonces, si se toma la dirección horizontal (3):
Si se toma la dirección vertical (4):
Espero que esto ayude a comprender cómo funciona realmente el mismo relleno en TF.