Funzione di perdita per la segmentazione semantica


10

Si scusa per l'uso improprio di termini tecnici. Sto lavorando a un progetto di segmentazione semantica tramite reti neurali convoluzionali (CNN); cercando di implementare un'architettura di tipo Encoder-Decoder, quindi l'output ha le stesse dimensioni dell'input.

Come si progettano le etichette? Quale funzione di perdita si dovrebbe applicare? Soprattutto nella situazione di forte squilibrio di classe (ma il rapporto tra le classi è variabile da immagine a immagine).

Il problema riguarda due classi (oggetti di interesse e sfondo). Sto usando Keras con il backend tensorflow.

Finora, sto progettando che gli output previsti abbiano le stesse dimensioni delle immagini di input, applicando un'etichettatura pixel-saggia. Il livello finale del modello ha l'attivazione softmax (per 2 classi) o l'attivazione sigmoid (per esprimere la probabilità che i pixel appartengano alla classe degli oggetti). Ho problemi con la progettazione di una funzione oggettiva adatta per tale compito, di tipo:

function(y_pred,y_true),

in accordo con Keras .

Cerca di essere specifico con le dimensioni dei tensori coinvolti (input / output del modello). Eventuali pensieri e suggerimenti sono molto apprezzati. Grazie !


Leggi questo arxiv.org/pdf/1511.00561.pdf "Usiamo la perdita di entropia come funzione obiettivo per addestrare la rete".
Miss Palmer,

Risposte:


6

L'entropia incrociata è sicuramente la strada da percorrere. Non conosco Keras ma TF ha questo: https://www.tensorflow.org/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits

Ecco un documento che implementa direttamente questo: reti completamente convoluzionali per la segmentazione semantica di Shelhamer et al.

La carta U-Net è anche un'implementazione di grande successo dell'idea, usando le connessioni skip per evitare la perdita di risoluzione spaziale. Puoi trovare molte implementazioni di questo in rete.

Dalla mia esperienza personale, potresti voler iniziare prima con una semplice rete encoder-decoder, ma non usare strides (o strides = 1), altrimenti perdi molta risoluzione perché l'upsampling non è perfetto. Vai con kernel di piccole dimensioni. Non conosco la tua specifica applicazione, ma anche una rete a 2-3 livelli nascosti darà ottimi risultati. Usa 32-64 canali per ogni livello. Inizia semplici, 2 livelli nascosti, 32 canali ciascuno, kernel 3x3, falcata = 1 e sperimenta i parametri in modo isolato per vederne l'effetto. Mantenere le dimensioni sempre uguali alla dimensione di input per i principianti per evitare la perdita di risoluzione. Successivamente è possibile attivare passi e ricampionamento e implementare idee come U-Net. U-Net funziona estremamente bene per la segmentazione di immagini mediche.

αβ


Non sono un esperto in questo dominio, ma le classi non dovrebbero essere esclusive in questa impostazione? Se sì, la perdita di softmax non sarebbe l'opzione migliore? tensorflow.org/api_docs/python/tf/nn/…
Harald Thomson

1
@HaraldThomson, la segmentazione è un problema binario. Molte persone usano softmax per problemi binari, ma è completamente inutile e eccessivo. Invece di avere due nodi di output, disporre di un nodo di output che rappresenta P (y = 1), quindi utilizzare l'entropia incrociata.
Ricardo Cruz,

2

Usa la perdita ponderata dei dadi e la perdita ponderata dell'entropia crociata. La perdita di dadi è molto buona per la segmentazione. I pesi con cui puoi iniziare dovrebbero essere le frequenze di classe inverse, cioè prendere un campione di dire 50-100, trovare il numero medio di pixel appartenenti a ciascuna classe e fare in modo che le classi pesino 1 / media. Potrebbe essere necessario implementare i dadi da soli ma è semplice. Inoltre puoi guardare la perdita inversa di dadi e la perdita focale


-1

Vorrei essere più specifico all'inizio, e poi più generale. Mi scuso se ti fraintendo.

Penso che tu stia parlando della necessità di una rete neurale autoencoder perché hai menzionato la codifica e la decodifica e hai menzionato la dimensione di input uguale alla dimensione di output. In tal caso, la funzione di perdita si basa sulla riproduzione del vettore di input, ma anche sulla compressione dei dati in un vettore più corto nel livello nascosto centrale. La scelta sarebbe quella di ottenere l'errore quadratico medio minimo (per la regressione) o il rapporto perdita di log o classificazione errata (per la classificazione). Tuttavia, le CNN non sono qualcosa che ho visto usato in un autoencoder, ma penso che sarebbe sia possibile che utile farlo nei casi in cui l'invarianza traslazionale è importante, come il rilevamento di bordi e oggetti nelle immagini.

Più in generale, sembra che tu stia costruendo un modello di apprendimento automatico molto complesso da quando hai menzionato le CNN. Le CNN e altri modelli di apprendimento profondo sono alcuni dei modelli di apprendimento automatico più complessi esistenti.

La scelta di dimensioni, etichette e funzioni di perdita è più simile all'apprendimento automatico elementare. Penso che potresti essere sopra la testa con l'apprendimento profondo. Per prima cosa hai seguito un corso sull'apprendimento automatico semplice?


È anche necessario? Ad esempio, vedi il metodo Pixon .
Carl,

è un approccio valido: arxiv.org/pdf/1511.00561.pdf
Miss Palmer

"Le CNN e altri modelli di apprendimento profondo sono alcuni dei modelli di apprendimento automatico più complessi esistenti". Tendo a non essere d'accordo. Il modello in sé può essere complesso, ma in realtà sono incredibilmente semplici da usare con una comprensione teorica molto scarsa. Questa è la ragione dell'intera campagna pubblicitaria su DL, poca teoria, modelli facili da scrivere e accuratezze molto elevate ...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.