2015-10-13 23 views
11

Ho pensato che potremmo essere in grado di compilare una descrizione Caffeina di alcuni metodi di esecuzione della classificazione di categorie .Classificazione di categorie multiple in Caffe

Per classificazione di più categorie, intendo: I dati di input contenenti rappresentazioni di più categorie di output del modello e/o semplicemente essere classificabili in più categorie di output del modello.

E.g. Un'immagine contenente un gatto & cane produrrebbe (idealmente) ~ 1 per entrambe le categorie di predizione cane gatto & e ~ 0 per tutti gli altri.

  1. Sulla base di this paper, this stale and closed PR e this open PR, sembra caffe è perfettamente in grado di accettare le etichette. È corretto?

  2. La costruzione di tale rete richiederebbe l'uso di più neuroni (prodotto interno -> relu -> prodotto interno) e strati di softmax come in page 13 of this paper; o il softmax ip di Caffe & supporta attualmente più dimensioni di etichetta?

  3. Quando sto passando le mie etichette alla rete, che esempio potrebbe illustrare l'approccio corretto (se non entrambi) ?:

    Ad es Cat eating apple Nota: sintassi Python, ma io uso il C++ source.

    Colonna 0 - Classe in ingresso; Colonna 1 - Classe non è in ingresso

    [[1,0], # Apple 
    [0,1], # Baseball 
    [1,0], # Cat 
    [0,1]] # Dog 
    

    o

    Colonna 0 - Class è in ingresso

    [[1], # Apple 
    [0], # Baseball 
    [1], # Cat 
    [0]] # Dog 
    

Se qualcosa manca di chiarezza per favore fatemelo sapere e lo farò generare esempi pittorici delle domande che sto cercando di porre.

+1

intendi un numero fisso di etichette per immagine o un numero diverso di etichette per ciascuna immagine? cioè, ti aspetteresti di ottenere sempre, diciamo, 2 etichette, o ti aspetteresti per alcune immagini 2 etichette e per altre ancora? – Shai

+2

@Shai quest'ultimo sembra un problema davvero interessante! Ma nel mio caso le dimensioni dell'etichetta sarebbero state corrette. –

risposta

7

Bella domanda. Credo che non ci sia una sola risposta "canonica" qui e potresti trovare diversi approcci diversi per affrontare questo problema. Farò del mio meglio per mostrare una via possibile. È leggermente diverso da quello che hai chiesto, quindi ti ripropongo il problema e suggerisco una soluzione.

Il problema: data un'immagine in ingresso e un insieme di classi C, indicano per ogni classe se è raffigurato nell'immagine o meno.

Ingressi: in tempi di formazione, gli ingressi sono coppie di immagine e un C -Dim binario vettore indicando per ciascuna classe delle classi C se è presente nell'immagine o meno.

Ouput: data un'immagine, restituisce un vettore binario C -dim (uguale al secondo modulo suggerito nella domanda).

Fare caffe fare il lavoro: Per fare questo lavoro abbiamo bisogno di modificare i livelli superiori della rete utilizzando una perdita diversa.
Ma prima, comprendiamo il solito modo in cui viene utilizzato il caffè e poi esaminiamo le modifiche necessarie.
Il modo in cui ora sono: l'immagine viene inserita nella rete, passa attraverso i pool conv/pooling/... e infine passa attraverso un livello "InnerProduct" con le uscite C. Queste previsioni C entrano in un livello "Softmax" che inibisce tutti tranne la classe più dominante. Una volta che una singola classe viene evidenziata, il livello "SoftmaxWithLoss" controlla che la classe prevista evidenziata corrisponda alla classe di verità di terra.

Quello che ti serve: il problema con l'approccio esistente è il livello "Softmax" che fondamentalmente seleziona una singola classe. Ti suggerisco di sostituire con uno strato "Sigmoid" che corrisponde a ogni delle uscite C in un indicatore se questa specifica classe è presente nell'immagine. Per la formazione, è necessario utilizzare "SigmoidCrossEntropyLoss" anziché il livello "SoftmaxWithloss".

+1

Grazie ancora, @Shai! –

+0

IMO, la ragione per cui 'Softmax' fondamentalmente seleziona una singola classe è perché' Softmax' normalizza l'output in probabilità. Ma ora la caffe sembra già supportare una versione multi-label di 'Softmax' (come accennato [qui] (http://stackoverflow.com/a/32697800/522000))? In tal caso, quali sono i casi di utilizzo effettivo per la versione multi-label di 'Softmax'? – mintaka

+0

@mintaka il softmax con più etichette a cui è stato collegato non è lo stesso che consente più categorie come in questo caso. – Shai

0

Poiché un'immagine può avere più etichette. Il modo più intuitivo è pensare questo problema come un problema di classificazione binaria C independt in cui C è il numero totale di classi diverse. Così è facile capire che cosa @Shai have said:

aggiungere un layer "sigma" che associa ciascuna delle uscite C in un indicatore se questa classe specifica è presente nell'immagine, e deve usare "SigmoidCrossEntropyLoss" invece del Livello "SoftmaxWithloss". La perdita è la somma di questi C SigmoidCrossEntropyLoss.

+0

Quando dici: aggiungi il livello 'Sigmoid' intendi prima uno strato' Sigmoid' e poi uno 'SigmoidCrossEntropyLoss'? Questo è legato al 'train_val.prototxt' @Shai @kli_nlpr – thigi