目标

在用训练数据训练完网络模型后,我们想要知道模型对其他数据的真实准确度,而训练数据则存在信息泄露的问题,所以我们现在需要一个独立的数据验证集来对模型泛化能力进行验证。

Keras中常用于模型评估的方法参数包含:validation_split、validation_data、model.evaluate(...)

一、自动切分验证集用于验证

在Keras中,可以从数据集中切分出一部分作为验证集,并且在每次迭代(epoch)时在验证集中评估模型的性能.具体地,调用model.fit()训练模型时,可通过validation_split参数来指定从数据集中切分出验证集的比例.

比如我们有100条数据,想取出其中前80条数据作为训练集,剩余的后20条数据作为验证集,则只用设置validation_split=0.2即可,程序会根据比例自动切分数据。

validation_split: 0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集。验证集将不参与训练,并在每个epoch结束后测试的模型的指标,如损失函数、精确度等。

history = model.fit(trainx, trainy, callbacks=[earlyStop], epochs=300, batch_size=batch_size, validation_split=0.2, verbose=1, shuffle=True) 

注意,validation_split的划分在shuffle之前,因此如果你的数据本身是有序的,需要先手工打乱再指定validation_split,否则可能会出现验证集样本不均匀。 

二、手动切分验证集用于验证

Keras允许在训练模型的时候手动指定验证集.

validation_data:可人为的将数据集进行切分,然后在keras的model.fit()的时候通过validation_data参数指定前面切分出来的验证集。用validation_data=(testx, testy)形式的参数赋值给fit函数即可。

history = model.fit(trainx, trainy, callbacks=[earlyStop], epochs=300, batch_size=batch_size, validation_data=(testx, testy), verbose=1, shuffle=True) 

fit函数中不论是设置了validation_split还是validation_data,这部分用于validation的数据并不会被用来调整参数,不会被用于更新权重。不然的话观测到的效果就不真实了,就像是拿test data来做training一样,会过拟合。如果同时设置validation_split和validation_data两个参数,则validation_data会覆盖validation_split.

对于validation data来说,主要就是为了防止过拟合。比如说在训练过程中,查看模型在validation data上的accuracy,如果训练了10轮,发现accuracy都没提高,我们就可以及时停止训练,这个技巧被称为Early stopping,可以防止模型过度训练。
相关链接:keras中EarlyStopping(早停止)的用法和原理详解_日拱一卒-CSDN博客

 在训练模型中加入验证集之后,每训练完一个轮次后,就会多输出一部分验证集的数据信息,如下图:

三、使用model.evaluate验证模型准确度

输入数据和标签,输出损失和精确度.

scores = model.evaluate(testx, testy, verbose=1)
print(model.metrics_names)
print('test loss',scores[0])
print('test accuracy',scores[1])

model.evaluate(...) 的输出结果如下:

[0.6255261898040771, 0.75]

数组中这两个值分别是什么意思,我们可以用print(model.metrics_names)来观察一下,打印出的结果如下:

['loss', 'accuracy']

因此可知evaluate的输出结果是验证集的损失值和准确率,那么说明我们模型的损失值是0.6255261898040771,准确率是0.75.

四、model.predict

在对模型使用验证集测试过之后,就可以开始用predict正式预测了,调用方法如下

model.predict(testx, verbose=0)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