Tensorflow Strides Argumento


Estoy tratando de entender el argumento strides en tf.nn.avg_pool, tf.nn.max_pool, tf.nn.conv2d.

La documentación repetidamente dice

Zancadas: Una lista de ints que tiene longitud >= 4. La zancada de la ventana deslizante para cada dimensión del tensor de entrada.

Mis preguntas son:

  1. ¿Qué representa cada uno de los enteros 4+?
  2. ¿Por qué deben tener zancadas[0] = zancadas[3] = 1 para convnets?
  3. En este ejemplo vemos tf.reshape(_X,shape=[-1, 28, 28, 1]). Por qué -1?

Lamentablemente, los ejemplos en los documentos para reshape usando -1 no se traducen demasiado bien a este escenario.

Author: jfbeltran, 2016-01-06

4 answers

El pooling y convolutional ops deslizan una "ventana" a través del tensor de entrada. Usando tf.nn.conv2d como ejemplo: Si el tensor de entrada tiene 4 dimensiones: [batch, height, width, channels], entonces la convolución opera en una ventana 2D en las dimensiones height, width.

strides determina cuánto cambia la ventana en cada una de las dimensiones. El uso típico establece la primera zancada (el lote) y la última (la profundidad) en 1.

Usemos un ejemplo muy concreto: Ejecutar una convolución 2-d sobre un 32x32 imagen de entrada en escala de grises. Digo escala de grises porque entonces la imagen de entrada tiene profundidad=1, lo que ayuda a mantenerlo simple. Deja que esa imagen se vea así:

00 01 02 03 04 ...
10 11 12 13 14 ...
20 21 22 23 24 ...
30 31 32 33 34 ...
...

Vamos a ejecutar una ventana de convolución 2x2 sobre un solo ejemplo (tamaño de lote = 1). Le daremos a la convolución una profundidad de canal de salida de 8.

La entrada a la convolución tiene shape=[1, 32, 32, 1].

Si se especifica strides=[1,1,1,1] con padding=SAME, entonces la salida del filtro será [1, 32, 32, 8].

El filtro primero creará un salida para:

F(00 01
  10 11)

Y luego para:

F(01 02
  11 12)

Y así sucesivamente. Luego se moverá a la segunda fila, calculando:

F(10, 11
  20, 21)

Entonces

F(11, 12
  21, 22)

Si especifica una zancada de [1, 2, 2, 1] no hará ventanas superpuestas. Calculará:

F(00, 01
  10, 11)

Y luego

F(02, 03
  12, 13)

El stride funciona de manera similar para los operadores de pooling.

Pregunta 2: ¿Por qué zancadas [1, x, y, 1] para convnets

El primer 1 es el lote: No por lo general, desea omitir ejemplos en su lote, o no debería haberlos incluido en primer lugar. :)

El último 1 es la profundidad de la convolución: Normalmente no desea omitir entradas, por la misma razón.

El operador conv2d es más general, por lo que podría crear convoluciones que deslicen la ventana a lo largo de otras dimensiones, pero ese no es un uso típico en convnets. El uso típico es usarlos espacialmente.

Por qué remodelar a -1 -1 es un marcador de posición que dice " ajustar según sea necesario para que coincida con el tamaño necesario para el tensor completo."Es una forma de hacer que el código sea independiente del tamaño del lote de entrada, para que pueda cambiar su canalización y no tenga que ajustar el tamaño del lote en todas partes del código.

 206
Author: dga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-19 21:47:07

Las entradas son 4 dimensionales y son de forma: [batch_size, image_rows, image_cols, number_of_colors]

Las zancadas en general definen una superposición entre las operaciones de aplicación. En el caso de conv2d, especifica cuál es la distancia entre aplicaciones consecutivas de filtros convolucionales. El valor de 1 en una dimensión específica significa que aplicamos el operador en cada fila / col, el valor de 2 significa cada segundo, y así sucesivamente.

Re 1) Los valores que importan para las circunvoluciones son 2nd y 3rd y representan la superposición en la aplicación de los filtros convolucionales a lo largo de filas y columnas. El valor de [1, 2, 2, 1] dice que queremos aplicar los filtros en cada segunda fila y columna.

Re 2) No conozco las limitaciones técnicas (podría ser un requisito de cuDNN), pero normalmente la gente usa pasos a lo largo de las dimensiones de las filas o columnas. No necesariamente tiene sentido hacerlo sobre el tamaño del lote. No estoy seguro de la última dimensión.

Re 3) Ajuste -1 para uno de los dimensión significa, "establecer el valor de la primera dimensión para que el número total de elementos en el tensor no cambie". En nuestro caso el -1 será igual al batch_size.

 15
Author: Rafał Józefowicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-06 21:20:22

Comencemos con lo que stride hace en 1-dim case.

Supongamos que su input = [1, 0, 2, 3, 0, 1, 1] y kernel = [2, 1, 3] el resultado de la convolución es [8, 11, 7, 9, 4], que se calcula deslizando su núcleo sobre la entrada, realizando una multiplicación por elementos y sumando todo. Así :

  • 8 = 1 * 2 + 0 * 1 + 2 * 3
  • 11 = 0 * 2 + 2 * 1 + 3 * 3
  • 7 = 2 * 2 + 3 * 1 + 0 * 3
  • 9 = 3 * 2 + 0 * 1 + 1 * 3
  • 4 = 0 * 2 + 1 * 1 + 1 * 3

Aquí deslizamos por un elemento, pero nada te detiene usando cualquier otro número. Este número es tu paso. Usted puede pensar en ello como downsampling el resultado de la convolución de 1 estriado simplemente tomando cada s-ésimo resultado.

Conociendo el tamaño de entrada i , tamaño del núcleo k , stride s y padding p puede calcular fácilmente el tamaño de salida de la convolución como:

introduzca la descripción de la imagen aquí

Aquí / / operador significa techo operación. Para una capa de agrupación s = 1.


N-dim case.

Conocer las matemáticas para un caso 1-dim, n-dim caso es fácil una vez que ves que cada dim es independiente. Así que desliza cada dimensión por separado. Aquí hay un ejemplo para 2-d. Note que usted no necesita tener la misma zancada en todas las dimensiones. Por lo tanto, para una entrada/núcleo N-dim debe proporcionar N pasos.


Así que ahora es fácil responder a todas sus preguntas:

  1. ¿Qué hacer cada uno de los 4+ enteros representan?. conv2d, pool le dice que esta lista representa los avances entre cada dimensión. Observe que la longitud de la lista de pasos es la misma que el rango del tensor del núcleo.
  2. ¿Por qué deben tener zancadas[0] = zancadas3 = 1 ¿para convnets?. La primera dimensión es el tamaño del lote, la última es canales. No hay punto de saltar ni lote ni canal. Así que los haces 1. Para ancho / alto puede omitir algo y es por eso que podrían no ser 1.
  3. tf.remodelar (_X, forma=[-1, 28, 28, 1]). Por qué -1? tf.reshape lo tiene cubierto para usted:

    Si un componente de shape es el valor especial -1, el tamaño de esa dimensión se calcula para que el tamaño total permanezca constante. En particular, una forma de [-1] se aplana en 1-D. A lo sumo un componente de la forma puede ser -1.

 8
Author: Salvador Dali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-13 18:32:33

@dga ha hecho un trabajo maravilloso explicando y no puedo estar lo suficientemente agradecido de lo útil que ha sido. De la misma manera, me gustaría compartir mis hallazgos sobre cómo stride funciona en convolución 3D.

De acuerdo con la documentación TensorFlow en conv3d, la forma de la entrada debe estar en este orden:

[batch, in_depth, in_height, in_width, in_channels]

Vamos a explicar las variables de la extrema derecha a la izquierda usando un ejemplo. Suponiendo que la forma de entrada es input_shape = [1000,16,112,112,3]

input_shape[4] is the number of colour channels (RGB or whichever format it is extracted in)
input_shape[3] is the width of the image
input_shape[2] is the height of the image
input_shape[1] is the number of frames that have been lumped into 1 complete data
input_shape[0] is the number of lumped frames of images we have.

A continuación se presenta un resumen documentación sobre cómo se utiliza stride.

Strides: Una lista de ints que tiene longitud >= 5. Tensor 1-D de longitud 5. La zancada de la ventana deslizante para cada dimensión de entrada. Deber tienen strides[0] = strides[4] = 1

Como se indica en muchas obras, zancadas simplemente significan cuántos pasos de distancia una ventana o núcleo salta del elemento más cercano, ya sea un marco de datos o un píxel (esto está parafraseado por cierto).

De la documentación anterior, una zancada en 3D se verá como esta zancada = (1,X,Y,Z,1).

La documentación enfatiza que strides[0] = strides[4] = 1.

strides[0]=1 means that we do not want to skip any data in the batch 
strides[4]=1 means that we do not want to skip in the channel 

Zancadas[X] significa cuántos saltos debemos hacer en los cuadros agrupados. Por ejemplo, si tenemos 16 fotogramas, X = 1 significa usar cada fotograma. X = 2 significa usar cada segundo fotograma y va y sigue

Zancadas[y] y zancadas[z] siguen la explicación de @dga así que no voy a rehacer esa parte.

En keras sin embargo, solo necesita especificar una tupla/lista de 3 enteros, especificando las zancadas de la convolución a lo largo de cada dimensión espacial, donde la dimensión espacial es zancada[x], zancadas[y] y zancadas[z]. zancadas [0] y zancadas[4] ya está por defecto a 1.

Espero que alguien encuentre esto útil!

 1
Author: rocksyne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-01 03:26:56