
混淆矩阵也称误差矩阵是机器学习和深度学习中表示精度评价的一种标准格式常用n行n列的矩阵形式来表示。其列代表的是预测的类别行代表的是实际的类标以一个常见的二分类的混淆矩阵为例。我们会发现二分类的混淆矩阵包括TP, FP, FN, TN其中TP为True PositiveTrue代表实际和预测相同Positive代表预测为正样本。同理可得False Positive (FP)代表的是实际类别和预测类标不同并且预测类别为正样本实际类别为负样本False Negative (FN)代表的是实际类别和预测类标不同并且预测类别为负样本实际类别为正样本True Negative (TP)代表的是实际类别和预测类标相同预测类别和实际类别均为负样本。在这里我们以一个二分类的例子来帮助大家理解。假设我们是某核酸检测机构将对100个人进行核酸检测实际结果为98个阴性2个阳性但是我们的模型对核酸检测结果进行预测预测结果为94个阴性6个阳性结果在这里我们定义核酸结果阴性为正样本核酸结果阳性为负样本。在这个例子中TP代表实际为阴性且被预测为阴性的数量共有94人FP代表实际为阳性模型预测为阴性的数量共有0人FN代表实际为阴性被模型判断为阳性的数量共有4人TN代表实际为阳性被模型识别为阳性的数量共有2人。 于是我们就可以得到下面的这个混淆矩阵。我们在拥有混淆矩阵后可以计算AccuracyPrecisionRecallF1 Score等衡量模型的评价指标。关于混淆矩阵的代码实现我们可以使用sklearn.metrics.confusion_matrix()函数进行计算fromsklearn.metricsimportconfusion_matrixdefcompute_confusion_matrix(labels,pred_labels_list,gt_labels_list):pred_labels_listnp.asarray(pred_labels_list)gt_labels_listnp.assarray(gt_labels_list)matrixconfusion_matrix(test_label_list,pred_label_list,labelslabels)returnmatrixPytorch基础知识张量张量是现代机器学习的基础。它的核心是一个数据容器多数情况下它包含数字有时候它也包含字符串但这种情况比较少。因此可以把它想象成一个数字的水桶。这里有一些存储在各种类型张量的公用数据集类型3维 时间序列4维 图像5维 视频例子一个图像可以用三个字段表示(width, height, channel) 3D但是在机器学习工作中我们经常要处理不止一张图片或一篇文档——我们要处理一个集合。我们可能有10,000张郁金香的图片这意味着我们将用到4D张量(batch_size, width, height, channel) 4D在PyTorch中torch.Tensor是存储和变换数据的主要工具。如果你之前用过NumPy你会发现Tensor和NumPy的多维数组非常类似。然而Tensor 提供GPU计算和自动求梯度等更多功能这些使 Tensor 这一数据类型更加适合深度学习。创建tensor在接下来的内容中我们将介绍几种常见的创建tensor的方法。随机初始化矩阵 我们可以通过torch.rand()的方法构造一个随机初始化的矩阵全0矩阵的构建 我们可以通过torch.zeros() 构造一个矩阵全为0并且通过dtype 设置数据类型为long。除此之外我们还可以通过torch.zero_()和torch.zeros_like()将现有矩阵转换为全0矩阵。张量的构建 我们可以通过torch.tensor()直接使用数据构造一个张量importtorch xtorch.tensor([5.5,3])print(x)基于已经存在的 tensor创建一个 tensor 张量的操作importtorch# 方式1ytorch.rand(4,3)print(xy)# 方式2print(torch.add(x,y))# 方式3 in-place原值修改y.add_(x)print(y)需要注意的是索引出来的结果与原数据共享内存修改一个另一个会跟着修改。如果不想修改可以考虑使用copy()等方法autogradtorch.Tensor 是这个包的核心类。如果设置它的属性 .requires_grad 为 True那么它将会追踪对于该张量的所有操作。当完成计算后可以通过调用 .backward()来自动计算所有的梯度。这个张量的所有梯度将会自动累加到.grad属性。注意在 y.backward() 时如果 y 是标量则不需要为 backward() 传入任何参数否则需要传入一个与 y 同形的Tensor。要阻止一个张量被跟踪历史可以调用.detach()方法将其与计算历史分离并阻止它未来的计算记录被跟踪。为了防止跟踪历史记录(和使用内存可以将代码块包装在 with torch.no_grad(): 中。在评估模型时特别有用因为模型可能具有requires_grad True的可训练的参数但是我们不需要在此过程中对他们进行梯度计算。还有一个类对于autograd的实现非常重要Function。Tensor 和 Function 互相连接生成了一个无环图 (acyclic graph)它编码了完整的计算历史。每个张量都有一个**.grad_fn属性该属性引用了创建 Tensor 自身的Function(除非这个张量是用户手动创建的即这个张量的grad_fn是 None )。下面给出的例子中张量由用户手动创建因此grad_fn返回结果是None**。atorch.randn(2,2)# 缺失情况下默认 requires_grad Falsea((a*3)/(a-1))print(a.requires_grad)a.requires_grad_(True)print(a.requires_grad)b(a*a).sum()print(b.grad_fn)梯度现在开始进行反向传播因为 out 是一个标量因此out.backward()和out.backward(torch.tensor(1.))等价。out.backward()# 输出导数 d(out)/dxprint(x.grad)