合肥工业大学(HFUT)2024机器学习大作业

基于CIFAR10图像识别的pycharm代码(经过优化后模型的精准度可以到达80%)

零.具体代码见文末

一、研究背景与意义

图像分类是计算机视觉领域的一个重要课题,它指的是使用算法识别和分类图像中的对象、场景和个体等。深度学习作为一种自动提取图像特征的有效方法,在图像分类中发挥着重要作用。

研究背景和意义

随着信息技术的快速发展,图像数据呈现出爆炸性增长,图像分类识别技术在许多领域都发挥着至关重要的作用,包括但不限于:

医疗影像分析:辅助医生诊断疾病,如癌症、视网膜疾病等。

安全监控:自动识别和追踪视频中的异常行为或物体。

自动驾驶:车辆识别和环境感知,以实现安全驾驶。

智能零售:商品识别和顾客行为分析,优化购物体验。

农业:作物病害检测,提高农业生产效率。

图像分类的研究意义在于:

提高效率:自动分类大量图像,大大减轻人工工作负担。

准确性:深度学习模型能从复杂的数据中提取有效特征,提高分类准确性。

实时性:深度学习模型可以快速处理图像,适用于需要实时反馈的应用场景。

主要研究方法

图像分类的深度学习方法主要基于卷积神经网络(CNN),此外还包括:

迁移学习:利用预训练模型在新领域上进行微调。

集成学习:结合多个模型的预测结果来提高准确性。

数据增强:通过旋转、翻转、缩放等手段增加训练样本多样性。

正则化技术:如权重衰减(L2正则化)和dropout,防止过拟合。

主要存在问题

尽管深度学习在图像分类方面取得了显著进展,但仍面临以下问题:

数据不平衡:不同类别的图像数量可能相差很大,导致模型对某些类别分类不佳。

过拟合:模型可能在训练集上表现很好,但在未见过的数据上表现不佳。

解释性:深度学习模型通常被认为是“黑箱”,难以解释其分类决策。

训练时间:复杂的模型和大量数据可能导致训练时间过长。

现有解决方案

针对上述问题,研究者们提出了多种解决方案:

数据采样和增强:通过欠采样、过采样或使用数据增强来平衡数据集。

正则化和集成学习:使用正则化技术和集成学习方法来减少过拟合。

模型解释性:使用注意力机制、集成解释性方法等技术来提高模型的可解释性。

高效训练策略:采用更优的优化器、学习率调整策略等来加速训练过程。

发展趋势

未来的研究可能集中在以下几个方面:

模型压缩和加速:研究如何减少模型大小,以便在资源受限的设备上部署。

可解释性和透明度:开发新的方法来提高深度学习模型的解释性。

多模态学习:结合多种数据类型(如文本、音频)以提高分类准确性。

自适应学习和泛化:研究模型如何更好地适应新环境和数据。

综上所述,图像分类的深度学习研究具有重要的理论和实际应用价值,它不断推动着计算机视觉和人工智能技术的发展。

二、模型方法

上图为从网络中查询到的适用于CIFAR10的神经网络结构.

  1. 卷积层(Convolutional Layer):使用5x5的卷积核进行特征提取。

在卷积层中每个神经元连接数据窗的权重是固定的,每个神经元只关注一个特性。神经元就是图像处理中的滤波器,比如边缘检测专用的Sobel滤波器,即卷积层的每个滤波器都会有自己所关注一个图像特征,比如垂直边缘,水平边缘,颜色,纹理等等,这些所有神经元加起来就好比就是整张图像的特征提取器集合。

  1. 池化层(Pooling Layer):使用2x2的最大池化操作来减小特征图的大小。

池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。

简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。

  1. 全连接层(Fully Connected Layer):将池化后的特征图展平,并连接到一个全连接层,即上图中绿色的线条,  用于分类处理。

两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的:

4.输出层:得到每个类别的概率分布。

在此基础之上,发现经过50轮迭代更新参数之后,测试集上会出现严重的过拟合现象,故又加以以下的改进.

  1. 增加输入层:原本在使用Pytorch中的datastes模块时,只使用totensor方法将图片转化为tensor形式,如今为了避免过拟合又添加如下操作:

    torchvision.transforms.RandomCrop(32,4), # 先四周填充0,再把图像随机裁剪成32*32

torchvision.transforms.RandomHorizontalFlip(0.5), # 随机水平翻转 选择一个概率概率

  1. 添加非线性激活函数RULE(),为训练集引入更多的非线性特征.

CNN采用的激活函数一般为ReLU(The Rectified Linear Unit/修正线性单元),它的特点是收敛快,求梯度简单,但较脆弱

# 搭建神经网路(优化)

class CF_module(nn.Module):

    def __init__(self, *args, **kwargs) -> None:

        super().__init__(*args, **kwargs)

        self.model1 = Sequential(

            Conv2d(3, 32, 5, padding=2),

            MaxPool2d(2),

            ReLU(True),

           

            Conv2d(32, 32, 5, padding=2),

            MaxPool2d(2),

            ReLU(True),

           

            Conv2d(32, 64, 5, padding=2),

            MaxPool2d(2),

            ReLU(True),

           

            Flatten(),  # 将数据展成一维的(为线性层做准备)

            Linear(1024, 64),

            Linear(64, 10)

        )

    def forward(self, input):

        return self.model1(input)

三、系统设计

