Comment former les CNN sur ImageNet
Un guide pratique sur l’utilisation de grands ensembles de données d’images pour l’apprentissage en profondeur
Je vais voir comment obtenir le jeu de données ImageNet et former votre réseau neuronal convolutionnel dessus. J’ai ajouté quelques conseils et enseignements spécifiques à la formation des CNN avec PyTorch.
Si vous ne l’avez pas déjà fait, je vous recommande d’abord d’essayer d’exécuter votre modèle sur un exemple d’image. Lorsque vous commencez, c’est vraiment tentant de passer à un grand ensemble de données comme ImageNet pour former votre prochain modèle de pointe. Cependant, j’ai trouvé plus efficace de commencez petit et augmentez lentement votre expérience. Tout d’abord, essayez une image pour vous assurer que votre code fonctionne. Ensuite, essayez un ensemble de données plus petit comme CIFAR-10. Enfin, essayez-le sur ImageNet. Faites des vérifications de santé mentale en cours de route et répétez-les pour chaque «mise à l’échelle».
Soyez également conscient des différences dans votre modèle pour les tailles d’image plus petites d’un ensemble de données par rapport à l’autre. Par exemple, CIFAR-10 n’a que des images de taille 32×32 qui sont plus petites que les tailles d’image variables d’ImageNet. La résolution moyenne d’une image ImageNet est de 469 x 387. Ils sont généralement rognés à 256×256 ou 224×224 dans votre étape de prétraitement d’image.
Dans PyTorch, nous ne définissons pas une hauteur ou une largeur d’entrée comme nous le ferions dans TensorFlow, donc c’est votre travail de assurez-vous que les tailles des canaux de sortie en cours de route sont appropriées dans votre réseau pour une taille d’entrée donnée. Mon conseil est de se méfier de la façon dont la réduction de dimensionnalité se produit des filtres peu profonds aux filtres plus profonds dans votre réseau, en particulier lorsque vous modifiez votre ensemble de données.
En général, lorsque vous augmentez la résolution d’entrée dans un nouvel ensemble de données, le champ récepteur précoce doit également augmenter en taille (en augmentant la taille du noyau ou en ajoutant des couches de regroupement).
C’est pour deux raisons:
- L’augmentation de la taille du champ récepteur précoce est une forme de régularisation pour empêcher votre CNN d’apprendre des détails ultra spécifiques d’images qui sont moins généralisables.
- Lorsque vous diminuez la résolution d’entrée, cela permettra d’éviter un rétrécissement prématuré de la taille du canal. L’application d’une convolution à un tenseur de taille 256x1x1 est en quelque sorte inutile.
Ces deux erreurs échouent silencieusement. Ces erreurs n’entraînent qu’un 8% de diminution dans le top 1 de la précision lorsqu’un ResNet en forme d’ImageNet est incorrectement appliqué au CIFAR-10 Pour corriger cette erreur, lors du passage de CIFAR-10 à ImageNet, les auteurs ResNet ajoutent une première couche max-pool et utilisent une taille de noyau initiale plus grande (5×5 → 7×7).
Je recommanderais vraiment de lire cet article de blog par Andrej Karpathy pour une intuition plus profonde de cet art. Je recommanderais également ce post par Tim Rocktaschel sur des conseils pour des projets de ML à court terme.
Il est préférable de le faire dans un environnement cloud. À moins que vous n’ayez accès à un puissant GPU et à un grand SSD, je ne recommanderais pas de le faire localement.
Avant de suivre une formation, faites tourner une instance Google Colab ou une instance AWS SageMaker pour utiliser un bloc-notes Jupyter pour expérimenter avec votre modèle et visualiser les données transmises. Ensuite, lorsque vous souhaitez former votre modèle, je vous recommande d’utiliser un script et faire tourner une instance EC2 avec l’AWS Deep Learning AMI. Attachez une instance EBS à votre EC2 avec suffisamment d’espace de stockage pour télécharger et décompresser ImageNet. Pour 2012 ImageNet, le téléchargement compressé est de 150 Go. Mais vous aurez besoin d’environ 400 Go car vous avez besoin de suffisamment d’espace pour décompresser les fichiers, puis supprimez le .tar par la suite. L’utilisation d’une instance EBS signifie également que vous pouvez mettre à niveau votre EC2 sans avoir à télécharger à nouveau les données.
Maintenant, pour télécharger réellement ImageNet, le les instructions sont de s’inscrire en tant que chercheur auprès de votre institution de recherche ici.
Je ne pense pas que Stanford le maintienne depuis un certain temps, car vous ne recevrez jamais l’invitation par e-mail. Donc, ce que j’ai trouvé est efficace, c’est de télécharger ImageNet depuis Torrents académiques.
Recherchez ImageNet, obtenez les liens magnétiques souhaités et utilisez la CLI pour télécharger des torrents avec Transmission. Assurez-vous que votre instance dispose d’un accès Internet!
sudo yum install transmission transmission-daemon transmission-cli
Ensuite, configurez votre répertoire de téléchargement
transmission-daemon --download-dir "your-download-directory-path"
Et ajoutez votre lien magnétique
transmission-remote -a "magnet-link"
Trouvez d’autres commandes importantes ici.
Une fois que vous avez téléchargé les fichiers compressés, nous aimerions les extraire et les placer dans les dossiers appropriés afin qu’ils correspondent à ce que la classe PyTorch ImageFolder attend, comme décrit dans la documentation ici.
Placez ILSVRC2012_img_train.tar et ILSVRC2012_img_val.tar dans le même dossier que le script suivant pour obtenir les dossiers souhaités. Modifiez si nécessaire pour votre torrent spécifique.
Je vous recommande également de jeter les deux fichiers .tar dans un compartiment dans S3 afin que vous puissiez les récupérer la prochaine fois. Ne jetez pas les fichiers non compressés car vous payez pour des demandes individuelles par objet sur S3.
Je vous recommande de configurer votre utilisation du DataLoader et ImageFolder de PyTorch dans un module intitulé avec l’ensemble de données. J’ai trouvé qu’il était facile de conserver des augmentations spécifiques à un ensemble de données dans différents fichiers. Voici un exemple imagenet.py
pour une utilisation avec ResNet. Configurez votre taille de lot par défaut, votre transformation de normalisation et le recadrage spécifique à cet ensemble de données. Peut-être dans un autre fichier comme cifar10.py vous pouvez avoir le chargeur de jeu de données avec des paramètres spécifiques à cifar-10 (avec une taille de lot, une normalisation et un recadrage différents).
Je ne recommanderais pas de former un modèle sur un ensemble de données massif comme ImageNet ou Sports1M dans un ordinateur portable Jupyter. Vous pouvez avoir des délais d’attente et votre instance se déconnectera de stdout, ce qui vous empêchera de voir les progrès de votre modèle. Une option plus sûre consiste à ssh et à s’entraîner avec un script dans un écran.
Je recommanderais également d’utiliser neptune.ai pour suivre les progrès dans un tableau de bord visuel soigné. Certaines personnes utilisent TensorBoard ou TensorBoardX pour pytorch, mais je n’ai pas encore essayé. j’ai aimé neptune.ai car il conserve mes résultats même après la fermeture des instances et me permet de comparer facilement les expériences.
Utilisez maintenant vos chargeurs de données avec votre modèle, votre choix d’optimiseur et votre choix de perte pour vous entraîner sur ImageNet. Cela ressemblera à une variante du pseudocode suivant:
# one epoch
for i, (images, target) in enumerate(train_loader): # compute output
output = model(images)
loss = criterion(output, target) # measure accuracy and record loss
acc1, acc5 = accuracy(output, target, topk=(1, 5))
losses.update(loss.item(), images.size(0))
top1.update(acc1[0], images.size(0))
top5.update(acc5[0], images.size(0)) # compute gradient and do step
optimizer.zero_grad()
loss.backward()
optimizer.step()
C’est uniquement pour la formation. Utilisez-le en boucle avec une fonction de validation pour alterner formation et notation sur l’ensemble de validation à chaque époque. Pour plus d’exemples sur la façon de procéder, consultez les exemples officiels de PyTorch ici.
Se souvenir de jetez un œil aux données avant qu’elles n’entrent dans votre réseau au moins une fois. Cela signifie réellement le visualiser. Voici un exemple de contrôle d’intégrité ci-dessous à utiliser pour vous assurer que tout se passe bien pendant le prétraitement.
Pour être complet, j’ai ajouté du code au-dessus du contrôle de santé mentale pour générer la transformation dénormalisante (pour afficher l’image réelle sans les effets de la normalisation).
Ayez maintenant une formation amusante et gardez votre santé mentale avec des contrôles de santé mentale! 😄