множественные классификации softmax (керас) - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь создать CNN, который будет выводить 2 метки, где каждая метка имеет 12 возможностей;ввод - это изображение.

Другими словами, мой желаемый вывод - A (один из 12 вариантов) и B (один из 12 различных вариантов).

С каждой меткой отдельно, конечно, это softmax, но я не мог найти, возможно ли сделать так, чтобы метки «softmax» были такими.

Ясно, что я могу вывести 24 нейрона, используяsigmoid выводит и затем нормализует вручную, но тогда сеть не будет внутренне связывать 12 вариантов в каждой группе.

Я пишу псевдопсевдокод того, что я хотел бы, если бы он существовал:

model = Sequential()
model.add(Convolution2D(64, kernel_size=3,activation='relu', input_shape=image_shape))
model.add(Flatten())
model.add(Dense(256,activation='relu'))
# pseudo-pseudo-code
model.add(Dense((12,12),activation=('softmax','softmax'))) # <- here is where I would have liked 2 softmax outputs with 12 neurons in each

Будут приветствоваться любые решения (я использую Keras, но буду рад решениям, использующим любой другой пакет, или даже сам что-нибудь кодирую).

Редактировать: я также мог бы генерировать 144 выводапредставляющих все комбинации, но я не уверен, что это будет хорошим решением - любые комментарии по этому поводу также очень приветствуются

1 Ответ

0 голосов
/ 26 февраля 2019

Я бы использовал функциональный API с 2 выходами.Руководство в https://keras.io/getting-started/functional-api-guide/#multi-input-and-multi-output-models

что-то в строках:

input = Input(input_shape=image_shape)
cnv = Convolution2d(...)(input)
hidden = Dense(256, ...)(Flatten()(cnv))
output1 = Dense(12, activation='softmax')(hidden)
output2 = Dense(12, activation='softmax')(hidden)
model = keras.models.Model(inputs=input, outputs=[output1, output2])
model.compile(optimizer='sgd', loss=['binary_crossentropy', 'binary_crossentropy'],
              loss_weights=[1., 1.])
...