Comment gérer des images de grandes tailles dans CNN?


15

Supposons qu'il y ait 10K images de tailles 2400 x 2400 à utiliser dans CNN. Selon moi, les ordinateurs conventionnels que les gens utilisent seront utiles. Maintenant, la question est de savoir comment gérer de si grandes tailles d'image où il n'y a pas de privilèges de sous-échantillonnage.

Voici la configuration requise: -

Ubuntu 16.04 64 bits RAM 16 Go GPU 8 Go HDD 500 Go

1) Existe-t-il des techniques pour manipuler des images aussi grandes qui doivent être entraînées?
2) Quelle taille de lot est raisonnable à utiliser?
3) Y a-t-il des précautions à prendre ou une augmentation et une diminution des ressources matérielles que je peux faire?

Réponses:


14

Maintenant, la question est de savoir comment gérer de si grandes tailles d'image où il n'y a pas de privilèges de sous-échantillonnage

Je suppose que par sous-échantillonnage, vous entendez une réduction de l'entrée avant de la passer dans CNN. La couche convolutionnelle permet de sous-échantillonner l'image au sein d'un réseau, en choisissant une grande foulée, ce qui va économiser des ressources pour les couches suivantes. En fait, c'est ce qu'il doit faire, sinon votre modèle ne rentrera pas dans le GPU.

1) Existe-t-il des techniques pour manipuler des images aussi grandes qui doivent être entraînées?

Les recherches les plus courantes mettent à l'échelle les images à une taille raisonnable. Mais si ce n'est pas une option pour vous, vous devrez restreindre votre CNN. En plus de sous-échantillonner dans les premières couches, je vous recommande de vous débarrasser de la couche FC (qui prend normalement la plupart des paramètres) au profit de la couche convolutionnelle . Vous devrez également diffuser vos données à chaque époque, car elles ne rentreront pas dans votre GPU.

Notez que rien de tout cela n'empêchera une lourde charge de calcul dans les premières couches, exactement parce que l'entrée est si grande: la convolution est une opération coûteuse et les premières couches en effectueront beaucoup à chaque passage avant et arrière. Bref, la formation sera lente.

2) Quelle taille de lot est raisonnable à utiliser?

Voici un autre problème. Une seule image prend 2400x2400x3x4(3 canaux et 4 octets par pixel) qui est ~ 70 Mo, vous pouvez donc difficilement vous permettre même une taille de lot 10. Plus réaliste serait 5. 5. Notez que la plupart de la mémoire sera prise par les paramètres CNN. Je pense que dans ce cas, il est logique de réduire la taille en utilisant des valeurs 16 bits plutôt que 32 bits - de cette façon, vous pourrez doubler les lots.

3) Y a-t-il des précautions à prendre ou une augmentation et une diminution des ressources matérielles que je peux faire?

Votre goulot d'étranglement est la mémoire GPU. Si vous pouvez vous permettre un autre GPU, procurez-vous-le et divisez le réseau entre eux. Tout le reste est insignifiant par rapport à la mémoire GPU.


1
Je vous remercie. J'ai déjà suivi quelques-unes des suggestions que vous avez fournies dans cette réponse. Bonne réponse.
WaterRocket8236

5

Habituellement, pour les images, l'ensemble de fonctionnalités correspond aux valeurs de densité de pixels et, dans ce cas, il en résulte un ensemble de fonctionnalités assez important; il est également déconseillé de sous-échantillonner les images, car vous risquez de perdre (ou de perdre) des données importantes.

[1] Mais il existe certaines techniques qui peuvent vous aider à réduire la taille du jeu de fonctionnalités, des approches comme PCA (Principle Component Analysis) vous aident à sélectionner un sous-ensemble de fonctionnalités important.

Pour des informations détaillées, voir le lien http://spark.apache.org/docs/latest/ml-features.html#pca .

[2] Autre que cela pour réduire les dépenses de calcul lors de la formation de votre réseau neuronal, vous pouvez utiliser la descente de gradient stochastique, plutôt que l'utilisation conventionnelle de l'approche de descente de gradient, ce qui réduirait la taille de l'ensemble de données requis pour la formation à chaque itération. Ainsi, la taille de votre ensemble de données à utiliser en une seule itération réduirait, donc réduirait le temps nécessaire pour former le réseau.

La taille exacte du lot à utiliser dépend de votre distribution pour le jeu de données de formation et le jeu de données de test, une utilisation plus générale est 70-30. Où vous pouvez également utiliser l'approche stochastique mentionnée ci-dessus pour réduire le temps requis.

Détail pour la descente de gradient stochastique http://scikit-learn.org/stable/modules/sgd.html

[3] Le matériel semble approprié pour la mise à niveau serait nécessaire, mais si nécessaire, regardez des solutions cloud comme AWS où vous pouvez obtenir un abonnement gratuit à un compte jusqu'à une limite d'utilisation.


Merci pour la réponse. Mettez à jour la réponse si vous obtenez plus d'informations.
WaterRocket8236

Merci pour ce lien sur la descente de gradient stochastique, et bienvenue dans l'IA!
DukeZhou

2

Ces données volumineuses ne peuvent pas être chargées dans votre mémoire. Permet de diviser ce que vous pouvez faire en deux:

  1. Redimensionnez toutes vos images à des dimensions plus petites. Vous pouvez les redimensionner à 112x112 pixels. Dans votre cas, parce que vous avez une image carrée, il n'y aura pas besoin de recadrage. Vous ne pourrez toujours pas charger toutes ces images dans votre RAM à un objectif.

  2. La meilleure option consiste à utiliser une fonction de générateur qui alimentera les données par lots. Veuillez vous référer à l'utilisation de fit_generator tel qu'utilisé dans Keras. Si les paramètres de votre modèle deviennent trop volumineux pour tenir dans la mémoire du GPU, envisagez d'utiliser la normalisation par lots ou d'utiliser un modèle résiduel pour réduire votre nombre de paramètres.


3
Pourquoi choisiriez-vous une taille de 112x112 pixels? Ce n'est pas une puissance de 2 et pas un diviseur de 2400.
Andi R

@AndiR. Voici la chose. En ce qui concerne la dimension d'entrée, on est libre de choisir quelle taille. En effet, s'il existe des incompatibilités de dimension dans le réseau, cela peut facilement être résolu en utilisant un remplissage nul. Ainsi, il n'y a pas de méthodologie fixe pour la taille de l'entrée. Ce qu'il faut faire attention, c'est de s'assurer qu'un échantillonnage trop bas n'affecte pas la qualité d'entrée. Veuillez consulter ce document qui utilise la dimension 112x112. ( cv-foundation.org/openaccess/content_iccv_2015/papers/… )
rocksyne
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.