Vous n'avez pas dit de quelle architecture vous parlez. Puisque tu as dit que tu voulais classifier des images, je suppose qu'il s'agit d'un réseau partiellement convolutif, partiellement entièrement connecté comme AlexNet, GoogLeNet, etc. En général, la réponse à votre question dépend du type de réseau avec lequel vous travaillez.
Si, par exemple, votre réseau ne contient que des unités convolutionnelles - c'est-à-dire qu'il ne contient pas de couches entièrement connectées - il peut être invariant par rapport à la taille de l'image d'entrée. Un tel réseau pourrait traitent les images d'entrée et renvoient à leur tour une autre image ("convolutional all the way") ; vous devrez vous assurer que la sortie correspond à ce que vous attendez, puisque vous devez déterminer la perte d'une manière ou d'une autre, bien sûr.
Mais si vous utilisez des unités entièrement connectées, vous risquez d'avoir des problèmes : Dans ce cas, le réseau doit travailler avec un nombre fixe de poids appris, de sorte que des entrées variables nécessiteraient un nombre variable de poids, ce qui n'est pas possible.
Si tel est votre problème, voici ce que vous pouvez faire :
- Il n'est pas nécessaire d'écraser les images. Un réseau pourrait apprendre à donner un sens au contenu de toute façon ; l'échelle et la perspective ont-elles un sens pour le contenu ?
- Recadrez les images à une taille spécifique. Si vous craignez de perdre des données, effectuez plusieurs recadrages et utilisez-les pour augmenter vos données d'entrée, de sorte que l'image originale soit divisée en
N
différentes images de taille correcte.
- Tamponnez les images avec une couleur unie pour obtenir une taille carrée, puis redimensionnez-les.
- Faites une combinaison de tout cela.
L'option de remplissage pourrait introduire une source d'erreur supplémentaire dans la prédiction du réseau, car le réseau pourrait (lire : probablement) être biaisé par les images qui contiennent une telle bordure rembourrée. Si vous avez besoin d'idées, jetez un coup d'œil à l'application Images de la documentation TensorFlow, il y a des éléments comme resize_image_with_crop_or_pad
qui enlèvent le plus gros du travail.
Quant au fait de ne pas se soucier de l'écrasement, voici une partie du pipeline de prétraitement du célèbre réseau Inception :
# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.
# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
distorted_image,
lambda x, method: tf.image.resize_images(x, [height, width], method=method),
num_cases=num_resize_cases)
Ils en sont totalement conscients et le font quand même.
Selon la distance que vous voulez ou devez parcourir, il existe en fait un papier aquí appelé Mise en commun des pyramides spatiales dans les réseaux à convolution profonde pour la reconnaissance visuelle qui gère des entrées de tailles arbitraires en les traitant d'une manière très spéciale.
2 votes
Veuillez indiquer ce que vous avez essayé jusqu'à présent et ce qui semble ne pas fonctionner pour vous.
16 votes
Et bam, voilà le code d'Inception v4. Je ne suis pas d'accord avec ce commentaire sur le prêt-à-porter. Un peu plus d'informations seraient bienvenues - comme le type de réseau dont nous parlons - mais les votes négatifs ne sont pas du tout justifiés. Ce est un vrai problème là-bas.
4 votes
La question est de savoir comment ImageNet formate ses données d'image pour qu'elles soient utiles à la formation.