web-dev-qa-db-fra.com

Comment implémenter Merge à partir de Keras.layers

J'ai essayé de fusionner les modèles séquentiels suivants, mais je n'y suis pas parvenu. Quelqu'un pourrait-il s'il vous plaît signaler mon erreur, merci.

Le code est compilé en utilisant "merge" mais donne l'erreur suivante "TypeError: l'objet 'module' n'est pas appelable" Cependant, il ne compile même pas en utilisant "Merge"

J'utilise keras version 2.2.0 et python 3.6

from keras.layers import merge
def linear_model_combined(optimizer='Adadelta'):    
    modela = Sequential()
    modela.add(Flatten(input_shape=(100, 34)))
    modela.add(Dense(1024))
    modela.add(Activation('relu'))
    modela.add(Dense(512))

    modelb = Sequential()
    modelb.add(Flatten(input_shape=(100, 34)))
    modelb.add(Dense(1024))
    modelb.add(Activation('relu'))
    modelb.add(Dense(512))

    model_combined = Sequential()

    model_combined.add(Merge([modela, modelb], mode='concat'))

    model_combined.add(Activation('relu'))
    model_combined.add(Dense(256))
    model_combined.add(Activation('relu'))

    model_combined.add(Dense(4))
    model_combined.add(Activation('softmax'))

    model_combined.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])

    return model_combined
2
Raj Dayal

La fusion ne peut pas être utilisée avec un modèle séquentiel. Dans un modèle séquentiel, les couches ne peuvent avoir qu'une entrée et une sortie. Vous devez utiliser l’API fonctionnelle , quelque chose comme ceci. J'ai supposé que vous utilisiez la même couche d'entrée pour modela et modelb, mais vous pouvez créer une autre entrée Input () si ce n'est pas le cas et donner les deux en tant qu'intrants au modèle.

def linear_model_combined(optimizer='Adadelta'):    

    # declare input
    inlayer =Input(shape=(100, 34))
    flatten = Flatten()(inlayer)

    modela = Dense(1024)(flatten)
    modela = Activation('relu')(modela)
    modela = Dense(512)(modela)

    modelb = Dense(1024)(flatten)
    modelb = Activation('relu')(modelb)
    modelb = Dense(512)(modelb)

    model_concat = concatenate([modela, modelb])


    model_concat = Activation('relu')(model_concat)
    model_concat = Dense(256)(model_concat)
    model_concat = Activation('relu')(model_concat)

    model_concat = Dense(4)(model_concat)
    model_concat = Activation('softmax')(model_concat)

    model_combined = Model(inputs=inlayer,outputs=model_concat)

    model_combined.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])

    return model_combined
3
Daniel GL

La couche keras.layers.merge est obsolète. Utilisez plutôt keras.layers.Concatenate(axis=-1) comme mentionné ici: https://keras.io/layers/merge/#concatenate

2
Quantum

Pour être honnête, je luttais depuis longtemps sur cette question ... 

Heureusement, j'ai finalement trouvé la panacée attendue. Pour tous ceux qui souhaitent apporter les modifications minimales à leurs codes d'origine avec Sequential, voici la solution:

def linear_model_combined(optimizer='Adadelta'): 
    from keras.models import Model, Sequential
    from keras.layers.core import Dense, Flatten, Activation, Dropout
    from keras.layers import add

    modela = Sequential()
    modela.add(Flatten(input_shape=(100, 34)))
    modela.add(Dense(1024))
    modela.add(Activation('relu'))
    modela.add(Dense(512))

    modelb = Sequential()
    modelb.add(Flatten(input_shape=(100, 34)))
    modelb.add(Dense(1024))
    modelb.add(Activation('relu'))
    modelb.add(Dense(512))

    merged_output = add([modela.output, modelb.output])   

    model_combined = Sequential()
    model_combined.add(Activation('relu'))
    model_combined.add(Dense(256))
    model_combined.add(Activation('relu'))
    model_combined.add(Dense(4))
    model_combined.add(Activation('softmax'))

    final_model = Model([modela.input, modelb.input], model_combined(merged_output))

    final_model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])

    return final_model

Pour plus d'informations, reportez-vous à https://github.com/keras-team/keras/issues/3921#issuecomment-335457553 pour le commentaire de farizrahman4u. ;)

0
Castiel Wong