J'essayais de comprendre quelques notions de base sur le tensorflow et je me suis retrouvé coincé lors de la lecture de la documentation relative au pool maximal de calques 2D: https://www.tensorflow.org/tutorials/layers#pool_layer_1
Voici comment max_pool2d est spécifié:
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
où conv1
a un tenseur de forme [batch_size, image_width, image_height, channels]
, concrètement dans ce cas, c'est [batch_size, 28, 28, 32]
.
Notre entrée est donc un tenseur de forme: [batch_size, 28, 28, 32]
.
Si je comprends bien, une couche 2D de mise en pool maximale consiste à appliquer un filtre de taille pool_size
(2x2 dans ce cas) et une fenêtre glissante par déplacement de stride
(également 2x2). Cela signifie que width
et height
de l’image seront divisés par deux, c’est-à-dire que nous aurons 14x14 pixels par canal (32 canaux au total), ce qui signifie que notre sortie est un tenseur de forme: [batch_size, 14, 14, 32]
.
Cependant, selon le lien ci-dessus, la forme du tenseur de sortie est [batch_size, 14, 14, 1]
:
Our output tensor produced by max_pooling2d() (pool1) has a shape of
[batch_size, 14, 14, 1]: the 2x2 filter reduces width and height by 50%.
Qu'est-ce que j'oublie ici?
Comment 32 a-t-il été converti en 1?
Ils appliquent la même logique plus tard ici: https://www.tensorflow.org/tutorials/layers#convolutional_layer_2_and_pool_layer_2
mais cette fois, c’est correct, c’est-à-dire que [batch_size, 14, 14, 64]
devient [batch_size, 7, 7, 64]
(le nombre de canaux est identique).
Oui, utilisez un pool maximum 2x2 avec strides = 2x2 réduira les données de moitié et la profondeur de sortie ne sera pas modifiée. Ceci est mon code de test de votre donnée, la forme de sortie est (14, 14, 32)
, peut-être que quelque chose ne va pas?
#!/usr/bin/env python
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('./MNIST_data/', one_hot=True)
conv1 = tf.placeholder(tf.float32, [None,28,28,32])
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2,2], strides=2)
print pool1.get_shape()
la sortie est:
Extracting ./MNIST_data/train-images-idx3-ubyte.gz
Extracting ./MNIST_data/train-labels-idx1-ubyte.gz
Extracting ./MNIST_data/t10k-images-idx3-ubyte.gz
Extracting ./MNIST_data/t10k-labels-idx1-ubyte.gz
(?, 14, 14, 32)
Nikola, ça a été corrigé comme tu le pensais.
En apprenant le concept de convolution et de mise en commun, je tombe sur ce fil. Merci pour votre question, qui me mène à la documentation informative.