закодированный в горячем виде Keras CNN не соответствует ожидаемому - PullRequest
0 голосов
/ 24 сентября 2018

Мне нужно решить простую проблему, в которой есть 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 Ответ

0 голосов
/ 24 сентября 2018

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

softmax

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

Пример из github : image

В случае последнего изображения 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.

...