Глядя на исходный код в sigmoid_cross_entropy_loss_layer.cpp, который является исходным кодом для функции потери перекрестной энтропии в caffe, я заметил, что код для фактического значения ошибки
for (int i = 0; i < count; ++i) {
loss -= input_data[i] * (target[i] - (input_data[i] >= 0)) -
log(1 + exp(input_data[i] - 2 * input_data[i] * (input_data[i] >= 0)));
}
которая, кажется, довольно отличается от функции потери CE в документации по реализации Caffe или C ++, которую я нашел здесь:
https://visualstudiomagazine.com/Articles/2014/04/01/Neural-Network-Cross-Entropy-Error.aspx?Page=2
или на самом деле определение функции потерь CE.
Это какое-то приближение? Сначала я подумал, что это расширение Тейлора из log (1 − x), но это совсем не работает.
потери, реализованные этим слоем, не просто перекрестная энтропия Слой реализует активацию сигмоида с последующей перекрестной потерей энтропии. Это обеспечивает более устойчивую численную реализацию потерь.
увидеть эта тема для дополнительной информации.
Также эта тема.
Других решений пока нет …