用于图像识别的判别图正则化技术
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。
我是Srlua小谢,在这里我会分享我的知识和经验。🎥
希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮
记得先点赞👍后阅读哦~ 👏👏
📘📚 所属专栏:传知代码论文复现
欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙
目录
论文概述
图正则化技术及其优点
参考文献:
算法流程
在标准BLS中嵌入判别图正则化的方法
模型整体架构
代码复现
图拉普拉斯矩阵的构建——generateLmatrix.py文件
顶层文件——GBLS.py文件
数据集介绍
使用步骤
实验结果
环境配置
论文概述
-
需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版:地址
-
宽度学习系统 (BLS) 被提出作为深度学习的一种替代方法。 BLS 的架构是将输入随机映射到一系列形成特征节点的特征空间中,然后将特征节点的输出广泛扩展形成增强节点,然后可以通过分析确定网络的输出权重。 BLS 的最大优势是当出现新的输入数据或神经元节点时,可以增量学习而无需重新训练过程。已经证明 BLS 能够克服基于梯度的深度学习算法中训练大量参数所带来的不足。 在论文中,作者们提出了一种新颖的判别图正则化宽度学习系统 (GBLS)。 考虑到数据的局部不变性属性,这意味着相似的图像可能具有相似的属性,流形学习被纳入到标准 BLS 的目标函数中。 在 GBLS 中,输出权重受到限制以学习更具有辨别信息,分类能力可以进一步增强。 进行了多项实验证明我们提出的 GBLS 模型可以胜过标准 BLS。
在这篇论文中,作者的主要工作是对BLS进行了改进创新,但其中为BLS的目标函数设计的判别图正则化技术在我们了解其原理之后可以应用到各种图像识别领域的模型中去,对于我们进一步改善模型的判别性和提升模型效率有着很大的帮助。
图正则化技术及其优点
随着人工智能技术的持续进步,图学习已经引起了许多研究人员的关注。通常,通过构建图和图匹配,图学习方法获取数据中的拓扑结构和潜在信息。图匹配的目标是找到两个图之间的结构相似性,这可以帮助我们理解复杂的图数据。例如,林一洁等人提出了一种名为对比匹配的动量蒸馏的新方法,可以更好地探索节点之间和边之间的相关性。此外,图构建将原始数据转换为图结构,用于后续的图分析和图学习任务。基于此,彭曦等人通过构建一种名为 L2-图的稀疏相似性图提出了稳健的子空间聚类和子空间学习算法。此外,为了挖掘数据中的潜在信息,研究人员已经将图构建与 BLS 结合起来。通过构建数据的内在图,图正则化广义学习系统(GBLS)在训练过程中考虑了数据的内在关系。根据构建的图,可以将适当的图正则化项嵌入标准 BLS 的目标函数中,从而提高 BLS 的学习能力。
参考文献:
-
Mouxing Yang, Yunfan Li, Peng Hu, Jinfeng Bai, Jiancheng Lv, and Xi Peng. “Robust multi-view clustering with incomplete information.” IEEE Transactions on Pattern Analysis and Machine Intelligence, 45(1): 1055–1069, 2022.
-
Yijie Lin, Mouxing Yang, Jun Yu, Peng Hu, Changqing Zhang, and Xi Peng. “Graph matching with bi-level noisy correspondence.” arXiv preprint arXiv:2212.04085, 2022.
-
Xi Peng, Zhiding Yu, Zhang Yi, and Huajin Tang. “Constructing the l2-graph for robust subspace learning and subspace clustering.” IEEE Transactions on Cybernetics, 47(4): 1053–1066, 2016.
算法流程
在标准BLS中嵌入判别图正则化的方法
首先,假设存在输入数据集{X,Y}{X,Y}。考虑到相同类型的数据来自同一流形空间,不同类型的数据来自不同的流形空间,我们通过(8)构建图V,图VV是相似性矩阵,代表了图顶点之间的关系。
从上面可以看出,GBLS考虑了数据的基本几何结构,而标准BLS忽视了这一点,这是通过在(4)中添加一个常规图项来实现的。因此,输出权重可以受限以学习更具有区分性的信息,进一步增强分类能力。
模型整体架构
接下来我讲解一下,在加入了判别图正则化后,宽度模型的整体架构会如何变化。我将从输入数据开始到最终输出预测结果详细地介绍模型如何处理数据及内部的特征。
如上所述,与标准 BLS 相比,GBLS 添加了图形正则项以考虑数据之间的内在关系,与此同时,GBLS 像 BLS 一样,使用传统的稀疏自编码器来微调获得的特征。具体的实施步骤如下:
具体的算法流程图如下所示:
代码复现
为了完整复现GBLS的算法流程,我使用层次化结构在五个文件中实现了模型的不同侧面。分别是bls2deep_graph.py文件——用于实现模型的整体架构、generateLmatrix.py文件——用于构建图拉普拉斯矩阵、GBLS.py文件——顶层文件用于端到端实现、sparse_bls_autoencoder.py文件——用于稀疏自编码器微调机制的实现、util.py文件——实用方法的集成,下面我将对算法的核心部分generateLmatrix.py文件、bls2deep_graph.py文件和GBLS.py文件分别给出他们的伪代码流程图并进行讲解,具体的代码可见附件。
图拉普拉斯矩阵的构建——generateLmatrix.py文件
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">函数</span> <span style="color:#000000">generateLmatrix</span>(<span style="color:#000000">train_x</span>, <span style="color:#000000">train_y</span>, <span style="color:#000000">opt</span>):
<span style="color:#aa5500"># 获取标签</span>
<span style="color:#000000">gnd</span> <span style="color:#981a1a">=</span> <span style="color:#000000">调用</span> <span style="color:#000000">result_tra</span>(<span style="color:#000000">train_y</span>)
<span style="color:#000000">Label</span> <span style="color:#981a1a">=</span> <span style="color:#000000">获取</span> <span style="color:#000000">gnd</span> <span style="color:#000000">的唯一值</span>
<span style="color:#000000">nLabel</span> <span style="color:#981a1a">=</span> <span style="color:#000000">Label</span> <span style="color:#000000">的数量</span>
<span style="color:#000000">nSmp</span> <span style="color:#981a1a">=</span> <span style="color:#000000">train_x</span> <span style="color:#000000">的行数</span>
<span style="color:#aa5500"># 初始化权重矩阵 A</span>
<span style="color:#000000">A</span> <span style="color:#981a1a">=</span> <span style="color:#000000">创建一个</span> <span style="color:#000000">nSmp</span> <span style="color:#000000">x</span> <span style="color:#000000">nSmp</span> <span style="color:#000000">的零矩阵</span>
<span style="color:#aa5500"># 遍历每个标签</span>
<span style="color:#000000">对于每个标签</span> <span style="color:#000000">Label</span>[<span style="color:#000000">idx</span>]:
<span style="color:#000000">classIdx</span> <span style="color:#981a1a">=</span> <span style="color:#000000">gnd</span> <span style="color:#981a1a">==</span> <span style="color:#000000">Label</span>[<span style="color:#000000">idx</span>]
<span style="color:#000000">设置</span> <span style="color:#000000">A</span> <span style="color:#000000">中</span> <span style="color:#000000">classIdx</span> <span style="color:#000000">对应元素为</span> <span style="color:#116644">1</span> <span style="color:#981a1a">/</span> <span style="color:#000000">classIdx</span> <span style="color:#000000">的和</span>
<span style="color:#aa5500"># 减去 A 的对角线元素</span>
<span style="color:#000000">A</span> <span style="color:#981a1a">=</span> <span style="color:#000000">A</span> <span style="color:#981a1a">-</span> <span style="color:#000000">A</span> <span style="color:#000000">的对角线元素</span>
<span style="color:#aa5500"># 计算度矩阵 D</span>
<span style="color:#000000">D</span> <span style="color:#981a1a">=</span> <span style="color:#000000">A</span> <span style="color:#000000">每行的和</span>
<span style="color:#aa5500"># 计算拉普拉斯矩阵 L</span>
<span style="color:#000000">如果</span> <span style="color:#000000">opt</span>[<span style="color:#aa1111">'NORMALIZE'</span>] <span style="color:#981a1a">==</span> <span style="color:#116644">1</span>:
<span style="color:#000000">D_inv_sqrt</span> <span style="color:#981a1a">=</span> <span style="color:#000000">D</span> <span style="color:#000000">的逆平方根对角矩阵</span>
<span style="color:#000000">L</span> <span style="color:#981a1a">=</span> <span style="color:#000000">单位矩阵</span> <span style="color:#981a1a">-</span> <span style="color:#000000">D_inv_sqrt</span> <span style="color:#981a1a">*</span> <span style="color:#000000">A</span> <span style="color:#981a1a">*</span> <span style="color:#000000">D_inv_sqrt</span>
<span style="color:#000000">否则</span>:
<span style="color:#000000">L</span> <span style="color:#981a1a">=</span> <span style="color:#000000">D</span> <span style="color:#000000">的对角矩阵</span> <span style="color:#981a1a">-</span> <span style="color:#000000">A</span>
<span style="color:#000000">返回</span> <span style="color:#000000">L</span></span></span>
复现模型整体架构——bls2deep_graph.py文件
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">函数</span> <span style="color:#000000">bls2deep_graph</span>(<span style="color:#000000">train_x</span>, <span style="color:#000000">train_y</span>, <span style="color:#000000">test_x</span>, <span style="color:#000000">test_y</span>, <span style="color:#000000">N1</span>, <span style="color:#000000">N2</span>, <span style="color:#000000">N3</span>, <span style="color:#000000">L</span>, <span style="color:#000000">s</span>, <span style="color:#000000">c</span>):
<span style="color:#000000">标准化</span> <span style="color:#000000">train_x</span>
<span style="color:#000000">添加偏置项到</span> <span style="color:#000000">train_x,生成</span> <span style="color:#000000">FeatureOfInputDataWithBias</span>
<span style="color:#000000">初始化</span> <span style="color:#000000">OutputOfFeatureMappingLayer</span> <span style="color:#000000">和相关变量</span>
<span style="color:#000000">记录开始时间</span> <span style="color:#000000">time_start</span>
<span style="color:#000000">对于</span> <span style="color:#000000">i</span> <span style="color:#000000">从</span> <span style="color:#116644">0</span> <span style="color:#000000">到</span> <span style="color:#000000">N2</span><span style="color:#981a1a">-</span><span style="color:#116644">1</span>:
<span style="color:#000000">生成权重矩阵</span> <span style="color:#000000">weightOfEachWindow</span>
<span style="color:#000000">计算特征映射</span> <span style="color:#000000">FeatureOfEachWindow</span>
<span style="color:#000000">缩放特征映射到</span> [<span style="color:#981a1a">-</span><span style="color:#116644">1</span>, <span style="color:#116644">1</span>]
<span style="color:#000000">计算</span> <span style="color:#000000">betaOfEachWindow</span> <span style="color:#000000">并保存</span>
<span style="color:#000000">计算输出</span> <span style="color:#000000">outputOfEachWindow</span> <span style="color:#000000">并缩放,保存到</span> <span style="color:#000000">OutputOfFeatureMappingLayer</span>
<span style="color:#000000">添加偏置项到</span> <span style="color:#000000">OutputOfFeatureMappingLayer,生成</span> <span style="color:#000000">InputOfEnhanceLayerWithBias</span>
<span style="color:#000000">生成增强层权重</span> <span style="color:#000000">weightOfEnhanceLayer</span> <span style="color:#000000">并计算增强层输出</span> <span style="color:#000000">OutputOfEnhanceLayer</span>
<span style="color:#000000">计算伪逆矩阵</span> <span style="color:#000000">pinvOfInput</span> <span style="color:#000000">并计算输出权重</span> <span style="color:#000000">OutputWeight</span>
<span style="color:#000000">记录结束时间</span> <span style="color:#000000">time_end,计算训练时间</span> <span style="color:#000000">trainTime</span>
<span style="color:#000000">计算训练集上的输出</span> <span style="color:#000000">OutputOfTrain</span> <span style="color:#000000">和准确率</span> <span style="color:#000000">trainAcc</span>
<span style="color:#000000">标准化</span> <span style="color:#000000">test_x</span> <span style="color:#000000">并添加偏置项,生成</span> <span style="color:#000000">FeatureOfInputDataWithBiasTest</span>
<span style="color:#000000">初始化</span> <span style="color:#000000">OutputOfFeatureMappingLayerTest</span>
<span style="color:#000000">记录开始时间</span> <span style="color:#000000">time_start</span>
<span style="color:#000000">对于</span> <span style="color:#000000">i</span> <span style="color:#000000">从</span> <span style="color:#116644">0</span> <span style="color:#000000">到</span> <span style="color:#000000">N2</span><span style="color:#981a1a">-</span><span style="color:#116644">1</span>:
<span style="color:#000000">计算每个窗口的测试输出</span> <span style="color:#000000">outputOfEachWindowTest</span> <span style="color:#000000">并缩放,保存到</span> <span style="color:#000000">OutputOfFeatureMappingLayerTest</span>
<span style="color:#000000">添加偏置项到</span> <span style="color:#000000">OutputOfFeatureMappingLayerTest,生成</span> <span style="color:#000000">InputOfEnhanceLayerWithBiasTest</span>
<span style="color:#000000">计算增强层测试输出</span> <span style="color:#000000">OutputOfEnhanceLayerTest</span>
<span style="color:#000000">拼接生成</span> <span style="color:#000000">InputOfOutputLayerTest,计算测试集上的输出</span> <span style="color:#000000">OutputOfTest</span>
<span style="color:#000000">记录结束时间</span> <span style="color:#000000">time_end,计算测试时间</span> <span style="color:#000000">testTime</span> <span style="color:#000000">和测试集上的准确率</span> <span style="color:#000000">testAcc</span>
<span style="color:#000000">返回</span> <span style="color:#000000">testAcc</span> <span style="color:#000000">和</span> <span style="color:#000000">trainAcc</span></span></span>
这段代码的功能主要是实现了GBLS的训练和测试过程。首先对输入数据进行预处理,然后通过特征映射层和增强层对数据进行特征提取和增强。特征映射层通过多个随机权重窗口来生成特征,而增强层则使用正交随机权重进行特征增强。随后,代码计算输出权重并通过伪逆矩阵求解。最后,代码对训练和测试数据分别计算输出并评估准确率。整个过程包括数据预处理、特征映射、增强层训练、输出层训练和测试阶段。
顶层文件——GBLS.py文件
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">函数</span> <span style="color:#000000">preprocess_data</span>():
<span style="color:#000000">加载并预处理数据</span>
<span style="color:#000000">返回</span> <span style="color:#000000">train_x</span>, <span style="color:#000000">test_x</span>, <span style="color:#000000">train_y</span>, <span style="color:#000000">test_y</span>
<span style="color:#aa5500">#加载数据:</span>
<span style="color:#000000">调用</span> <span style="color:#000000">preprocess_data</span> <span style="color:#000000">函数,获取</span> <span style="color:#000000">train_x</span>, <span style="color:#000000">test_x</span>, <span style="color:#000000">train_y</span>, <span style="color:#000000">test_y</span>
<span style="color:#000000">检查</span> <span style="color:#000000">train_x</span> <span style="color:#000000">中是否有无穷大或</span> <span style="color:#000000">NaN</span> <span style="color:#000000">值</span>
<span style="color:#aa5500">#处理测试集:</span>
<span style="color:#000000">随机排列</span> <span style="color:#000000">test_x</span> <span style="color:#000000">的行顺序</span>
<span style="color:#000000">设置</span> <span style="color:#000000">opt</span> <span style="color:#000000">字典,NORMALIZE</span> <span style="color:#000000">为</span> <span style="color:#116644">1</span>
<span style="color:#000000">打印</span> <span style="color:#000000">train_x</span>, <span style="color:#000000">train_y</span>, <span style="color:#000000">test_x</span>, <span style="color:#000000">test_y</span> <span style="color:#000000">的形状</span>
<span style="color:#aa5500">#生成拉普拉斯矩阵:</span>
<span style="color:#000000">调用</span> <span style="color:#000000">generateLmatrix</span> <span style="color:#000000">函数,传入</span> <span style="color:#000000">train_x</span>, <span style="color:#000000">train_y</span>, <span style="color:#000000">opt,得到</span> <span style="color:#000000">L</span>
<span style="color:#000000">打印</span> <span style="color:#000000">L</span> <span style="color:#000000">的形状</span>
<span style="color:#aa5500">#设置参数:</span>
<span style="color:#000000">C</span> <span style="color:#981a1a">=</span> <span style="color:#116644">2</span> <span style="color:#981a1a">**</span> <span style="color:#981a1a">-</span><span style="color:#116644">30</span>
<span style="color:#000000">s</span> <span style="color:#981a1a">=</span> <span style="color:#116644">0.8</span>
<span style="color:#000000">par</span> <span style="color:#000000">字典,包含</span> <span style="color:#000000">lambdaG</span>, <span style="color:#000000">C</span>, <span style="color:#000000">s</span>, <span style="color:#000000">NumLayer</span>, <span style="color:#3300aa">range</span>, <span style="color:#000000">randstate</span>, <span style="color:#000000">ActFun</span>
<span style="color:#aa5500">#设置模型参数:</span>
<span style="color:#000000">NumWin</span> <span style="color:#981a1a">=</span> <span style="color:#116644">10</span>
<span style="color:#000000">NumWinNode</span> <span style="color:#981a1a">=</span> <span style="color:#116644">20</span>
<span style="color:#000000">NumHid</span> <span style="color:#981a1a">=</span> <span style="color:#116644">100</span>
<span style="color:#aa5500">#训练和测试模型:</span>
<span style="color:#000000">调用</span> <span style="color:#000000">bls2deep_graph</span> <span style="color:#000000">函数,传入</span> <span style="color:#000000">train_x</span>, <span style="color:#000000">train_y</span>, <span style="color:#000000">test_x</span>, <span style="color:#000000">test_y</span>, <span style="color:#000000">NumWin</span>, <span style="color:#000000">NumWinNode</span>, <span style="color:#000000">NumHid</span>, <span style="color:#000000">L</span>, <span style="color:#000000">s</span>, <span style="color:#000000">C</span>
<span style="color:#000000">获取并返回训练和测试准确率</span> <span style="color:#000000">trAcc</span>, <span style="color:#000000">ttAcc</span></span></span>
示例:公开数据集训练——MNIST、ORL 在这里,我将展示如何将复现好的代码应用在公开数据集上进行训练和测试。由于在论文中,判别图正则化技术已经被验证在图像识别领域会给模型带来显著的效果提升,因此在这里我们使用了MNIST数据集和ORL人脸识别数据集来进行实验,看看复现代码的效果如何。
数据集介绍
MNIST手写数字识别数据集是目前最经典的图像识别数据集,其中包括70000张图片样本,其中60000张作为训练集,10000张作为测试集。 ORL(Olivetti Research Laboratory)人脸识别数据集由剑桥大学计算机实验室的Olivetti研究实验室于1992年创建,包含40个人的面部图像,图像尺寸为92x112像素,灰度图像。每个人的图像在时间上有不同间隔,包含不同的光照条件、面部表情和细微变化,图像格式为PGM,按照人物ID分类存储。该数据集广泛用于人脸识别算法的训练和测试,评估算法性能。常见使用方式包括将数据集分为训练集和测试集,挑战在于图像中的姿态、光照和表情变化较大,对算法的鲁棒性和泛化能力提出了高要求。其中又可以细化为ORL5、ORL6数据集 UMIST (University of Manchester Institute of Science and Technology) 数据集是一个广泛用于人脸识别和计算机视觉研究的经典人脸图像数据集,包含来自20个人的575张人脸灰度图像,分辨率为112 x 92像素。这些图像涵盖了不同的姿态变化,包括从左侧面到右侧面的各种角度和表情,每个人的图像都保存在单独的文件夹中,并以人的身份标识符命名。UMIST数据集常用于训练和测试人脸识别算法,如PCA、LDA、SVM等,也用于姿态估计和机器学习、模式识别研究,作为基准数据集。这些图像背景统一,减少了背景干扰对识别结果的影响。可以通过相关研究机构或数据集存储库获取UMIST数据集,用于人脸识别和计算机视觉领域的研究。
使用步骤
首先我们需要获取想要使用的公开数据集,最好放在项目目录中,在这里我已经将这两份数据集打包放在了附件文件包中,大家也可以前往数据集官网进行下载:MNIST;ORL;UMIST
在获取到数据集之后我们需要进去顶层文件GBLS.py中将所要使用的数据加载到内存环境中并进行预处理,在这里我已经为大家写好了对这两份数据集的加载以及预处理方法,大家可以将对应的代码取消注释便可以使用。 接下来运行代码便可以进行模型的训练和测试,最后我们需要输出对模型预测的评价指标,常见的对分类任务的评价指标有准确度,F1分数和查准率等,在这里我已经在bls2deep_graph.py的show_accuracy函数中为大家实现了一些通用的评价指标,大家也可以根据自己的需要编写更对的评价指标计算方法对模型进行更多方面的评估。
实验结果
在原论文中,作者将GBLS模型在多个图像识别数据集上进行了实验以验证了他们算法的有效性,因此,我在同样的的三种经典图像识别数据集上进行了多次实验,一是向大家介绍该如何使用这份代码,二是验证了这份代码的可靠性。实验结果如下图所示:
可以看到搭建的模型在三份数据集上都能取得不错而且稳定的效果,在粗略的手调情况下,在三份数据集上的各项指标都能达到90%以上,在UMIST数据集上的效果甚至已经达到原论文数值。同时,可以看到我们在一定范围内调节网络的节点数模型的分类效果保持稳定,在网络结构拓宽时分类性能稳步提升,这说明了搭建的模型学习能力不会出现剧烈抖动,我们可以通过网格搜索来进一步寻找到能让模型收敛的最优参数。
环境配置
-
python版本3.6及以上,操作系统可使用Windows、MacOs、Linux
-
安装第三方库:scipy、sklearn、mat73、time
希望对你有帮助!加油!
若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!