Keras Multiple "Softmax" dans la dernière couche possible?

10

plusieurs softmax dans la dernière couche

Est-il possible d'implémenter plusieurs softmaxes dans la dernière couche de Keras? Ainsi, la somme des nœuds 1-4 = 1; 5-8 = 1; etc.

Dois-je opter pour une conception de réseau différente?

arthurDent
la source

Réponses:

7

J'utiliserais l'interface fonctionnelle.

Quelque chose comme ça:

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
la source
2
Je ne suggère pas que vous ajoutiez la solution, mais je pense que laisser la réponse telle quelle donne l'impression que le travail de construction de modèles d'OP serait terminé. Mais il y a une quantité de travail supplémentaire égale pour OP à faire dans d'autres parties du code s'ils veulent réellement former le modèle. Vous pourriez au moins faire référence à cette exigence. Il en va de même pour les autres réponses. . .
Neil Slater
1
@NeilSlater vous avez absolument raison. Je n'ai aucune idée pourquoi j'ai besoin d'une fonction de coût différente. Pouvez-vous me dire pourquoi c'est important?
arthurDent
1
@arthurDent - parce que la perte d'entropie croisée multi-classe de Keras n'est probablement pas adaptée pour faire face à trois classes vraies simultanées sur chaque exemple, et la séparation en groupes - une erreur dans un groupe peut entraîner des gradients incorrectement affectés aux sorties dans d'autres groupes . Vous pouvez simplement l'essayer et voir ce qui se passe. . . il peut encore converger, mais le point d'équilibre peut ne pas être aussi bon que d'avoir trois réseaux entièrement séparés.
Neil Slater
1
y^-y
1
l'utilisation de métriques, par exemple, categorical_accuracyet les predict_classesméthodes peuvent nécessiter plus de réflexion. . .
Neil Slater
5

Il est possible d'implémenter simplement votre propre fonction softmax. Vous pouvez diviser un tenseur en parties, puis calculer softmax séparément par partie et concaténer les parties du tenseur:

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 sans argument d'axe concaténé par le dernier axe (dans notre cas axe = 1).

Ensuite, vous pouvez inclure cette fonction d'activation dans une couche cachée ou l'ajouter à un graphique.

Dense(activation=custom_activation)

ou

model.add(Activation(custom_activation))

Vous devez également définir une nouvelle fonction de coût.

Primoz
la source