J'ai le CNN suivant:
- Je commence par une image d'entrée de taille 5x5
- Ensuite, j'applique la convolution en utilisant un noyau 2x2 et stride = 1, ce qui produit une carte de caractéristiques de taille 4x4.
- Ensuite, j'applique un pool max 2x2 avec stride = 2, ce qui réduit la carte des entités à la taille 2x2.
- Ensuite, j'applique le sigmoïde logistique.
- Ensuite, une couche entièrement connectée avec 2 neurones.
- Et une couche de sortie.
Par souci de simplicité, supposons que j'ai déjà terminé la passe avant et calculé δH1 = 0,25 et δH2 = -0,15
Donc, après la passe avant complète et la passe arrière partiellement terminée, mon réseau ressemble à ceci:
Ensuite, je calcule les deltas pour la couche non linéaire (sigmoïde logistique):
Ensuite, je propage les deltas à la couche 4x4 et définit toutes les valeurs qui ont été filtrées par max-pooling à 0 et la carte de dégradé ressemble à ceci:
Comment puis-je mettre à jour les poids du noyau à partir de là? Et si mon réseau avait une autre couche convolutionnelle avant 5x5, quelles valeurs devrais-je utiliser pour mettre à jour les poids du noyau? Et dans l'ensemble, mon calcul est-il correct?
machine-learning
convnet
backpropagation
cnn
kernel
koryakinp
la source
la source
Réponses:
Une convolution utilise un principe de partage du poids qui compliquera considérablement les mathématiques, mais essayons de passer au travers des mauvaises herbes. Je tire l'essentiel de mon explication de cette source .
Passe avant
Comme vous l'avez observé, la passe avant de la couche convolutionnelle peut être exprimée comme
où dans notre cask1 et k2 est la taille du noyau, dans notre cas k1=k2=2 . Donc, cela dit pour une sortie x0,0=0.25 comme vous l'avez trouvé. m et n parcourent les dimensions du noyau.
Rétropropagation
En supposant que vous utilisez l'erreur quadratique moyenne (MSE) définie comme
nous voulons déterminer
Cela itère sur tout l'espace de sortie, détermine l'erreur que la sortie contribue, puis détermine le facteur de contribution du poids du noyau par rapport à cette sortie.
Appelons la contribution à l'erreur du delta de l'espace de sortie pour plus de simplicité et pour garder une trace de l'erreur rétrograde,
La contribution des poids
La convolution est définie comme
Donc,
Puis revenons à notre terme d'erreur
Descente de gradient stochastique
Calculons certains d'entre eux
Maintenant, vous pouvez mettre cela dans l'équation SGD à la place de∂E∂w .
Veuillez me faire savoir s'il y a des erreurs dans la dérivation.
Mise à jour: code corrigé
la source
gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')