Я просматривал код слоя Caffe SigmoidCrossEntropyLoss и документы, и я немного запутался. В документах функция потерь указана как логит-потери (я бы воспроизвел ее здесь, но без латекса формулу было бы трудно читать. Проверьте ссылку на документы, она находится в самом верху).
Однако сам код (Forward_cpu(...)
) показывает другую формулу
Dtype loss = 0;
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)));
}
top[0]->mutable_cpu_data()[0] = loss / num;
Это потому, что это учитывает сигмовидную функцию, уже примененную к входу?
Тем не менее, даже в этом случае фрагменты (input_data[i] >= 0)
также сбивают меня с толку. Похоже, что они вместо p_hat из формулы потерь в документах, которая должна быть предсказанием, сжатым сигмовидной функцией. Так почему же они просто берут двоичный порог? Это становится еще более запутанным, поскольку эта потеря предсказывает выходы [0,1], поэтому (input_data[i] >= 0)
будет 1
, если только он не уверен на 100%, что это не так.
Может кто-нибудь объяснить мне это?
top[0]
и почему они использовалиtop[0]->mutable_cpu_data()[0]
. Спасибо 26.01.2017