問題

私はkerasで私の最初のアンサンブルモデルを作成しようとしています。私は3つの入力値と私のデータセットに1つの出力値を持っています。

 from keras.optimizers import SGD,Adam
from keras.layers import Dense,Merge
from keras.models import Sequential

model1 = Sequential()
model1.add(Dense(3, input_dim=3, activation='relu'))
model1.add(Dense(2, activation='relu'))
model1.add(Dense(2, activation='tanh'))
model1.compile(loss='mse', optimizer='Adam', metrics=['accuracy'])

model2 = Sequential()
model2.add(Dense(3, input_dim=3, activation='linear'))
model2.add(Dense(4, activation='tanh'))
model2.add(Dense(3, activation='tanh'))
model2.compile(loss='mse', optimizer='SGD', metrics=['accuracy'])

model3 = Sequential()
model3.add(Merge([model1, model2], mode = 'concat'))
model3.add(Dense(1, activation='sigmoid'))
model3.compile(loss='binary_crossentropy', optimizer='Adam', metrics=['accuracy'])

model3.input_shape
 

アンサンブルモデル(Model3)はエラーなしでコンパイルされますが、モデルをフィッティングしている間に同じ入力をmodel3.fit([X,X],y)に2回渡す必要があります。私は不要なステップだと思うし、入力を2回渡すのではなく、アンサンブルモデルの共通の入力ノードを持っていたい。どうしたらいいですか?

  ベストアンサー

Keras 関数API は、計算グラフの柔軟性を向上させるため、ユースケースに適しているようです。例えば。:

 from keras.layers import concatenate
from keras.models import Model
from keras.layers import Input, Merge
from keras.layers.core import Dense
from keras.layers.merge import concatenate

# a single input layer
inputs = Input(shape=(3,))

# model 1
x1 = Dense(3, activation='relu')(inputs)
x1 = Dense(2, activation='relu')(x1)
x1 = Dense(2, activation='tanh')(x1)

# model 2 
x2 = Dense(3, activation='linear')(inputs)
x2 = Dense(4, activation='tanh')(x2)
x2 = Dense(3, activation='tanh')(x2)

# merging models
x3 = concatenate([x1, x2])

# output layer
predictions = Dense(1, activation='sigmoid')(x3)

# generate a model from the layers above
model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# Always a good idea to verify it looks as you expect it to 
# model.summary()

data = [[1,2,3], [1,1,3], [7,8,9], [5,8,10]]
labels = [0,0,1,1]

# The resulting model can be fit with a single input:
model.fit(data, labels, epochs=50)
 

ノート:

  • Kerasバージョン間のAPIにはわずかな違いがあるかもしれません(pre-とpost-version 2)
  • 上記の例では、各モデルに対して異なるオプティマイザと損失関数を指定しています。ただし、fit()は1回だけ(Model3で)呼び出されているため、Model3のものと同じ設定がモデル全体に適用されます。サブモデルをトレーニングするときに異なる設定をするには、別々にfit()する必要があります。 @Daniel のコメントを参照してください。

編集:コメントに基づいて更新されたノート

  同じタグがついた質問を見る

pythonkeraskeras-layerensemble-learning