La théorie de ces liens montre que l'ordre du réseau convolutionnel est: Convolutional Layer - Non-linear Activation - Pooling Layer
.
Mais, dans la dernière implémentation de ces sites, il a déclaré que l'ordre était: Convolutional Layer - Pooling Layer - Non-linear Activation
J'ai aussi essayé d'explorer une syntaxe d'opération Conv2D, mais il n'y a pas de fonction d'activation, c'est seulement une convolution avec un noyau retourné. Quelqu'un peut-il m'aider à expliquer pourquoi cela se produit-il?
Eh bien, les non-linéarités à mise en commun maximale et à augmentation monotone font la navette. Cela signifie que MaxPool (Relu (x)) = Relu (MaxPool (x)) pour n'importe quelle entrée. Le résultat est donc le même dans ce cas. Il est donc techniquement préférable de commencer par sous-échantillonner via la mise en commun maximale, puis d'appliquer la non-linéarité (si elle est coûteuse, comme la sigmoïde). Dans la pratique, cela se fait souvent dans l'autre sens - cela ne semble pas beaucoup changer dans les performances.
Quant à conv2D, il fait pas retourner le noyau. Il implémente exactement la définition de convolution. Il s'agit d'une opération linéaire, vous devez donc ajouter vous-même la non-linéarité à l'étape suivante, par ex. theano.tensor.nnet.relu
.
Dans de nombreux journaux, les gens utilisent conv -> pooling -> non-linearity
. Cela ne signifie pas que vous ne pouvez pas utiliser une autre commande et obtenir des résultats raisonnables. En cas de couche de regroupement maximal et de ReLU, l'ordre n'a pas d'importance (les deux calculent la même chose):
Vous pouvez prouver que c'est le cas en vous rappelant que ReLU est une opération élément par élément et une fonction non décroissante.
La même chose se produit pour presque toutes les fonctions d'activation (la plupart d'entre elles ne diminuent pas). Mais ne fonctionne pas pour une couche de mise en commun générale (mise en commun moyenne).
Néanmoins, les deux commandes produisent le même résultat, Activation(MaxPool(x))
le fait beaucoup plus rapidement en effectuant moins d'opérations. Pour une couche de mise en commun de taille k
, elle utilise k^2
Fois moins d'appels à la fonction d'activation.
Malheureusement, cette optimisation est négligeable pour CNN, car la majorité du temps est utilisée dans les couches convolutives.