1.借助Pytorch的datasets模块直接引入CIFAR10数据集.并在原有的基础上添加:torchvision.transforms.RandomCrop(32,4),torchvision.transforms.RandomHorizontalFlip(0.5). 第一条语句的作用是使用padding填充原有的32*32大小的图片为34*34再把图像随机剪成32*32.第二条语句的作用是对图片进行随机水平翻转.这两条语句的作用就是对训练集进行处理避免过拟合.

2.利用dataloader加载数据集,并将batch_size设置为64,表示一次性处理64张图片,以加快训练模型的速度.

3.根据第三点提到的结果构建神经网络模型

4.实例化网络模型,并引入CrossEntropyLoss()交叉熵函数作为损失函数.Pytorch自带的Adam()优化器作为神经网络的优化器

5.循环50轮训练模型,并使用save()方法保存每一步训练的模型.

6.在循环中,每一轮循环都计算一次损失函数的值,并通过反向传播函数backward()更新参数的梯度.最后使用前一步的定义的优化器,自动更新每一轮的参数.

7.每轮都计算一个test_loss和accuracy作为模型评判优劣的标准.前者是测试集的误差,后者是模型的精确度.最后结合这二者选出循环迭代过程中的最优模型.

五.实验结果分析、对比和讨论

对实验结果进行分析说明,测试一些课程中演示的样例,根据结果说明为什么对或者为什么错等具体分析;对不同模型和参数的对比进行分析;最后对系统提出改进方案等。

经50轮训练后的得到的模型参数的效果如下

发现在未对训练集图像进行变化之前,在第6轮训练时就出现明显的过拟合现象,并且随着训练轮数的增加,accuracy并为得到增加,反而有减小的趋势,经过分析与查阅资料发现模型中缺少非线性激活函数层,导致模型线性参数过多,效果不好.最终引入ReLu()非线性激活函数,效果得到了显著的提升

在模型参数固定以后,从网络中随机下载图片测试模型

模型的labels输出和对应结果如下:

测试结果如下:

经过分析发现在分类cat时误分析为dog,可能得原因是这张图片猫的特征与狗的特征有相似之处.

改进方案:

1.尝试使用更先进的模型架构,如Pre-activation ResNet或者DenseNet。

2.引入正则化技术,如权重衰减(L2正则化)或者dropout,以减少过拟合的风险。

3.使用学习率衰减策略,如学习率预热(learning rate warmup)和步进衰减(step decay)。

4.采用更优的优化器,如AdamW或者RMSprop。

5.使用网格搜索(grid search)、随机搜索(random search)或者贝叶斯优化等方法来寻找最佳的超参数组合。

6.在验证集上评估模型性能,以避免过拟合。

六.其他

CIFAR-10数据集简介

CIFAR-10数据集是一个包含60,000张32x32像素彩色图像的数据集,这些图像属于10个不同的类别。每个类别包含6,000张图像。数据集中的图像涵盖了各种各样的物体,如飞机、汽车、鸟类、猫、鹿、狗、青蛙、马、船和卡车。

CIFAR-10数据集通常用于测试和验证深度学习模型的性能,因为它相对较小,但具有足够的复杂性,可以用于图像分类任务。

CIFAR-10数据集与MNIST数据集二者的区别主要是在以下几点:

·维度不同:CIFAR-10数据集有4个维度,MNIST数据集有3个维度

·图像类型不同:CIFAR-10数据集是RGB图像(有三个通道),MNIST数据集是灰度图像,这也是为什么CIFAR-10数据集比MNIST数据集多出一个维度的原因。

·图像内容不同:CIFAR-10数据集展示的是各种不同的物体(猫、狗、飞机、汽车…),MNIST数据集展示的是不同人的手写0~9数字。

七.对本门课的感想、意见和建议

机器学习是一门多领域交叉学科。他通常用于研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它也是人工智能核心,是使计算机具有智能的根本途径。随着大数据时代各行业对数据分析需求的持续增加,通过机器学习高效地获取知识,已逐渐成为当今机器学习技术发展的主要推动力。

我们作为计算机的学生,学习这门课也充满了动力。这门专业课很好的体现了本专业的特性,这也激发了我的兴趣。机器学习,让我们了解如何构筑基本的网络,让机器,或者说算法了解如何处理问题,这是一个十分迷人的手段。

最后我们真切的希望这门课加一些实际的案例,由老师带领学生做一遍,这样会让我们对模型的了解更加深刻,这是我们认为更有必要的事情。

具体代码见:(随手给星)GitHub - 1StephenCurry1/mechine_learning_teamwork: 合肥工业大学机器学习大作业个人代码

相关推荐

  1. 北京工业大学学报

    2024-07-16 04:16:02       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 04:16:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 04:16:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 04:16:02       58 阅读
  4. Python语言-面向对象

    2024-07-16 04:16:02       69 阅读

热门阅读

  1. Go语言入门之流程控制简述

    2024-07-16 04:16:02       29 阅读
  2. 【ant design of vue】a-range-picker设置月份星期中文

    2024-07-16 04:16:02       24 阅读
  3. 论文分享|RAG理论-第四篇-生成

    2024-07-16 04:16:02       26 阅读
  4. 【filebeat】filebeat字段新增ip地址

    2024-07-16 04:16:02       22 阅读
  5. Linux C++ 052-设计模式之享元模式

    2024-07-16 04:16:02       22 阅读
  6. centos7安装mysql-8.0.38-1.el7.x86_64.rpm-bundle.tar

    2024-07-16 04:16:02       27 阅读
  7. 【动态规划Ⅱ】打家劫舍等一维动态规划

    2024-07-16 04:16:02       21 阅读