Закодированный в горячем виде Keras CNN не соответствует ожидаемому

Мне нужно решить простую проблему, в которой есть 32 фильтра того же размера, что и изображение (1x2048). Следовательно, веса фильтра будут умножаться один за другим на пиксели, а не сворачиваться по ним.

Выход для каждого изображения представляет собой горячий вектор, например [1,0,0,0]. Когда я суммирую два изображения и выполнил оценку, результат будет либо [1,0,0,0], либо [0,0,1,0].

Однако, поскольку я суммировал два изображения, я ожидаю получить [1,0,1,0] в качестве выходных данных, чтобы понять, что у меня есть оба класса в изображении. Тем не менее, я не знаю, что делать, чтобы получить то, что я ожидаю, и где может быть проблема.

input_shape=(1,2048,1)
model = Sequential()
model.add(Conv2D(32, kernel_size=(1, 2048), strides=(1, 1),
activation='softmax', 
input_shape=input_shape,
kernel_regularizer=keras.regularizers.l1(L1regularization),
kernel_constraint=keras.constraints.non_neg()            ))

model.compile(loss=keras.losses.categorical_crossentropy,     
optimizer=optimizer,metrics=[metrics])

Благодарю.

1 ответ

Это из-за свойств softmax -softmax Функция максимизирует высокие значения. Тогда в большинстве случаев есть только один максимум для функции softmax. Софтмакс:

SoftMax

Вы можете получить два максимума для softmax, если входное значение softmax содержит два равных максимальных значения. Это возможно в очень редком случае, когда одинаковые значения (логиты) были получены с помощью сверточных фильтров. В противном случае, существует только один максимум, поэтому прогнозируется один класс.

Пример из github: ОБРАЗ

В случае последнего изображения softmax выдает два одинаковых значения. Но вы не должны ожидать этого все время.
Проверьте вывод Conv2D слой с linear активация, если вы хотите проверить это предположение.

model = Sequential()
model.add(Conv2D(32, kernel_size=(1, 2048), strides=(1, 1),
    activation='linear', 
    input_shape=input_shape,
    kernel_regularizer=keras.regularizers.l1(L1regularization),
    kernel_constraint=keras.constraints.non_neg()))
model.add(Activation('softmax'))

Это та же архитектура, но вы получите вывод Conv2D,

Другие вопросы по тегам