下面是两个深度学习模型的融合代码:
具体需要哪两个模型进行融合需要自己替换成相应的模型层
model1 = Sequential()
#input
model1.add(Dense(32, input_shape=(NUM_FEAT1,1)))
model1.add(Activation("elu"))
model1.add(Dropout(0.5))
model1.add(Dense(16))
model1.add(Activation("elu"))
model1.add(Dropout(0.25))
model1.add(Flatten())
model2 = Sequential()
#input
model2.add(Dense(32, input_shape=(NUM_FEAT1,1)))
model2.add(Activation("elu"))
model2.add(Dropout(0.5))
model2.add(Dense(16))
model2.add(Activation("elu"))
model2.add(Dropout(0.25))
model2.add(Flatten())
merged = Concatenate()([model1.output,model2.output])
z = Dense(128, activation="relu")(merged)
z = Dropout(0.25)(z)
z = Dense(1024, activation="relu")(z)
z = Dense(1, activation="sigmoid")(z)
model = Model(inputs=[model1.input, model2.input], outputs=z)
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit([x_train1,x_train2],y_train, batch_size=100, epochs=100, verbose=2)
例如:
下面是Conv1D和基于Attention机制的LSTM融合的keras结构:
def build_model(input):
model1 = Sequential()
model1.add(Conv1D(filters=24, kernel_size=2, padding='same', activation='relu', kernel_initializer="glorot_uniform",
input_shape=(input[1], input[0])))
model1.add(MaxPooling1D(pool_size=2, padding='valid'))
model1.add(Flatten())
model2 = Sequential()
model2.add(LSTM(64, return_sequences=True, input_shape=(input[1], input[0])))
model2.add(Attention(units=32)) #对比不加attention 加上attention机制的RMSE更低,但是时间会更长一点
model2.add(Dense(32))
model2.add(Flatten())
merged = Concatenate()([model1.output, model2.output])
z = Dense(32)(merged)
z = Dense(1)(z)
model = Model(inputs=[model1.input, model2.input], outputs=z)
model.compile(loss='mae', optimizer='adam', metrics=['mae'])
return model
model = build_model([8,12,1])
print(model.summary()) #查看模型概述
#模型训练
history = model.fit([train_X,train_X], train_y, epochs=100, batch_size=128, validation_data=([test_X,test_X],test_y), verbose=2,
shuffle=False, callbacks=[timecallback()])