深度学习案例教程 教案3.4.4手写数字识别测试和评估.docx
(p1)
本节课我们将进行手写数字识别网络模型测试和评估的讲解
在训练完成以后,为了检验模型的训练结果,
可以在测试集上进行验证,
通过不同的估方法来评估。
针对一个分类模型,常见的评估方法是求分类准确率,
它能衡量所有类别预测正确的个数占所有样本的比值。
(p2)
我们来看一下具体的代码实现
在测试阶段,我们通常不需要进行反向传播和梯度更新,
因此使用withtorch.no_grad():来关闭梯度计算,以提高计算效率。
代码中的test_loader是一个包含测试数据的数据加载器,
其中每个数据点都包含一张28*28的手写数字图片和对应的标签。
对于每个测试数据点,代码首先将图片展开成一维向量,
然后将其输入到已经训练好的神经网络模型model中进行前向传播,
得到模型对该图片的预测结果output。
其中output是一个大小为10的张量,
每个元素代表模型对该图片为数字0~9的预测概率。
接下来,代码使用torch.max(output,1)
来从output中获取概率最大的类别,
也就是模型对该图片的预测结果。
其中torch.max函数的第二个参数1表示在横向(第二个)维度上取最大值,
返回的第一个结果是最大值,
第二个结果是最大值的下标,也就是模型对该图片的预测结果。
然后,代码将预测结果predicted和实际标签labels进行比较,
并统计预测正确的数量correct。
(p3)
最后,代码计算准确率correct/total,并将其格式化输出为字符串,打印出来作为测试结果。
(p4)
运行代码后,我们将得到模型在测试机上的准确率
(p5)
除了准确率外,还有很多其他的评价指标可以用来评价分类模型的性能,
例如精确率、召回率、F1值等。
精确率:指模型预测为正例中,真正为正例的比例
公式中得TP表示真正例的数量,FP表示假正例的数量。
(p6)
类似的,
召回率(Recall):指真正为正例中,模型预测为正例的比例
(p7)
有了精确率和召回率
我们还能建立一个更加全面的指标F1值
F1值:综合考虑精确率和召回率,是精确率和召回率的调和平均数。?
(p8)
那么在了解了这些指标的定义后
我们可以将原来的评价进行完善
这段代码是对训练好的神经网络模型进行测试
并计算准确率、精确率、召回率和F1值。
具体来说,代码中首先引入了precision_score、recall_score、f1_score三个函数,
这三个函数分别用来计算精确率、召回率和F1值。
这些函数都来自sklearn.metrics模块,需要先导入该模块才能使用。
接下来,代码使用withtorch.no_grad()来关闭梯度计算,
以提高计算效率。
然后,代码定义了变量correct和total,
分别表示预测正确的数量和测试数据点的总数。
代码还定义了两个空列表true_labels和pred_labels,
用来存储每个数据点的真实标签和预测标签。
接着,代码使用for循环遍历测试数据集中的每个数据点。
对于每个数据点,
代码首先将图片展开成一维向量,
并将其输入到已经训练好的神经网络模型中进行前向传播,得到模型对该图片的预测结果。
然后,代码使用torch.max函数来获取概率最大的类别,
也就是模型对该图片的预测结果,
并将预测结果predicted和实际标签labels进行比较,
统计预测正确的数量correct。
同时,代码将每个数据点的真实标签和预测标签分别添加到true_labels和pred_labels列表中。
(p9)
最后,代码分别使用precision_score、recall_score和f1_score函数来计算精确率、召回率和F1值,
其中true_labels和pred_labels分别表示真实标签和模型预测标签的数组,
参数average用来指定对每个类别的评价方式,常用的有macro和micro两种方式。
(p10)
最终,代码将准确率、精确率、召回率和F1值的评价结果以格式化字符串的形式输出。
(p10)
在进行模型评价时,我们也可以总结出一些注意点
首先是数据集的划分:
在训练和评价模型时,
需要将数据集划分为训练集、验证集和测试集。
其中,训练集用来训练模型,验证集用来调整模型的超参数,
测试集用来评价模型的性能。
需要注意的是,划分数据集时需要尽量保证数据集的均衡性,避免某个类别的数据过多或过少。
另外,在评价指标的选择方面:
评价指标的选择应该根据具体的任务和需求来确定。
例如,在二分类问题中,精确率、召回率和F1值是比较常用的评价指标;
在多分类问题中,准确率、混淆矩阵、分类报告等指标也很常见。
选择合适的评价指标可以更