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


Ответы:


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))

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.