Compréhension et mise en œuvre des architectures de ResNet et ResNeXt pour une classification d’images de pointe: de Microsoft à Facebook [Partie 1]

Dans ce billet de blog en deux parties, nous explorerons les réseaux résiduels. Plus précisément, nous discuterons de trois articles publiés par Microsoft Research et Facebook AI Research, les réseaux de classification d’images de pointe – ResNet et ResNeXt Architectures et essayerons de les implémenter sur Pytorch.

À propos de la série:

Ceci est la première partie d’une série en deux parties expliquant les articles de blog explorant les réseaux résiduels.

Nous passerons en revue les trois articles suivants présentant et améliorant le réseau résiduel:

ResNet a-t-il réussi?

Quel problème ResNet résout-il?

Lorsque des réseaux plus profonds commencent à converger, un problème de dégradation a été exposé: avec l’augmentation de la profondeur du réseau, la précision est saturée puis se dégrade rapidement.

Voir la dégradation en action:

Prenons un réseau peu profond et son homologue plus profond en y ajoutant plus de couches.

Pire scénario: Les premières couches du modèle plus profond peuvent être remplacées par un réseau peu profond et les couches restantes peuvent simplement agir comme une fonction d’identité (entrée égale à la sortie).

<g scénario : dans le réseau plus profond, les couches supplémentaires se rapprochent mieux de la cartographie que sa contrepartie moins profonde et réduisent l’erreur d’un marge significative.

Expérience: Dans le pire des cas, le réseau peu profond et sa variante plus profonde devraient donner la même précision. Dans le cas du scénario gratifiant, le modèle plus profond devrait donner une meilleure précision que sa contrepartie moins profonde. Mais les expériences avec nos solveurs actuels révèlent que les modèles plus profonds ne fonctionnent pas bien. Donc, utiliser des réseaux plus profonds est dégradant les performances du modèle. Cet article tente de résoudre ce problème à l’aide du cadre d’apprentissage Deep Residual.

Comment résoudre?

Au lieu d’apprendre un mappage direct de x – & gt; y avec une fonction H (x) (quelques couches non linéaires empilées). Définissons la fonction résiduelle en utilisant F (x) = H (x) – x, qui peut être recadrée en H (x) = F (x) + x, où F (x) et x représentent les couches non linéaires empilées et la fonction d’identité (entrée = sortie) respectivement.

L’hypothèse de l’auteur est qu’il est facile d’optimiser la fonction de cartographie résiduelle F (x) que d’optimiser l’original , mappage non référencé H (x).

Intuition derrière les blocs résiduels:

Si le mappage d’identité est optimal, nous pouvons facilement pousser les résidus à zéro (F (x) = 0) que d’ajuster un mappage d’identité (x, entrée = sortie) par une pile de couches non linéaires. En langage simple, il est très facile de trouver une solution comme F (x) = 0 plutôt que F (x) = x en utilisant une pile de couches cnn non linéaires comme fonction (Pensez-y). Donc, cette fonction F (x) est ce que les auteurs ont appelé la fonction résiduelle.

Les auteurs ont fait plusieurs tests pour tester leur hypothèse. Regardons chacun d’eux maintenant.

Scénarios de test:

Prenez un réseau simple (réseau VGG type 18 couches) (Network-1) et une variante plus profonde de celui-ci (34 couches, Network-2) et ajoutez des couches résiduelles au réseau-2 (34 couches avec des connexions résiduelles, Réseau-3).

Conception du réseau:

Il existe deux types de connexions résiduelles:


2. Lorsque les dimensions changent, A) Le raccourci effectue toujours le mappage d’identité, avec des entrées nulles supplémentaires complétées avec la dimension augmentée. B) Le raccourci de projection est utilisé pour faire correspondre la dimension (faite par 1 * 1 conv) en utilisant la formule suivante

Le premier cas n’ajoute aucun paramètre supplémentaire, le second ajoute sous la forme de W_ {s}

Même si le réseau à 18 couches n’est que le sous-espace du réseau à 34 couches, il fonctionne toujours mieux. ResNet surpasse d’une marge significative au cas où le réseau serait plus profond

Études plus approfondies

Les réseaux suivants sont étudiés

Chaque bloc ResNet a une profondeur de 2 couches (utilisé dans les petits réseaux comme ResNet 18, 34) ou 3 couches de profondeur (ResNet 50, 101, 152).

La mise en œuvre de Pytorch peut être vue ici:

La classe Bottleneck implémente un bloc à 3 couches et Basicblock implémente un bloc à 2 couches. Il a également des implémentations de toutes les architectures ResNet avec des poids pré-entraînés formés sur ImageNet.

Implémentation avec Pytorch

J’ai une implémentation détaillée de presque tous les réseaux de classification d’images ici. Une lecture rapide vous permettra de mettre en œuvre et de former ResNet en une fraction de secondes. Pytorch a déjà sa propre implémentation, je prends simplement en compte différents cas lors de l’apprentissage par transfert.

J’ai écrit un article de blog détaillé sur l’apprentissage par transfert. Bien que le code soit implémenté dans keras ici, les idées sont plus abstraites et pourraient vous être utiles en prototypage.

<↓ Veuillez partager ceci avec tous vos amis Medium et appuyez sur le bouton d’applaudissement ci-dessous pour le diffuser encore plus. Ajoutez également d’autres trucs ou astuces que j’aurais pu manquer ci-dessous dans les commentaires!