Евклидов слой потерь в кафе
В настоящее время я пытаюсь реализовать свой собственный уровень потерь в caffe, и, пытаясь сделать это, я использую другие слои в качестве эталона. Одна вещь, которая озадачивает меня, однако, это использованиеtop[0]->cpu_diff()
вBackward_cpu
, Я буду использоватьEuclideanLossLayer
в качестве ссылки. Вот мои вопросы
Насколько я понимаю, чтоtop[0]->cpu_diff()
содержит производную от следующего уровня ошибки, но что, если нет другого уровня, как он инициализируется? так как он используется вEuclideanLossLayer
без выполнения каких-либо проверок:
const Dtype alpha = sign * top[0]->cpu_diff()[0] / bottom[i]->num();
Опять же, вEuclideanLossLayer
, производная для ошибки по активациям рассчитывается с использованием следующего фрагмента кода:
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
Если мое первое предположение верно, иtop[0]->cpu_diff()
действительно содержит производную ошибки для уровня выше, почему мы используем только первый элемент, т.е.top[0]->cpu_diff()[0]
в отличие от умножения на весь вектор, т.е.top[0]->cpu_diff()
?