在我调试代码时,在后期可能是因为文本处理太多,总是导致过拟合现象,经过查阅资料,发现有很多种处理过拟合的方法
防止过拟合的方法:
(1) 正则化
(2) 数据增强,(这个方法我是根据CNN处理图片的方式,将每一行文本的内容打乱,这样我们的数据集就会增大将近1倍,这里需要注意的是,测试集放的数据在数据集中只有一个,该方法对数据的准确率作用不明显,大约提高1%)
(3)dropout
(4)Early stopping (为避免过拟合提前终止,一般是准确率不在提高了就终止)
(5)集成学习 : 将单个学习器集成在一起,共同完成学习任务。它分为同质学习器和异质学习器
集成学习
同质集成器: 是使用同种类型的学习器,例如“决策树集成”就是他的个体学习器全是决策树
异质集成器 : 就是不同类型的学习器
在这里我把keras中的三个模型融合起来,分别计算不同模型结合起来的错误率,选取结合起来错误率最小的模型。
集成学习结合的策略有3种:(1)平均法 对于若干个弱学习器的输出进行平均得到最终的预测输出。
(2)投票法
(3) 学习法,将训练集弱学习器的学习结果作为输入,将训练集的输出作为输出,重新训练一个学习器来得到最终结果。
由于时间原因,这个代码训练后的准确率并没有输出,因此具体这个方法对增加准确率和避免过拟合是否有用还不确定
def compile_and_train(model, num_epochs):
model.compile(loss="mse", optimizer="adam", metrics=['acc','mae'])
filepath = 'C:/Users\huhu\Desktop\huhu\ceshi/a/' + model.name + '.{epoch:02d}-{loss:.2f}.hdf5'
checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=0, save_weights_only=True,
save_best_only=True, mode='auto', period=1)
tensor_board = TensorBoard(log_dir='C:/Users\huhu\Desktop\huhu\ceshi/a', histogram_freq=0, batch_size=64)
history = model.fit(x=X_train, y=train_y, batch_size=64,
epochs=num_epochs, verbose=1, callbacks=[checkpoint, tensor_board], validation_split=0.2)
return history
def evaluate_error(model):
pred = model.predict(X_test, batch_size = 64)
pred = np.argmax(pred, axis=1)
pred = np.expand_dims(pred, axis=1) # make same shape as y_test
error = np.sum(np.not_equal(pred, test_y)) / test_y.shape[0]
return error
print("evaluate_error(cnn)",evaluate_error(cnn_model))
print("evaluate_error(rnn)",evaluate_error(rnn_model))
print("evaluate_error(cnn_rnn)",evaluate_error(cnnrnn_model))
cnn_model.load_weights('C:/Users\huhu\Desktop\huhu\ceshi/a/cnn.04-0.03.hdf5')
rnn_model.load_weights('C:/Users\huhu\Desktop\huhu\ceshi/a/rnn.06-0.11.hdf5')
cnnrnn_model.load_weights('C:/Users\huhu\Desktop\huhu\ceshi/a/cnn_rnn.05-0.02.hdf5')
models = [cnn_model, rnn_model, cnnrnn_model]
def ensemble(models, model_input):
outputs = [model.outputs[0] for model in models]
y = Average()(outputs)
model = Model(model_input, y, name='ensemble')
return model
ensemble_model = ensemble(models, model_input)
print("evaluate_error(ensemble_model)",evaluate_error(ensemble_model))
# pair_A = [conv_pool_cnn_model, all_cnn_model]
# pair_B = [conv_pool_cnn_model, nin_cnn_model]
# pair_C = [all_cnn_model, nin_cnn_model]
#
# pair_A_ensemble_model = ensemble(pair_A, model_input)
# evaluate_error(pair_A_ensemble_model)