Закодированный в горячем виде 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 содержит два равных максимальных значения. Это возможно в очень редком случае, когда одинаковые значения (логиты) были получены с помощью сверточных фильтров. В противном случае, существует только один максимум, поэтому прогнозируется один класс.
Пример из 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
,