Почему в сверточной нейронной сети возможны низкие потери, но очень низкая точность?
Я новичок в машинном обучении и в настоящее время пытаюсь обучить сверточную нейронную сеть с 3 сверточными слоями и 1 полностью связанным слоем. Я использую вероятность отсева 25% и скорость обучения 0,0001. У меня 6000 тренировочных образов 150х200 и 13 выходных классов. Я использую tenorflow. Я замечаю тенденцию, когда моя потеря неуклонно уменьшается, но моя точность увеличивается незначительно, а затем снова падает вниз. Мои тренировочные изображения - синие линии, а мои проверочные изображения - оранжевые линии. Ось X - это шаги.
Мне интересно, есть ли что-то, чего я не понимаю или какие могут быть возможные причины этого явления? Из материала, который я прочитал, я предположил, что низкие потери означают высокую точность. Вот моя функция потери.
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
2 ответа
Это потому, что потеря и точность - это две совершенно разные вещи (по крайней мере, логически)!
Рассмотрим пример, в котором вы определили loss
как:
loss = (1-accuracy)
В этом случае, когда вы пытаетесь свести к минимуму loss
, accuracy
увеличивается автоматически.
Теперь рассмотрим другой пример, где вы определяете loss
как:
loss = average(prediction_probabilities)
Хотя это не имеет никакого смысла, технически это все еще действительная функция потерь, и ваша weights
все еще настроены для того, чтобы свести к минимуму такие loss
,
Но, как вы можете видеть, в этом случае нет никакой связи между loss
а также accuracy
поэтому вы не можете ожидать, что оба будут увеличиваться / уменьшаться одновременно.
Замечания: Loss
всегда будет сведено к минимуму (таким образом, ваш loss
уменьшается после каждой итерации)!
PS: пожалуйста, обновите ваш вопрос с loss
Функция, которую вы пытаетесь свести к минимуму.
softmax_cross_entropy_with_logits() и точность - это две разные концепции с разными определениями формул. В обычных случаях мы могли бы ожидать повышения точности за счет минимизации кросс-энтропии softmax, но они рассчитываются по-разному, поэтому мы не можем ожидать, что их всегда будут увеличивать или уменьшать синхронизированным образом.
Мы используем кросс-энтропию softmax в CNN, потому что она эффективна для обучения нейронной сети. Если в качестве функции потерь мы будем использовать потерю = (1-точность), очень трудно получить лучший результат путем корректировки весов для нашей нейронной сети CNN с нашими современными зрелыми обучающими решениями по обратной передаче, я действительно сделал это и подтвердил этот вывод, вы также могли бы попробуй сам. Может быть, это вызвано нашим текущим плохим решением для обучения обратной программированию, может быть, это связано с определением наших нейронов (нам нужно заменить его на некоторые другие типы нейронов?), Но в любом случае, в настоящее время, использование точности в функции потерь не является эффективным способом для обучение нейронной сети, так что просто используйте softmax_cross_entropy_with_logits(), как сказали нам эти искусствоведы, они уже подтвердили, что этот способ эффективен, а для других мы их пока не знаем.