Fonction de perte pour la segmentation sémantique


10

S'excuse pour l'utilisation abusive des termes techniques. Je travaille sur un projet de segmentation sémantique via des réseaux de neurones convolutifs (CNN); essayer d'implémenter une architecture de type Encodeur-Décodeur, donc la sortie est de la même taille que l'entrée.

Comment concevez-vous les étiquettes? Quelle fonction de perte doit-on appliquer? Surtout dans la situation de fort déséquilibre des classes (mais le rapport entre les classes est variable d'une image à l'autre).

Le problème concerne deux classes (objets d'intérêt et arrière-plan). J'utilise Keras avec le backend tensorflow.

Jusqu'à présent, je vais concevoir des sorties attendues aux mêmes dimensions que les images d'entrée, en appliquant un étiquetage pixel par pixel. La couche finale du modèle a soit une activation softmax (pour 2 classes), soit une activation sigmoïde (pour exprimer la probabilité que les pixels appartiennent à la classe des objets). J'ai du mal à concevoir une fonction objectif adaptée à une telle tâche, de type:

function(y_pred,y_true),

en accord avec Keras .

S'il vous plaît, essayez d'être précis avec les dimensions des tenseurs impliqués (entrée / sortie du modèle). Toutes les pensées et suggestions sont très appréciées. Merci !


Lisez ce document arxiv.org/pdf/1511.00561.pdf "Nous utilisons la perte d'entropie croisée comme fonction objective pour la formation du réseau."
Miss Palmer

Réponses:


6

L'entropie croisée est définitivement la voie à suivre. Je ne connais pas Keras mais TF a ceci: https://www.tensorflow.org/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits

Voici un article mettant directement en œuvre ceci: Réseaux entièrement convolutionnels pour la segmentation sémantique par Shelhamer et al.

Le papier U-Net est également une implémentation très réussie de l'idée, utilisant des connexions de saut pour éviter la perte de résolution spatiale. Vous pouvez trouver de nombreuses implémentations de cela sur le net.

D'après mon expérience personnelle, vous voudrez peut-être commencer par un simple réseau encodeur-décodeur, mais n'utilisez pas de pas (ou pas = 1), sinon vous perdez beaucoup de résolution car le suréchantillonnage n'est pas parfait. Allez avec de petites tailles de noyau. Je ne connais pas votre application spécifique, mais même un réseau de couches cachées 2-3 donnera de très bons résultats. Utilisez 32 à 64 canaux sur chaque couche. Commencez simplement, 2 couches cachées, 32 canaux chacune, 3x3 noyaux, stride = 1 et expérimentez les paramètres de manière isolée pour voir leur effet. Gardez les dimensions toujours égales à la dimension d'entrée pour les débutants afin d'éviter une perte de résolution. Ensuite, vous pouvez activer les avancées et suréchantillonner et mettre en œuvre des idées comme U-Net. U-Net fonctionne extrêmement bien pour la segmentation d'images médicales.

αβ


Je ne suis pas un expert dans ce domaine, mais les cours ne devraient-ils pas être exclusifs dans ce cadre? Si oui, la perte softmax ne serait-elle pas la meilleure option? tensorflow.org/api_docs/python/tf/nn/…
Harald Thomson

1
@HaraldThomson, la segmentation est un problème binaire. Beaucoup de gens utilisent softmax pour des problèmes binaires, mais c'est complètement inutile et exagéré. Au lieu d'avoir deux nœuds de sortie, ayez un nœud de sortie qui représente P (y = 1), puis utilisez l'entropie croisée.
Ricardo Cruz

2

Utilisez la perte de dés pondérée et la perte d'entropie croisée pondérée. La perte de dés est très bonne pour la segmentation. Les poids avec lesquels vous pouvez commencer devraient être les fréquences de classe inversées, c'est-à-dire prendre un échantillon de 50 à 100, trouver le nombre moyen de pixels appartenant à chaque classe et faire en sorte que ces classes pèsent 1 / moyenne. Vous devrez peut-être implémenter les dés vous-même, mais c'est simple. De plus, vous pouvez regarder la perte de dés inverse et la perte focale


-1

Permettez-moi d'être plus précis au début, puis plus général. Je m'excuse si je vous comprends mal.

Je pense que vous parlez d'avoir besoin d'un réseau de neurones à encodeur automatique parce que vous avez mentionné l'encodage et le décodage, et vous avez mentionné la taille d'entrée comme la taille de sortie. Si c'est le cas, votre fonction de perte est basée sur la reproduction du vecteur d'entrée, mais également sur la compression des données dans un vecteur plus court dans la couche cachée du milieu. Les choix consisteraient à obtenir l'erreur quadratique moyenne minimale (pour la régression) ou le rapport de perte de log ou de classification erronée (pour la classification). Cependant, les CNN ne sont pas quelque chose que j'ai vu utilisé dans un autoencodeur, mais je pense qu'il serait à la fois possible et utile de le faire dans les cas où l'invariance translationnelle est importante, comme la détection des bords et des objets dans les images.

Plus généralement, vous semblez construire un modèle d'apprentissage automatique très complexe puisque vous avez mentionné les CNN. Les CNN et autres modèles d'apprentissage en profondeur font partie des modèles d'apprentissage automatique les plus complexes qui existent.

Cependant, le choix des dimensions, des étiquettes et des fonctions de perte ressemble davantage à un apprentissage automatique élémentaire. Je pense que vous pourriez être au-dessus de votre tête avec l'apprentissage en profondeur. Avez-vous d'abord suivi un cours sur le vieil apprentissage automatique?


Est-ce même nécessaire? Par exemple, voir Méthode Pixon .
Carl

c'est une approche valable: arxiv.org/pdf/1511.00561.pdf
Miss Palmer

"Les CNN et autres modèles d'apprentissage en profondeur font partie des modèles d'apprentissage automatique les plus complexes qui existent.". J'ai tendance à être en désaccord. Le modèle en lui-même peut être complexe mais ils sont en fait incroyablement simples à utiliser avec très peu de compréhension théorique. C'est la raison de tout le battage médiatique autour de DL, peu de théorie, des modèles faciles à écrire et des précisions très élevées ...
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.