Keras Multiple "Softmax" in der letzten Schicht möglich?

10

mehrere Softmax in der letzten Schicht

Ist es möglich, mehrere Softmaxe in der letzten Schicht in Keras zu implementieren? Also ist die Summe der Knoten 1-4 = 1; 5-8 = 1; usw.

Sollte ich mich für ein anderes Netzwerkdesign entscheiden?

arthurDent
quelle

Antworten:

7

Ich würde die funktionale Schnittstelle verwenden.

Etwas wie das:

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
quelle
2
Ich schlage nicht vor, dass Sie die Lösung hinzufügen, aber ich denke, wenn Sie die Antwort unverändert lassen, entsteht der Eindruck, dass die Modellbauarbeiten von OP abgeschlossen wären. In anderen Teilen des Codes muss OP jedoch genauso viel zusätzliche Arbeit leisten, wenn das Modell tatsächlich trainiert werden soll. Sie könnten zumindest auf diese Anforderung verweisen. Gleiches gilt für andere Antworten. . .
Neil Slater
1
@NeilSlater du hast absolut recht. Ich habe keine Ahnung, warum ich eine andere Kostenfunktion benötige. Können Sie mir sagen, warum das wichtig ist?
ArthurDent
1
@arthurDent - Da Keras 'Kreuzentropieverlust in mehreren Klassen wahrscheinlich nicht darauf ausgelegt ist, drei gleichzeitige wahre Klassen in jedem Beispiel und die Aufteilung in Gruppen zu bewältigen, kann ein Fehler in einer Gruppe dazu führen, dass Gradienten den Ausgaben in anderen Gruppen falsch zugewiesen werden . Sie könnten es einfach versuchen und sehen, was passiert. . . Es kann immer noch konvergieren, aber der Gleichgewichtspunkt ist möglicherweise nicht so gut wie drei vollständig getrennte Netzwerke.
Neil Slater
1
@arthurDent :. . . obwohl ich es mir genauer überlege, und der Gradient am Logit für Kreuzentropie mit mehreren Klassen mit Softmax, der einfach kann immer noch angewendet werden und erfolgreich funktionieren. Eine normale Softmax-Ausgabe würde natürlich nicht 3 Klassen gleichzeitig lernen, aber vielleicht ist diese Antwort doch alles, was Sie brauchen. . . y^y
Neil Slater
1
Die Verwendung von Metriken, z. B. categorical_accuracyund predict_classesMethoden, erfordert möglicherweise mehr Überlegungen. . .
Neil Slater
5

Es ist möglich, einfach Ihre eigene Softmax-Funktion zu implementieren. Sie können einen Tensor in Teile aufteilen, dann Softmax separat pro Teil berechnen und Tensorteile verketten:

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 ohne Achsenargument durch die letzte Achse verketten (in unserem Fall Achse = 1).

Anschließend können Sie diese Aktivierungsfunktion in eine ausgeblendete Ebene aufnehmen oder einem Diagramm hinzufügen.

Dense(activation=custom_activation)

oder

model.add(Activation(custom_activation))

Sie müssen auch eine neue Kostenfunktion definieren.

Primoz
quelle