Les opérations de regroupement et de convolution font glisser une «fenêtre» sur le tenseur d'entrée. A tf.nn.conv2d
titre d'exemple: Si le tenseur d'entrée a 4 dimensions [batch, height, width, channels]
:, alors la convolution opère sur une fenêtre 2D sur les height, width
dimensions.
strides
détermine le décalage de la fenêtre dans chacune des dimensions. L'utilisation typique définit le premier (le lot) et le dernier (la profondeur) foulée à 1.
Prenons un exemple très concret: exécution d'une convolution 2D sur une image d'entrée 32x32 en niveaux de gris. Je dis niveaux de gris car l'image d'entrée a alors une profondeur = 1, ce qui permet de rester simple. Laissez cette image ressembler à ceci:
00 01 02 03 04 ...
10 11 12 13 14 ...
20 21 22 23 24 ...
30 31 32 33 34 ...
...
Lançons une fenêtre de convolution 2x2 sur un seul exemple (taille du lot = 1). Nous donnerons à la convolution une profondeur de canal de sortie de 8.
L'entrée de la convolution a shape=[1, 32, 32, 1]
.
Si vous spécifiez strides=[1,1,1,1]
avec padding=SAME
, la sortie du filtre sera [1, 32, 32, 8].
Le filtre créera d'abord une sortie pour:
F(00 01
10 11)
Et puis pour:
F(01 02
11 12)
etc. Ensuite, il passera à la deuxième ligne, calculant:
F(10, 11
20, 21)
puis
F(11, 12
21, 22)
Si vous spécifiez une foulée de [1, 2, 2, 1], les fenêtres ne se chevauchent pas. Il calculera:
F(00, 01
10, 11)
puis
F(02, 03
12, 13)
La foulée fonctionne de la même manière pour les opérateurs de mise en commun.
Question 2: Pourquoi les foulées [1, x, y, 1] pour les réseaux
Le premier est le lot: vous ne voulez généralement pas ignorer les exemples dans votre lot, ou vous n'auriez pas dû les inclure en premier lieu. :)
Le dernier 1 est la profondeur de la convolution: vous ne voulez généralement pas sauter les entrées, pour la même raison.
L'opérateur conv2d est plus général, vous pouvez donc créer des convolutions qui font glisser la fenêtre le long d'autres dimensions, mais ce n'est pas une utilisation typique dans les convnets. L'utilisation typique est de les utiliser dans l'espace.
Pourquoi remodeler à -1 -1 est un espace réservé qui dit "ajustez si nécessaire pour correspondre à la taille nécessaire pour le tenseur complet." C'est un moyen de rendre le code indépendant de la taille du lot d'entrée, afin que vous puissiez modifier votre pipeline et ne pas avoir à ajuster la taille du lot partout dans le code.