Разница между Dense (2) и Dense (1) как последним слоем бинарной классификации CNN?

В CNN для двоичной классификации изображений форма вывода должна быть (количество изображений, 1) или (количество изображений, 2)? В частности, вот 2 вида последнего слоя в CNN:

keras.layers.Dense(2, activation = 'softmax')(previousLayer)

or

keras.layers.Dense(1, activation = 'softmax')(previousLayer)

В первом случае для каждого изображения есть 2 выходных значения (вероятность принадлежности к группе 1 и вероятность принадлежности к группе 2). Во втором случае каждое изображение имеет только 1 выходное значение, которое является его меткой (0 или 1, метка=1 означает, что оно принадлежит к группе 1).

Который правильный? Есть ли внутренняя разница? Я не хочу распознавать какие-либо объекты на этих изображениях, просто разделю их на 2 группы.

Большое спасибо!


person BuboBubo    schedule 12.06.2018    source источник
comment
Второй фрагмент кода выдает только постоянное значение 1.0, вы не можете использовать softmax с одним нейроном.   -  person Dr. Snoopy    schedule 12.06.2018


Ответы (2)


Это первое является правильным решением:

keras.layers.Dense(2, activation = 'softmax')(previousLayer)

Обычно мы используем функцию активации softmax для выполнения задач классификации, а ширина вывода будет количеством категорий. Это означает, что если вы хотите классифицировать один объект по трем категориям с метками A, B или C, вам нужно сделать так, чтобы слой Dense генерировал выходные данные с формой (None, 3). Затем вы можете использовать функцию cross_entropyloss для вычисления LOSS, автоматического вычисления градиента и выполнения процесса обратного распространения.

Если вы хотите сгенерировать только одно значение со слоем Dense, это означает, что вы получаете тензор с формой (None, 1), поэтому он создает одно числовое значение, например задачу regression. Вы используете значение вывода для представления категории. Ответ правильный, но не работает как общее решение задачи classification.

person Ember Xu    schedule 12.06.2018
comment
Знаете ли вы, почему документация (keras.io/getting-started/sequential-model- руководство) предлагает обратный путь (только один выход)?. Для меня это работает так же, если я использую последний плотный слой с одним выходным измерением, а затем binary_crossentropy, или последний плотный слой с двумя выходными измерениями и sparse_categorical_crossentropy. - person KLaz; 24.10.2018
comment
@KLaz На самом деле, когда мы хотим выполнить задачу классификации, мы выберем функцию потерь в зависимости от количества категорий классификации. В Keras, если мы хотим выполнить классификацию по двум категориям, мы обычно используем Dense(1, activation='sigmoid', name='output') в качестве последнего узла и компилируем модель с использованием функции потерь binary_crossentropy. Но когда мы хотим выполнить задачу классификации нескольких классов, мы выбираем Dense(4, activation='softmax', name='output') в качестве выходного узла и, соответственно, выбираем categorical_crossentropy в качестве функции потерь. - person Ember Xu; 15.11.2018
comment
@KLaz Я думаю, может быть, это просто привычка выполнять эту задачу, потому что она может дать тот же результат. - person Ember Xu; 15.11.2018
comment
@NeoXu, у меня есть 2 класса классификации болезней (X и не-X), я использовал 2 в последнем плотном слое, sigmoid после активации. Для потери я использовал mean_squared_error. До этого метки поезда и теста были преобразованы to_categorical. Вы видите, что это правильный путь? Или я вообще не должен конвертировать to_categorical и использовать 1 в плотном, sigmoid потом, binary_crossentropy как потерю? - person bit_scientist; 06.12.2019

Разница заключается в том, независимы ли вероятности классов друг от друга (классификация с несколькими метками) или нет.

Когда есть 2 класса и у вас вообще P(c=1) + P(c=0) = 1 то

keras.layers.Dense(2, activation = 'softmax') 

keras.layers.Dense(1, activation = 'sigmoid')

оба верны с точки зрения вероятностей классов. Единственная разница заключается в том, как вы ставите метки во время обучения. Но

keras.layers.Dense(2, activation = 'sigmoid')

неверно в этом контексте. Однако это правильная реализация, если у вас P(c=1) + P(c=0) != 1. Это относится к классификации с несколькими метками, когда экземпляр может принадлежать более чем одному правильному классу.

person rajesh    schedule 11.02.2020