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


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)

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.