Я просмотрел код Caffe's SigmoidCrossEntropyLoss layer и docs, и я немного смущен. Документы перечисляют функцию потерь как потерю логита (я бы реплицировал ее здесь, но без Latex формулу было бы трудно прочитать. Посмотрите ссылку docs, она находится на самом верху).Caffe SigmoidCrossEntropyLoss Layer Loss Function
Однако сам код (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% уверен, что это не так.
Может кто-нибудь, пожалуйста, объясните мне это?
Итак, если бы кто-то использовал мягкие метки истины истины (т. Е. [0,1], а не {0,1}), что-нибудь нужно было бы изменить? – marcman
Если сумма наземных символов истинности равна 1, то изменений этого слоя не должно быть. В противном случае вы должны внести некоторые изменения, которые применяют кросс-энтропию на каждом выходе сети. @marcman – Dale
Я думаю, что понимаю, почему это так, но на практике, когда я нормализую каждую метку, я начал получать потери NaN, хотя это может быть проблема с уровнем обучения – marcman