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 inEuclideanLossLayer
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 esempiotop[0]->cpu_diff()[0]
anziché moltiplicare per l'intero vettore, ad esempiotop[0]->cpu_diff()
?