在本文中,将探讨如何构建一个基于特征提取和分类原理的分类模型。具体来说,首先从图像中提取相关特征,然后利用这些特征向量在机器学习分类器中执行最终的分类任务。将从预训练的ResNet模型中提取特征,并使用这些提取的特征在STL-10数据集上训练一个多类SVM分类器,以此来评估模型的准确性和混淆矩阵以及ROC曲线。
ResNet-50是一种具有50层的卷积神经网络。ImageNet数据库中包含了一个在超过一百万张照片上训练过的预训练版本,该网络能够将图像分类到1000个不同的项目类别中,包括多种动物、键盘、鼠标和铅笔等。
本节将讨论数据集的一些基本信息。STL-10数据集是一个图像识别数据集,可用于开发无监督特征学习、深度学习和自学习算法。数据集中总共有十个类别:飞机、鸟类、汽车、猫、鹿、狗、马、猴子、船和卡车。图像大小为96×96像素,每个类别有500张训练照片(10个预定义的折叠)和800张测试图像。无监督学习包含100000张未标记的图像,这些样本来自一个更大的、外观相似的照片池。除了指定集中的动物和车辆外,还包括各种动物(熊、兔子等)和车辆(火车、公共汽车等)。图像是从ImageNet的标记示例中收集的。
本节将讨论完整的机器学习流程,以对STL-10数据集中的不同类别进行分类。将使用PyTorch框架下载预训练的ResNet50模型,并从最后一个全连接层提取特征来训练多类SVM分类器。数据加载器用于加载训练和测试数据集,然后使用模型和加载的数据提取特征。提取的特征将被可视化,并将训练和测试集中的每张图像输入到前向传播中,保存每个嵌入。然后,将存储的照片输入到预训练的resnet50中,并使用i.requires_grad = False
冻结权重。之后,将加载模型,并使用标准缩放器对训练和测试加载器进行缩放,然后将这两个数据集独立地附加在一起。
将打印出数据集中的一张图像,以可视化手中有哪些类型的图像,以便应用这些算法。
将应用网格搜索CV来找到超参数(C、Gamma和Kernel)的最佳值。可以通过定义一个参数列表,然后使用sklearn中的SVM模型和这些参数来训练,以实现模型的最大性能。
在这里,需要打印出一类与所有其他类别的ROC曲线,这意味着使用的是一对一策略,然后与基线模型进行比较,即通过原点并使x轴和y轴的斜率为45度的线。
已经附加了一些混淆矩阵,用于类别0与所有类别的比较,其中将0类别视为正类,其他所有类别视为不利。但对于其他类别,已经在编码中实现了它,但仅用于结果展示,只展示了一个类别。这些混淆矩阵显示了假阳性、假阴性、真阳性和真阴性的数量。可以通过所有这些值找到整体和类别级别的准确性,并比较结果。
从一个未经微调的默认模型开始,查看其层。然后进行了单层选择性微调。在此过程中,只有传递的层的权重会被修改,而将冻结剩余的层。可以在预训练的模型上进行此操作,如果函数中的层名称与想要微调的层名称匹配,则参数将实际更新。