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?
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?
Réponses:
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)
categorical_accuracy
et les predict_classes
méthodes peuvent nécessiter plus de réflexion. . .
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.