Керас Можливий кілька "Softmax" в останньому шарі?


10

декілька softmax в останньому шарі

Чи можливо реалізувати безглузді софтмакси в останньому шарі в Керасі? Отже сума Вузлів 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
Я не пропоную вам додати рішення, але я думаю, що залишення відповіді як-це створює враження, що робота з розробки моделей ОП буде завершена. Але для ОП є однаковий додатковий обсяг роботи, якщо вони хочуть насправді навчати модель. Ви можете хоча б посилатися на цю вимогу. Те саме стосується й іншої відповіді. . .
Ніл Слейтер

1
@NeilSlater ви абсолютно праві. Я поняття не маю, навіщо мені потрібна інша функція витрат. Чи можете ви сказати мені, чому це важливо?
arthurDent

1
@arthurDent - тому що багатокласова перехресна ентропія втрати Кераса, ймовірно, не спрямована на те, щоб впоратись із трьома одночасними істинними класами на кожному прикладі, а поділ на групи - помилка в одній групі може призвести до градієнтів, неправильно призначених для виходів у інших групах . Ви можете просто спробувати і подивитися, що станеться. . . він все ще може зближуватися, але точка балансу може бути не такою хорошою, як наявність трьох повністю окремих мереж.
Ніл Слейтер

1
@arthurDent:. . . хоча я продумав це детальніше, і градієнт у logit для багатошарової перехресної ентропії з softmax, що простоу^-уможе все-таки застосовуватись і працювати успішно. Звичайний softmax вихід, звичайно, не зможе вивчити 3 класи одночасно, але, можливо, ця відповідь - все, що вам потрібно. . .
Ніл Слейтер

1
використання метрик, наприклад, categorical_accuracyі predict_classesметодів, можливо, потребує більше роздумів. . .
Ніл Слейтер

5

Можна просто реалізувати власну функцію 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.