Как реализовать слияние с Keras.layers - PullRequest
0 голосов
/ 28 июня 2018

Я пытался объединить следующие последовательные модели, но не смог. Может ли кто-нибудь указать на мою ошибку, спасибо.

Код компилируется при использовании «слияния», но выдает следующую ошибку «Ошибка типа: объект« модуль »не вызывается» Однако он даже не компилируется при использовании «Merge»

Я использую Keras версии 2.2.0 и 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

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Слой keras.layers.merge устарел. Вместо этого используйте keras.layers.Concatenate(axis=-1), как указано здесь: https://keras.io/layers/merge/#concatenate

0 голосов
/ 09 января 2019

Если честно, я долго боролся с этим вопросом ...

К счастью, я наконец нашла панацею. Для тех, кто хотел бы внести минимальные изменения в свои оригинальные коды с помощью Sequential , вот решение:

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

Для получения дополнительной информации см. https://github.com/keras-team/keras/issues/3921#issuecomment-335457553 для комментария farizrahman4u. ;)

0 голосов
/ 28 июня 2018

Слияние нельзя использовать с последовательной моделью. В последовательной модели слои могут иметь только один вход и один выход. Вы должны использовать функциональный API , что-то вроде этого. Я предположил, что вы используете один и тот же входной слой для modela и modelb, но вы можете создать еще один Input (), если это не так, и предоставить их оба в качестве входных данных для модели.

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
...