Saltar al contenido

Salidas binarias múltiples de Keras

Ya no necesitas buscar más por internet ya que has llegado al espacio correcto, poseemos la respuesta que necesitas recibir sin liarte.

Solución:

Para optimizar múltiples problemas de clasificación binaria independientes (y no un problema de categoría múltiple donde puede usar categorical_crossentropy) usando Keras, puede hacer lo siguiente (aquí tomo el ejemplo de 2 salidas binarias independientes, pero puede extenderlo tanto como sea necesario) :

    inputs = Input(shape=(input_shape,))
    hidden = Dense(2048, activation='relu')(inputs)
    hidden = Dense(2048, activation='relu')(hidden)
    output = Dense(units = 2, activation='sigmoid')(hidden )

aquí divide su salida usando la capa Lambda de Keras:

    output_1 = Lambda(lambda x: x[...,:1])(output)
    output_2 = Lambda(lambda x: x[...,1:])(output)

    adad = optimizers.Adadelta()

la salida de su modelo se convierte en una lista de las diferentes salidas independientes

    model = Model(inputs, [output_1, output_2])

compilas el modelo usando una función de pérdida para cada salida, en una lista. (De hecho, si proporciona solo un tipo de función de pérdida, creo que se aplicará a todas las salidas de forma independiente)

    model.compile(optimizer=adad, loss=['binary_crossentropy','binary_crossentropy'])

Sé que esta es una pregunta antigua, pero creo que la respuesta aceptada es incorrecta y la respuesta más votada es viable pero no óptima. El método del cartel original es la forma correcta de resolver este problema. Su salida es de 200 probabilidades independientes de 0 a 1, por lo que su capa de salida debe ser una capa densa con 200 neuronas y una capa de activación sigmoidea. No es un problema de categorical_crossentropy porque no son 200 categorías mutuamente excluyentes. Además, no hay razón para dividir la salida usando una capa lambda cuando basta con una sola capa densa. El método del cartel original es correcto. Aquí hay otra forma de hacerlo usando la interfaz de Keras.

        model = Sequential()
        model.add(Dense(2048, input_dim=n_input, activation='relu'))
        model.add(Dense(2048, input_dim=n_input, activation='relu'))
        model.add(Dense(200, activation='sigmoid'))
        model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

Te mostramos reseñas y valoraciones

Si te gusta la invitación, tienes la opción de dejar una noticia acerca de qué te ha impresionado de esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *