• Python实现ANN与KNN的图像分类


    资源下载地址:https://download.csdn.net/download/sheziqiong/85734203
    资源下载地址:https://download.csdn.net/download/sheziqiong/85734203

    基于 ANN 与 KNN 的图像分类

    一、摘要

    模型评判参数

    在介绍模型评判参数之前,首先要定义一些变量。

    混淆矩阵:

    True Positive(真正,TP):将正类预测为正类数

    True Negative(真负,TN):将负类预测为负类数

    False Positive(假正,FP):将负类预测为正类数误报 (Type I error)

    False Negative(假负,FN):将正类预测为负类数 → 漏报 (Type II error)

    准确率:分类正确的比例,其值为分类正确的样本数/样本总数,计算公式为

    准确率:分类正确的比例,其值为分类正确的样本数/样本总数,计算公式为

    错误率:被错分的比例,其值可为 1-准确率,也可通过 error rate = (FP+FN)/(TP+TN+FP+FN)求出。

    灵敏度:正例中被分对的比例,sensitive = TP/P。

    特效度:负例中被分对的比例,specificity = TN/N。

    精确度:被分为正例的示例中实际为正例的比例,P=TP/(TP+FP)。

    召回率:有多少个正例被分为了正例,R=TP/(TP+FN)。

    Macro f1: 指将所有混淆矩阵的 P 和 R 都算出来,求得的平均 P 和 R 求出的 F1.公式为:

    Micro f1: 指将所有混淆矩阵中的数都算出来,求得的平均混淆矩阵计算出来的 P 和 R 计算出来的 F1;

    训练模型准确率:用训练数据求出的准确率;

    测试模型准确率:用测试数据求出的准确率;

    训练时间:指完成一整次训练需要消耗的时间。

    二、ANN 说明

    ● 神经元输入输出的计算方法:假设一个训练样本为

    在这里插入图片描述

    ,对应的输出向量为

    ,l 为类别个数,即输出向量是类别的独热编码。隐藏层第 h 个节点的输入权重为

    ,对应的偏移量为

    在这里插入图片描述

    。第 j 个输出层节点的输入权重为

    ,对应的偏移量为

    在这里插入图片描述

    。q 为隐藏层节点个数。令

    在这里插入图片描述

    为 sigmoid 函数,如图所示,

    在这里插入图片描述

    第 j 个输出神经元的输入为

    在这里插入图片描述

    第 j 个输出神经元的输出为

    在这里插入图片描述

    第 h 个隐层神经元的输入为

    第 h 个隐层神经元的输出为

    ● 训练算法的计算方法:如下图所示,假设一个三类别分类问题,

    在这里插入图片描述

    对一个训练样本

    ,l 为类别个数,设神经网络的输出为

    在这里插入图片描述

    。即

    ,那么网络在输出节点上的均方误差为

    。BP 算法的本质就是梯度下降,在训练神经网络的时候,任意参数的迭代更新公式为:

    在这里插入图片描述

    隐藏层到输出层的权值

    的更新过程如下

    构成了

    影响了

    ,最终

    在这里插入图片描述

    影响了 E,因此由链式法则可知:

    输出层的阈值

    更新如下:

    2.2 ANN 模型参数介绍

    隐藏层层数:指网络中输入层与输出层之间的非线性层数,多个隐藏层可以用于拟合非线性函数。层数越深,理论上拟合函数的能力增强,但可能发生过拟合问题,同时也会增加训练难度,使模型难以收敛。在训练过程中,每个隐藏层中的神经元将前一层的值进行加权线性求和转换

    ,再通过非线性激活函数

    。 输出层接收到的值是最后一个隐藏层的输出经过变换而来的。

    学习率种类:指使用的学习率的步长。学习率(Learning rate)作为监督学习以及深度学习中重要的超参,其决定着目标函数能否收敛到局部最小值以及何时收敛到最小值。合适的学习率能够使目标函数在合适的时间内收敛到局部最小值。

    迭代次数:指迭代运算中循环次数的上限,当循环次数达到这一值时停止训练。一般来说,学习次数越多,学习效果越好,但过多的迭代次数会消耗大量时间,还可能产生过拟合,所以应选用合适的迭代次数。

    窗口大小:指一次训练所选取的样本数。窗口大小影响模型的优化程度和速度。同时其直接影响到 GPU 内存的使用情况。无窗口训练的梯度是准确的,但由于训练速度较慢,只适合小样本的数据;随着窗口的增大,梯度会越来越准确,但梯度非常准确后,再增加窗口大小就无太大意义了。

    单层隐藏层神经元个数:指一个隐藏层中有多少个神经元。神经元太少将导致欠拟合(underfitting),但使用过多的神经元可能导致过拟合,且会增加训练时间。神经元的最佳数量需要经过不断实验来获得。

    激活函数:指神经网络中用于计算输入和偏差的加权和的函数,用于确定神经元是否可以释放。如果不加激活函数,则无论由多少层隐含层,最终结果仍会是原始输入的线性变化,所以 ANN 中每个隐含层都会配一个激活函数,用来提供非线性变化。激活函数具有改善数据学习模式的能力,从而实现了特征检测的自动化,并证明它们在神经网络中的合理性,且对跨领域分类很有帮助。比较常见的几种激活函数由 Sigmoid 函数,Tanh 函数以及 ReLU 函数。

    • Sigmoid 函数:这是一个在生物学中常见的 S 型函数,也称为 S 型生长曲线。在信息科学中,由于其单增以及反函数单增等性质,Sigmoid 函数常被用作神经网络的阈值函数,将变量映射到 0,1 之间。公式如下:

    • Sigmoid 方法图像
    • Tanh 函数:这双曲正切函数,由基本双曲函数双曲正弦和双曲余弦推导而来。公式如下:

    • Tanh 方法图像
    • ReLU 函数:用于隐层神经元输出,公式如下:

    • Relu 方法图像

    2.4 实验结果展示

    我们知道,模型训练的最终终止条件是在我们所设定的迭代次数内,模型的效果呈现收敛趋势,因此,迭代次数过小,模型的效果可能是欠拟合的,迭代次数过多,模型的效果是过拟合且会浪费过多时间,经过试验,我们在训练的过程中,迭代次数在 5000 左右时,拟合效果良好,因此,在以下的分析中,将不再对迭代次数的影响进行讨论。

    因为需要考虑的参数很多,因此我们在对某一种参数进行讨论时,其他变量的参数将取相同的数值。

    2.4.1 隐藏层的层数

    每层固定 50 个,1 层->2 层->3 层

    准确率随隐藏层的变化曲线

    Macro f1 随隐藏层的变化曲线

    Micro f1 随隐藏层的变化曲线

    在这里,我们能够发现当我们的隐藏层层数增加时,模型的效果反而是衰退了。

    AccuracyMacro-F1Micro-F1
    1 层0.96083333333333320.96085373683322610.9608333333333332
    2 层0.90027777777777760.90057207159262640.9002777777777776
    3 层0.85277777777777760.85260589028727110.8527777777777776

    2.4.2 隐藏层神经元节点的个数

    ->200->400
    
    • 1

    准确率随隐藏层神经元节点个数的变化曲线

    Macro f1 随隐藏层神经元节点个数的变化曲线

    Micro f1 随隐藏层神经元节点个数的变化曲线

    我们发现,当隐藏层的神经元节点增加的时候,模型的性能是越来越好的,但其增长的速率是不断变小的。

    AccuracyMacro-F1Micro-F1
    100 个0.96555555555555550.96574146911871940.9655555555555555
    200 个0.98027777777777780.9802921803277840.9802777777777778
    400 个0.98194444444444440.9819513618244270.9819444444444444

    2.4.3 窗口大小

    ->100->150
    
    • 1

    准确率随窗口大小的变化曲线

    Macro f1 随窗口大小的变化曲线

    Micro f1 随窗口大小的变化曲线

    通过图像可以观察到,对于我们的 ANN 模型来说,窗口大小越大,模型的性能越差。

    AccuracyMacro-F1Macro-F1
    500.96083333333333320.96085373683322610.9608333333333332
    1000.95611111111111110.95609759863436350.9561111111111111
    1500.95527777777777770.95550345207671160.9552777777777777

    2.4.4 学习率

    • 随着层数的增加,不同学习率训练时间的变化

    可以观察到,随着层数的不断叠加,各种学习率的训练时间是不断增加的,且 constant 方法的表现是最好的。

    invscalingconstantadaptive
    1 层78.2354796600000177.718893399999877.81292566000047
    2 层80.34567845493889580.023457847845579.64839478932734
    3 层82.6921805000001882.4217154399993982.69385183999984

    随着单层神经元个数的增加,不同学习率训练时间的变化

    可以观察到,随着隐藏层中神经元个数的不断增加,各学习率的其训练时间是不断增加的,其中 invscaling 相对较好。

    invscalingconstantadaptive
    100 个32.0137703399999734.80595449999998434.05963100000008
    200 个52.99512636000008659.61963600000001453.854412799999864
    400 个185.63600004000017188.34518989999992187.09286480000037
    • 随着窗口大小的增加,不同学习率训练时间的变化

    可以观察到,随着 batch_size 的增加,其单次训练时间是呈现出减少的趋势的,其中 constant 的表现最好。

    invscalingconstantadaptive
    5082.6921805000001882.4217154399993982.69385183999984
    10072.5369275200004372.3151233200005773.34816916000128
    15070.8754277599999170.6327091600003770.88269793999935

    在这里,需要对学习率进行说明,每种学习率(这里的学习率是最终一定能使得收敛的)最终到达的终点是相近的,也就是学习率种类对模型的效果影响是不明显的,它影响的是我们到达收敛趋势阈值的快慢程度,也就是我们的训练时间。

    2.5 实验结论

    通过进行 ANN 模型的建立、训练和结果分析,我们发现,使用 ANN 模型进行分类处理,模型的训练数据集的精确度最高可以达到 98.20%,测试数据集的精确度可以达到 95.53%,说明使用 ANN 模型进行此场景的学习过程相对较好,但是要注意选取激活函数和权值优化策略。本例中,最好使用 relu 激活函数和 sgd 权值优化策略,可以获得客观的训练结果和较短的训练时间。

    3.4 实验结果介绍

    这里使用控制变量法:

    控制迭代次数 number=1:

    3.4.1 邻居个数变化

    变量是邻居个数 k_num(range:1->9,step:1)

    AccuracyMacro f1Micro f1
    10.98361111111111110.98365265571457530.9836111111111111
    20.97611111111111120.97624360199805730.9761111111111112
    30.98111111111111120.98123105980845940.9811111111111112
    40.97861111111111110.97882356175042880.9786111111111111
    50.97805555555555560.9783099358529020.9780555555555556
    60.97833333333333340.97854729371255080.9783333333333334
    70.97861111111111110.97882438722822330.9786111111111112
    80.97555555555555550.97581292899676210.9755555555555555
    90.97666666666666670.97692563587591160.9766666666666667

    准确率随邻居个数的变化图像

    Macro f1 随邻居个数的变化图像

    Micro f1 随邻居个数的变化图像

    3.4.2 迭代次数

    变量是迭代次数 number(range:5->9,step:1)

    AccuracyMacro f1Micro f1
    50.98111111111111120.98123105980845940.9811111111111112
    60.98111111111111120.98123105980845940.9811111111111112
    70.9811111111111110.98123105980845950.981111111111111
    80.9811111111111110.98123105980845950.981111111111111
    90.98111111111111120.98123105980845950.9811111111111112

    Macro f1 随迭代次数的变化图像

    Micro f1 随迭代次数的变化图像

    通过图像和表中数据可以明显看出 5 轮迭代之后,模型的效果已经呈现收敛趋势,指标基本一致,可见对于 k_num=3 的情况我们尝试了过多的迭代,浪费时间。接下来数据可以一定程度减少 number,减少过拟合可能和所花时间。

    资源下载地址:https://download.csdn.net/download/sheziqiong/85734203
    资源下载地址:https://download.csdn.net/download/sheziqiong/85734203

  • 相关阅读:
    设计模式之适配器模式
    【Python学习笔记】函数
    大小屏适配
    【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.7 拖放事件
    2024版彩虹晴天全能知识付费源码+虚拟商城解决方案 含一键搭建视频教程 无授权限制
    django开源电子文档管理系统_Django简介、ORM、核心模块
    Java继承的三个特点
    ASP.NET Core
    浅谈 K-D Tree 及其进阶应用
    Python flask怎么连接MySQL?
  • 原文地址:https://blog.csdn.net/sheziqiong/article/details/125406783