Keras Più "Softmax" nell'ultimo strato sono possibili?


Risposte:


7

Vorrei usare l'interfaccia funzionale.

Qualcosa come questo:

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
Non sto suggerendo di aggiungere la soluzione, ma penso che lasciare la risposta così com'è dia l'impressione che il lavoro di costruzione del modello di OP sarebbe completo. Ma c'è una quantità aggiuntiva di lavoro che OP deve svolgere in altre parti del codice se vogliono davvero addestrare il modello. Potresti almeno fare riferimento a tale requisito. Lo stesso vale per altre risposte. . .
Neil Slater,

1
@NeilSlater hai perfettamente ragione. Non ho idea del motivo per cui ho bisogno di una diversa funzione di costo. Puoi dirmi perché questo è importante?
ArthurDent

1
@arthurDent - poiché la perdita multi-classe di entropia multipla di Keras probabilmente non è predisposta per far fronte a tre classi vere simultanee su ciascun esempio e la separazione in gruppi - l'errore in un gruppo può comportare pendenze erroneamente assegnate alle uscite in altri gruppi . Potresti semplicemente provarlo e vedere cosa succede. . . può ancora convergere, ma il punto di equilibrio potrebbe non essere buono come avere tre reti completamente separate.
Neil Slater

1
y^-y

1
l'uso di metriche, ad esempio categorical_accuracye predict_classesmetodi, potrebbe richiedere più riflessione. . .
Neil Slater,

5

È possibile semplicemente implementare la propria funzione softmax. È possibile dividere un tensore in parti, quindi calcolare il softmax separatamente per parte e concatenare le parti del tensore:

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 senza argomento dell'asse concatenato attraverso l'ultimo asse (nel nostro caso asse = 1).

Quindi puoi includere questa funzione di attivazione in un livello nascosto o aggiungerla a un grafico.

Dense(activation=custom_activation)

o

model.add(Activation(custom_activation))

È inoltre necessario definire una nuova funzione di costo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.