web-dev-qa-db-fra.com

Fonction d'activation après mise en commun d'une couche ou d'une couche convolutionnelle?

La théorie de ces liens montre que l'ordre du réseau convolutionnel est: Convolutional Layer - Non-linear Activation - Pooling Layer.

  1. Réseaux de neurones et apprentissage profond (équation (125)
  2. Livre d'apprentissage en profondeur (page 304, 1er paragraphe)
  3. Lenet (l'équation)
  4. La source dans ce titre

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

  1. network3.py
  2. Le code source, classe LeNetConvPoolLayer

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?

22
malioboro

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.

30
eickenberg

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):

enter image description here

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.

enter image description here

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.

13
Salvador Dali