web-dev-qa-db-ja.com

Keras.layersからMergeを実装する方法

次のシーケンシャルモデルをマージしようとしましたが、できませんでした。誰かが私の間違いを指摘してください、ありがとうございます。

コードは「merge」の使用中にコンパイルされますが、「TypeError: 'module' object is not callable」というエラーが発生しますが、「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
5
Raj Dayal

Mergeはシーケンシャルモデルでは使用できません。シーケンシャルモデルでは、レイヤーは1つの入力と1つの出力のみを持つことができます。 functional 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
5
Daniel GL

Keras.layers.mergeレイヤーは非推奨です。ここで説明したように、代わりにkeras.layers.Concatenate(axis=-1)を使用します。 https://keras.io/layers/merge/#concatenate

3
Quantum

正直なところ、私はこの問題に長い間苦労していました...

幸いなことに、私は最終的に万能薬が期待されることを発見しました。 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-33545755 for farizrahman4uのコメント。 ;)

1
Castiel Wong