Ярлыки с горячим кодированием ___ multi-hot-encoded output_Keras - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть 1D-изображение с 1x2048 пикселей в качестве входных данных и 32 класса, для которых я определил слой из 32 фильтров с таким же размером изображения (1x2048), которые регуляризованы L1.

MyПримеры изображений кодируются в горячем виде.Тем не менее, моя цель состоит в том, чтобы получить вывод с горячим кодированием, когда я суммирую некоторые из этих изображений вместе и передаю их в обученную модель.

Обучение проходит хорошо, и он может классифицировать каждый класс отдельно, но если я суммирую два изображения и передам его в модель, он выдает только закодированный вектор с одной горячей точкой (хотя я ожидаю закодированный вектор с двумя горячей точкой),Если я посмотрю на ядра после тренировки, они имеют смысл, так как большинство весов равны нулю, кроме тех, которые определяют мой класс.

Я не понимаю, почему я получаю вывод с одним горячим вектором, а не мульти-hot вектор.

Причина, по которой я еще не суммирую изображения и не использую их для обучения модели, заключается в том, что возможное создание возможной комбинации изображений превышает мощность моей памяти.

Образ сети, который я имею в виду

input_shape=(1,2048,1)
model = Sequential()

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

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

1 Ответ

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

Вы используете неправильную функцию потерь

categorical_crossentropy всегда вернет вам точно одно 1-значение в вашем векторе, независимо от ввода.Он пытается классифицировать каждый экземпляр в один (и только один) доступный класс.

Тем не менее, вы хотите (потенциально) многократные в вашем выводе.Следовательно, вы должны использовать binary_crossentropy.Также см. этот пост .

В дополнение к этому, я бы настоятельно советовал вам действительно подумать об этом дважды, поскольку - если у вас нет случая с несколькими классами, которые часто,это может привести к множеству ложных срабатываний.То есть, в случаях, когда вы прогнозируете более одного класса.

С другой стороны, вы можете рассмотреть возможность использования Conv1D, поскольку ваш сигнал только одномерный.

...