Keras Несколько «Softmax» в последнем слое возможно?

10

множественный softmax в последнем слое

Можно ли реализовать несколько softmaxes в последнем слое в Keras? Таким образом, сумма узлов 1-4 = 1; 5-8 = 1; и т.п.

Должен ли я пойти на другой дизайн сети?

Артур Дент
источник

Ответы:

7

Я бы использовал функциональный интерфейс.

Что-то вроде этого:

from keras.layers import Activation, Input, Dense
from keras.models import Model
from keras.layers.merge import Concatenate

input_ = Input(shape=input_shape)

x = input_
x1 = Dense(4, x)
x2 = Dense(4, x)
x3 = Dense(4, x)
x1 = Activation('softmax')(x1)
x2 = Activation('softmax')(x2)
x3 = Activation('softmax')(x3)
x = Concatenate([x1, x2, x3])

model = Model(inputs=input_, outputs=x)
Мартин Тома
источник
2
Я не предлагаю вам добавить решение, но я думаю, что оставив ответ «как есть», создается впечатление, что работа по созданию модели OP будет завершена. Но есть и такой же дополнительный объем работы, который OP должен выполнить в других частях кода, если они действительно хотят обучить модель. Вы можете хотя бы сослаться на это требование. То же относится и к другому ответу. , ,
Нил Слэйтер
1
@NeilSlater вы абсолютно правы. Я понятия не имею, почему мне нужна другая функция стоимости. Можете ли вы сказать мне, почему это важно?
arthurDent
1
@arthurDent - потому что мульти-классовая кросс-энтропийная потеря Keras, вероятно, не приспособлена для того, чтобы справляться с тремя одновременными истинными классами в каждом примере, а разделение на группы - ошибка в одной группе может привести к неправильному назначению градиентов для выходов в других группах , Вы можете просто попробовать и посмотреть, что получится. , , он все еще может сходиться, но точка равновесия может быть не такой хорошей, как наличие трех совершенно отдельных сетей.
Нил Слэйтер
1
Y^-Y
1
использование метрик, например, categorical_accuracyи predict_classesметодов может потребовать больше размышлений. , ,
Нил Слэйтер
5

Можно просто реализовать свою собственную функцию softmax. Вы можете разделить тензор на части, затем вычислить softmax отдельно для каждой части и объединить тензорные части:

def custom_softmax(t):
    sh = K.shape(t)
    partial_sm = []
    for i in range(sh[1] // 4):
        partial_sm.append(K.softmax(t[:, i*4:(i+1)*4]))
    return K.concatenate(partial_sm)

concatenate без аргумента оси объединить через последнюю ось (в нашем случае ось = 1).

Затем вы можете включить эту функцию активации в скрытый слой или добавить его в график.

Dense(activation=custom_activation)

или

model.add(Activation(custom_activation))

Вам также необходимо определить новую функцию стоимости.

Primoz
источник