2015-06-28 14 views
8

Attualmente sto cercando di implementare il mio livello di perdita in caffe, e mentre cerco di farlo, sto usando altri livelli come riferimento. Una cosa che mi imbarazza, tuttavia, è l'uso di top[0]->cpu_diff() in Backward_cpu. Userò lo EuclideanLossLayer come riferimento. Ecco le mie domandeEuclidean Loss Layer in Caffe

  • E 'la mia comprensione che top[0]->cpu_diff() tiene il derivato errore dal strato successivo, ma cosa succede se non c'è altro strato, come viene inizializzato? poiché è usato in EuclideanLossLayer senza eseguire alcun controllo:

    const Dtype alpha = sign * top[0]->cpu_diff()[0]/bottom[i]->num(); 
    
  • nuovo, nel EuclideanLossLayer, la derivata dell'errore rispetto alle attivazioni è calcolato utilizzando il seguente frammento di codice:

    const Dtype alpha = sign * top[0]->cpu_diff()[0]/bottom[i]->num(); 
    caffe_cpu_axpby(
        bottom[i]->count(),    // count 
        alpha,        // alpha 
        diff_.cpu_data(),     // a 
        Dtype(0),       // beta 
        bottom[i]->mutable_cpu_diff()); // b 
    

    Se la mia prima ipotesi è corretta, e top[0]->cpu_diff() detiene effettivamente la derivata dell'errore per il livello precedente, perché utilizziamo solo il primo elemento, ad esempio top[0]->cpu_diff()[0] anziché moltiplicare per l'intero vettore, ad esempio top[0]->cpu_diff()?

risposta

13

Per i livelli di perdita, non c'è strato successivo, e così il blob diff superiore è tecnicamente definito e non utilizzati - ma Caffe sta usando questo spazio preallocato per memorizzare i dati estranei: Caffe supporta moltiplicando i livelli di perdita con un dall'utente peso definito (loss_weight nel prototipo), questa informazione (un singolo numero scalare in virgola mobile) è memorizzata nel primo elemento dell'array diff del blob superiore. Ecco perché vedrai in ogni livello di perdita, che si moltiplicano per quella quantità per supportare quella funzionalità. Questo è spiegato in Caffe's tutorial about the loss layer.

Questo peso viene in genere utilizzato per aggiungere perdite ausiliarie alla rete. Puoi leggere ulteriori informazioni su di esso in Google Going Deeper with Convoltions o in Deeply-Supervised Nets.