¿Cuál es la diferencia entre 'mismo' y el relleno 'válidos' en el tf.nn.max_pool
de tensorflow
?
En mi opinión, 'VÁLIDO' significa que no habrá relleno cero fuera de los bordes cuando hagamos el grupo máximo.
De acuerdo con una guía de aritmética de convolución para el aprendizaje profundo , dice que no habrá relleno en el operador de la piscina, es decir, solo use 'VÁLIDO' de tensorflow
. Pero, ¿en qué consiste el relleno 'MISMO' del grupo máximo tensorflow
?
python
tensorflow
deep-learning
karl_TUM
fuente
fuente
Respuestas:
Daré un ejemplo para aclararlo:
x
: imagen de entrada de forma [2, 3], 1 canalvalid_pad
: grupo máximo con 2x2 kernel, stride 2 y relleno VÁLIDO.same_pad
: grupo máximo con 2x2 kernel, stride 2 y el mismo relleno (esta es la forma clásica de hacerlo)Las formas de salida son:
valid_pad
: aquí, sin relleno, por lo que la forma de salida es [1, 1]same_pad
: aquí, rellenamos la imagen a la forma [2, 4] (con-inf
y luego aplicamos el grupo máximo), por lo que la forma de salida es [1, 2]fuente
Si te gusta el arte ascii:
"VALID"
= sin relleno:"SAME"
= con relleno cero:En este ejemplo:
Notas:
"VALID"
solo deja caer las columnas del extremo derecho (o las filas del extremo inferior)."SAME"
intenta rellenar uniformemente hacia la izquierda y hacia la derecha, pero si la cantidad de columnas a agregar es impar, agregará la columna adicional a la derecha, como es el caso en este ejemplo (la misma lógica se aplica verticalmente: puede haber una fila adicional de ceros en la parte inferior).Editar :
Sobre el nombre
"SAME"
relleno, si usa una zancada de 1, las salidas de la capa tendrán las mismas dimensiones espaciales que sus entradas."VALID"
relleno, no hay entradas de relleno "inventadas". La capa solo usa datos de entrada válidos .fuente
-inf
.Cuando
stride
es 1 (más típico con convolución que agrupación), podemos pensar en la siguiente distinción:"SAME"
: el tamaño de salida es el mismo que el tamaño de entrada. Esto requiere que la ventana del filtro se deslice fuera del mapa de entrada, de ahí la necesidad de rellenar."VALID"
: La ventana de filtro permanece en una posición válida dentro del mapa de entrada, por lo que el tamaño de salida se reducefilter_size - 1
. No se produce relleno.fuente
SAME
y bienVALID
podría haber sido llamadofoo
ybar
El ejemplo de convolución TensorFlow ofrece una visión general sobre la diferencia entre
SAME
yVALID
:Para el
SAME
relleno, la altura y el ancho de salida se calculan como:Y
Para el
VALID
relleno, la altura y el ancho de salida se calculan como:fuente
El relleno es una operación para aumentar el tamaño de los datos de entrada. En el caso de datos unidimensionales, simplemente agrega / antepone la matriz con una constante, en 2-dim rodea la matriz envolvente con estas constantes. En n-dim rodeas tu hipercubo n-dim con la constante. En la mayoría de los casos, esta constante es cero y se llama relleno de cero.
Aquí hay un ejemplo de relleno cero con
p=1
tensor aplicado a 2-d:Puede usar relleno arbitrario para su núcleo, pero algunos de los valores de relleno se usan con más frecuencia que otros:
k
k
, este relleno es igual ak - 1
.Para usar relleno arbitrario en TF, puede usar
tf.pad()
fuente
Explicacion rapida
VALID
: No aplique ningún relleno, es decir, suponga que todas las dimensiones son válidas para que la imagen de entrada quede completamente cubierta por el filtro y la zancada que especificó.SAME
: Aplique relleno a la entrada (si es necesario) para que la imagen de entrada quede completamente cubierta por el filtro y la zancada que especificó. Para el paso 1, esto asegurará que el tamaño de la imagen de salida sea el mismo que el de la entrada.Notas
NO_PADDING
lugar.AUTO_PADDING
lugar.SAME
(es decir, el modo de relleno automático), Tensorflow intentará distribuir el relleno de manera uniforme tanto a la izquierda como a la derecha.VALID
(es decir, sin modo de relleno), Tensorflow colocará las celdas derecha y / o inferior si su filtro y zancada no cubren completamente la imagen de entrada.fuente
Cito esta respuesta de los documentos oficiales de Tensorflow https://www.tensorflow.org/api_guides/python/nn#Convolution Para el relleno 'SAME', la altura y el ancho de salida se calculan como:
y el relleno en la parte superior e izquierda se calculan como:
Para el relleno 'VÁLIDO', la altura y el ancho de salida se calculan como:
y los valores de relleno son siempre cero.
fuente
Hay tres opciones de relleno: válido (sin relleno), igual (o medio), completo. Puede encontrar explicaciones (en Theano) aquí: http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html
El relleno válido no implica relleno cero, por lo que cubre solo la entrada válida, sin incluir ceros generados artificialmente. La longitud de salida es ((la longitud de entrada) - (k-1)) para el tamaño de kernel k si la zancada s = 1.
El mismo relleno hace que el tamaño de las salidas sea el mismo que el de las entradas cuando s = 1. Si s = 1, el número de ceros rellenos es (k-1).
El relleno completo significa que el núcleo se ejecuta sobre todas las entradas, por lo que en los extremos, el núcleo puede cumplir con la única entrada y ceros más. El número de ceros rellenos es 2 (k-1) si s = 1. La longitud de salida es ((la longitud de entrada) + (k-1)) si s = 1.
Por lo tanto, el número de rellenos: (válido) <= (igual) <= (completo)
fuente
Acolchado activado / desactivado. Determina el tamaño efectivo de su entrada.
VALID:
Sin relleno. Las operaciones de convolución, etc., solo se realizan en ubicaciones "válidas", es decir, no demasiado cerca de los bordes de su tensor.Con un núcleo de 3x3 y una imagen de 10x10, estaría realizando una convolución en el área de 8x8 dentro de los bordes.
SAME:
Se proporciona relleno. Siempre que su operación haga referencia a un vecindario (no importa cuán grande), se proporcionan valores cero cuando ese vecindario se extiende fuera del tensor original para permitir que esa operación funcione también en valores de borde.Con un núcleo de 3x3 y una imagen de 10x10, estaría realizando una convolución en el área completa de 10x10.
fuente
Relleno VÁLIDO : esto es con relleno cero. Espero que no haya confusión.
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:
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.
fuente
Basado en la explicación aquí y siguiendo la respuesta de Tristan, usualmente uso estas funciones rápidas para controles de cordura.
fuente
En resumen, el relleno "válido" significa que no hay relleno. El tamaño de salida de la capa convolucional se reduce según el tamaño de entrada y el tamaño del núcleo.
Por el contrario, 'mismo' relleno significa usar relleno. Cuando el paso se establece en 1, el tamaño de salida de la capa convolucional se mantiene como el tamaño de entrada al agregar un cierto número de 'borde 0' alrededor de los datos de entrada al calcular la convolución.
Espero que esta descripción intuitiva ayude.
fuente
Aquí, W y H son el ancho y la altura de entrada, F son las dimensiones del filtro, P es el tamaño del relleno (es decir, el número de filas o columnas a rellenar)
Para el mismo relleno:
Para relleno VÁLIDO:
fuente
Complementando la gran respuesta de YvesgereY, esta visualización me pareció extremadamente útil:
El relleno ' válido ' es la primera figura. La ventana del filtro permanece dentro de la imagen.
El relleno ' igual ' es la tercera figura. La salida es del mismo tamaño.
Lo encontré en este artículo .
fuente
Respuesta compatible con Tensorflow 2.0 : se han proporcionado explicaciones detalladas anteriormente, sobre el relleno "válido" y el "mismo".
Sin embargo, especificaré diferentes funciones de agrupación y sus respectivos comandos en
Tensorflow 2.x (>= 2.0)
beneficio de la comunidad.Funciones en 1.x :
tf.nn.max_pool
tf.keras.layers.MaxPool2D
Average Pooling => None in tf.nn, tf.keras.layers.AveragePooling2D
Funciones en 2.x :
tf.nn.max_pool
si se usa en 2.xytf.compat.v1.nn.max_pool_v2
ortf.compat.v2.nn.max_pool
, si se migró de 1.xa 2.x.tf.keras.layers.MaxPool2D
si se usa en 2.xytf.compat.v1.keras.layers.MaxPool2D
otf.compat.v1.keras.layers.MaxPooling2D
otf.compat.v2.keras.layers.MaxPool2D
otf.compat.v2.keras.layers.MaxPooling2D
, si se migró de 1.xa 2.x.Average Pooling => tf.nn.avg_pool2d
otf.keras.layers.AveragePooling2D
si se usa en TF 2.xytf.compat.v1.nn.avg_pool_v2
otf.compat.v2.nn.avg_pool
otf.compat.v1.keras.layers.AveragePooling2D
otf.compat.v1.keras.layers.AvgPool2D
otf.compat.v2.keras.layers.AveragePooling2D
otf.compat.v2.keras.layers.AvgPool2D
, si se migraron de 1.xa 2.x.Para obtener más información sobre la migración de Tensorflow 1.xa 2.x, consulte esta Guía de migración .
fuente