Keras Múltiplo "Softmax" na última camada possível?

10

softmax múltiplo na última camada

É possível implementar vários softmaxes na última camada do Keras? Portanto, a soma dos nós 1-4 = 1; 5-8 = 1; etc.

Devo optar por um design de rede diferente?

arthurDent
fonte

Respostas:

7

Eu usaria a interface funcional.

Algo assim:

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
fonte
2
Não estou sugerindo que você adicione a solução, mas acho que deixar a resposta como está dá a impressão de que o trabalho de construção de modelo do OP estaria completo. Mas há uma quantidade extra igual de trabalho para o OP fazer em outras partes do código, se eles realmente querem treinar o modelo. Você poderia pelo menos referenciar esse requisito. O mesmo se aplica a outra resposta. . .
Neil Slater #
11
@NeilSlater, você está absolutamente certo. Não sei por que preciso de uma função de custo diferente. Você pode me dizer por que isso é importante?
precisa saber é o seguinte
11
@arthurDent - porque a perda de entropia cruzada multi-classe de Keras provavelmente não está preparada para lidar com três classes verdadeiras simultâneas em cada exemplo e a separação em grupos - o erro em um grupo pode resultar em gradientes incorretamente atribuídos às saídas em outros grupos . Você pode tentar e ver o que acontece. . . ainda pode convergir, mas o ponto de equilíbrio pode não ser tão bom quanto ter três redes totalmente separadas.
Neil Slater
11
y^-y
11
o uso de métricas, por exemplo, categorical_accuracye predict_classesmétodos, pode exigir mais reflexão. . .
Neil Slater #
5

É possível apenas implementar sua própria função softmax. Você pode dividir um tensor em peças, depois calcular softmax separadamente por peça e concatenar as peças do tensor:

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 argumento sem eixo concatenar através do último eixo (no nosso caso, eixo = 1).

Em seguida, você pode incluir essa função de ativação em uma camada oculta ou adicioná-la a um gráfico.

Dense(activation=custom_activation)

ou

model.add(Activation(custom_activation))

Você também precisa definir uma nova função de custo.

Primoz
fonte