Czy możliwe jest użycie wielu „Softmax” w ostatniej warstwie?

10

wielokrotne softmax na ostatniej warstwie

Czy jest możliwe zaimplementowanie wielu softmaxów w ostatniej warstwie w Keras? Tak więc suma węzłów 1-4 = 1; 5-8 = 1; itp.

Czy powinienem wybrać inny projekt sieci?

arthurDent
źródło

Odpowiedzi:

7

Chciałbym użyć funkcjonalnego interfejsu.

Coś takiego:

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)
Martin Thoma
źródło
2
Nie sugeruję, abyś dodał rozwiązanie, ale myślę, że pozostawienie odpowiedzi w obecnej formie sprawia wrażenie, że prace nad budowaniem modeli OP byłyby zakończone. Ale OP ma tyle samo pracy do wykonania w innych częściach kodu, jeśli chce rzeczywiście wyszkolić model. Możesz przynajmniej odwołać się do tego wymogu. To samo dotyczy innej odpowiedzi. . .
Neil Slater,
1
@NeilSlater masz absolutną rację. Nie mam pojęcia, dlaczego potrzebuję innej funkcji kosztów. Czy możesz mi powiedzieć, dlaczego jest to ważne?
arthurDent,
1
@arthurDent - ponieważ utrata wielu klas entropii Keras prawdopodobnie nie jest przystosowana do poradzenia sobie z trzema równoczesnymi prawdziwymi klasami w każdym przykładzie i podziałem na grupy - błąd w jednej grupie może skutkować błędnie przypisanymi gradientami do wyników w innych grupach . Możesz po prostu spróbować i zobaczyć, co się stanie. . . wciąż może się zbiegać, ale punkt równowagi może nie być tak dobry, jak posiadanie trzech całkowicie oddzielnych sieci.
Neil Slater,
1
@arthurDent:. . . chociaż zastanawiam się nad tym bardziej szczegółowo i gradientem logitu dla wielopłaszczyznowej entropii krzyżowej z softmax, co jest po prostuy^ymoże nadal składać wnioski i działać pomyślnie. Normalne wyjście softmax oczywiście nie nauczyłby się 3 klas jednocześnie, ale być może ta odpowiedź jest wszystkim, czego potrzebujesz. . .
Neil Slater,
1
Zastosowanie np metryki categorical_accuracyi predict_classesmetod może potrzebować więcej myśli. . .
Neil Slater,
5

Możliwe jest po prostu zaimplementowanie własnej funkcji softmax. Możesz podzielić tensor na części, a następnie obliczyć softmax osobno dla każdej części i połączyć części tensora:

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 bez argumentu osi konkatenacja przez ostatnią oś (w naszym przypadku oś = 1).

Następnie możesz dołączyć tę funkcję aktywacji do ukrytej warstwy lub dodać ją do wykresu.

Dense(activation=custom_activation)

lub

model.add(Activation(custom_activation))

Musisz także zdefiniować nową funkcję kosztów.

Primoz
źródło