Keras Múltiple "Softmax" en la última capa posible?

Respuestas:

7

Yo usaría la interfaz funcional.

Algo como esto:

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
fuente
2
No estoy sugiriendo que agregue la solución, pero creo que dejar la respuesta tal como está da la impresión de que el trabajo de construcción de modelos de OP estaría completo. Pero hay una cantidad adicional de trabajo adicional para que OP realice en otras partes del código si realmente quieren entrenar el modelo. Al menos podría hacer referencia a ese requisito. Lo mismo se aplica a otra respuesta. . .
Neil Slater
1
@NeilSlater tienes toda la razón. No tengo idea de por qué necesito una función de costo diferente. ¿Me puede decir por qué esto es importante?
arthurDent
1
@arthurDent: debido a que la pérdida de entropía cruzada multiclase de Keras probablemente no esté preparada para hacer frente a tres clases verdaderas simultáneas en cada ejemplo, y la separación en grupos, el error en un grupo puede dar como resultado gradientes asignados incorrectamente a salidas en otros grupos . Podrías probarlo y ver qué pasa. . . aún puede converger, pero el punto de equilibrio puede no ser tan bueno como tener tres redes completamente separadas.
Neil Slater
1
y^-y
1
El uso de métricas, por ejemplo, categorical_accuracyy los predict_classesmétodos pueden necesitar más reflexión. . .
Neil Slater
5

Es posible simplemente implementar su propia función softmax. Puede dividir un tensor en partes, luego calcular softmax por separado y concatenar partes del 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 sin argumento de eje concatenado a través del último eje (en nuestro caso axis = 1).

Luego puede incluir esta función de activación en una capa oculta o agregarla a un gráfico.

Dense(activation=custom_activation)

o

model.add(Activation(custom_activation))

También necesita definir una nueva función de costo.

Primoz
fuente