用于图像识别的判别图正则化技术

🏡作者主页:点击! 

🤖编程探索专栏:点击!

⏰️创作时间:2024年11月8日13点32分

点击开启你的论文编程之旅icon-default.png?t=O83Ahttps://www.aspiringcode.com/content?id=17210272021224&uid=64a84f9640714755ab1c224ec0f3c235

论文概述

        宽度学习系统 (BLS) 被提出作为深度学习的一种替代方法。 BLS 的架构是将输入随机映射到一系列形成特征节点的特征空间中,然后将特征节点的输出广泛扩展形成增强节点,然后可以通过分析确定网络的输出权重。 BLS 的最大优势是当出现新的输入数据或神经元节点时,可以增量学习而无需重新训练过程。已经证明 BLS 能够克服基于梯度的深度学习算法中训练大量参数所带来的不足。 在论文中,作者们提出了一种新颖的判别图正则化宽度学习系统 (GBLS)。 考虑到数据的局部不变性属性,这意味着相似的图像可能具有相似的属性,流形学习被纳入到标准 BLS 的目标函数中。 在 GBLS 中,输出权重受到限制以学习更具有辨别信息,分类能力可以进一步增强。 进行了多项实验证明我们提出的 GBLS 模型可以胜过标准 BLS。

        在这篇论文中,作者的主要工作是对BLS进行了改进创新,但其中为BLS的目标函数设计的判别图正则化技术在我们了解其原理之后可以应用到各种图像识别领域的模型中去,对于我们进一步改善模型的判别性和提升模型效率有着很大的帮助。

图正则化技术及其优点

        随着人工智能技术的持续进步,图学习已经引起了许多研究人员的关注。通常,通过构建图和图匹配,图学习方法获取数据中的拓扑结构和潜在信息。图匹配的目标是找到两个图之间的结构相似性,这可以帮助我们理解复杂的图数据。例如,林一洁等人提出了一种名为对比匹配的动量蒸馏的新方法,可以更好地探索节点之间和边之间的相关性。此外,图构建将原始数据转换为图结构,用于后续的图分析和图学习任务。基于此,彭曦等人通过构建一种名为 L2-图的稀疏相似性图提出了稳健的子空间聚类和子空间学习算法。此外,为了挖掘数据中的潜在信息,研究人员已经将图构建与 BLS 结合起来。通过构建数据的内在图,图正则化广义学习系统(GBLS)在训练过程中考虑了数据的内在关系。根据构建的图,可以将适当的图正则化项嵌入标准 BLS 的目标函数中,从而提高 BLS 的学习能力。

参考文献:
1. 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.
2. 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.
3. 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}。考虑到相同类型的数据来自同一流形空间,不同类型的数据来自不同的流形空间,我们通过(8)构建图V,图V是相似性矩阵,代表了图顶点之间的关系。

        其中 Nt 代表 t 类样本的数量,l (⋅) 代表样本的标签。通过这种方式,我们能够考虑数据的流形结构。我们可以利用图 V 获取图正则项 EG

        其中 yiyi,yjyj 分别代表 xixi 和 xjxj 的预测值,LG 则是图拉普拉斯矩阵,关于宽度学习系统,我在前面提到过输入数据将被映射成一次和二次特征,我们叫做特征节点和增强节点,在这里为了得到图正则项,我们需要根据这部分节点层得到一个先验的预测结果Y^, 计算方法可通过公式 (3) , W 是随机初始化的权重矩阵。

接下来获得图正则化项 LG 后,我们可以更新原始BLS的目标函数 (4) 得到新的目标函数 (5)。

通过上述公式计算 W 的偏导数,并最终可以通过公式(6)计算 W :

从上面可以看出,GBLS考虑了数据的基本几何结构,而标准BLS忽视了这一点,这是通过在(4)中添加一个常规图项来实现的。因此,输出权重可以受限以学习更具有区分性的信息,进一步增强分类能力。

模型整体架构

接下来我讲解一下,在加入了判别图正则化后,宽度模型的整体架构会如何变化。我将从输入数据开始到最终输出预测结果详细地介绍模型如何处理数据及内部的特征。

如上所述,与标准 BLS 相比,GBLS 添加了图形正则项以考虑数据之间的内在关系,与此同时,GBLS 像 BLS 一样,使用传统的稀疏自编码器来微调获得的特征。具体的实施步骤如下:

给定数据集 {X,Y},我们首先随机生成一个权重矩阵 W,将XX 转换为映射特征节点 Z,然后通过稀疏自编码器算法 fSA(X,Z) 获得所需的权重 W^T。通过 W^T,我们可以将原始数据 X 转换为我们想要的 n 组映射特征节点层 Z

具体的算法流程图如下所示:

代码复现

为了完整复现GBLS的算法流程,我使用层次化结构在五个文件中实现了模型的不同侧面。分别是bls2deep_graph.py文件——用于实现模型的整体架构、generateLmatrix.py文件——用于构建图拉普拉斯矩阵、GBLS.py文件——顶层文件用于端到端实现、sparse_bls_autoencoder.py文件——用于稀疏自编码器微调机制的实现、util.py文件——实用方法的集成,下面我将对算法的核心部分generateLmatrix.py文件、bls2deep_graph.py文件和GBLS.py文件分别给出他们的伪代码流程图并进行讲解,具体的代码可见附件。

图拉普拉斯矩阵的构建——generateLmatrix.py文件

函数 generateLmatrix(train_x, train_y, opt):# 获取标签gnd = 调用 result_tra(train_y)Label = 获取 gnd 的唯一值nLabel = Label 的数量nSmp = train_x 的行数# 初始化权重矩阵 AA = 创建一个 nSmp x nSmp 的零矩阵# 遍历每个标签对于每个标签 Label[idx]:classIdx = gnd == Label[idx]设置 A 中 classIdx 对应元素为 1 / classIdx 的和# 减去 A 的对角线元素A = A - A 的对角线元素# 计算度矩阵 DD = A 每行的和# 计算拉普拉斯矩阵 L如果 opt['NORMALIZE'] == 1:D_inv_sqrt = D 的逆平方根对角矩阵L = 单位矩阵 - D_inv_sqrt * A * D_inv_sqrt否则:L = D 的对角矩阵 - A返回 L

这段代码的主要功能是生成一个拉普拉斯矩阵,该矩阵常用于图形或网络分析中,帮助理解数据之间的关系。首先通过 result_tra 函数获取标签 gnd 并通过 np.unique 获取唯一标签 Label。然后创建一个大小为 nSmp x nSmp 的零矩阵 A,其中 nSmp 是样本数。接下来,遍历每个唯一标签 Label[idx],找到属于当前标签的样本索引 classIdx,并将权重矩阵 A 中对应于 classIdx 的元素设为 1 / 当前标签的样本数。随后,将权重矩阵 A 的对角线元素置为零。计算度矩阵 DD 是权重矩阵 A 每行元素的和。如果选项 opt['NORMALIZE'] 为 1,则计算归一化拉普拉斯矩阵 L,否则计算非归一化拉普拉斯矩阵 L,最后返回计算好的拉普拉斯矩阵 L

复现模型整体架构——bls2deep_graph.py文件

函数 bls2deep_graph(train_x, train_y, test_x, test_y, N1, N2, N3, L, s, c):标准化 train_x添加偏置项到 train_x,生成 FeatureOfInputDataWithBias初始化 OutputOfFeatureMappingLayer 和相关变量记录开始时间 time_start对于 i 从 0 到 N2-1:生成权重矩阵 weightOfEachWindow计算特征映射 FeatureOfEachWindow缩放特征映射到 [-1, 1]计算 betaOfEachWindow 并保存计算输出 outputOfEachWindow 并缩放,保存到 OutputOfFeatureMappingLayer添加偏置项到 OutputOfFeatureMappingLayer,生成 InputOfEnhanceLayerWithBias生成增强层权重 weightOfEnhanceLayer 并计算增强层输出 OutputOfEnhanceLayer计算伪逆矩阵 pinvOfInput 并计算输出权重 OutputWeight记录结束时间 time_end,计算训练时间 trainTime计算训练集上的输出 OutputOfTrain 和准确率 trainAcc标准化 test_x 并添加偏置项,生成 FeatureOfInputDataWithBiasTest初始化 OutputOfFeatureMappingLayerTest记录开始时间 time_start对于 i 从 0 到 N2-1:计算每个窗口的测试输出 outputOfEachWindowTest 并缩放,保存到 OutputOfFeatureMappingLayerTest添加偏置项到 OutputOfFeatureMappingLayerTest,生成 InputOfEnhanceLayerWithBiasTest计算增强层测试输出 OutputOfEnhanceLayerTest拼接生成 InputOfOutputLayerTest,计算测试集上的输出 OutputOfTest记录结束时间 time_end,计算测试时间 testTime 和测试集上的准确率 testAcc返回 testAcc 和 trainAcc

这段代码的功能主要是实现了GBLS的训练和测试过程。首先对输入数据进行预处理,然后通过特征映射层和增强层对数据进行特征提取和增强。特征映射层通过多个随机权重窗口来生成特征,而增强层则使用正交随机权重进行特征增强。随后,代码计算输出权重并通过伪逆矩阵求解。最后,代码对训练和测试数据分别计算输出并评估准确率。整个过程包括数据预处理、特征映射、增强层训练、输出层训练和测试阶段。

顶层文件——GBLS.py文件

函数 preprocess_data():加载并预处理数据返回 train_x, test_x, train_y, test_y#加载数据:调用 preprocess_data 函数,获取 train_x, test_x, train_y, test_y检查 train_x 中是否有无穷大或 NaN 值#处理测试集:随机排列 test_x 的行顺序设置 opt 字典,NORMALIZE 为 1打印 train_x, train_y, test_x, test_y 的形状#生成拉普拉斯矩阵:调用 generateLmatrix 函数,传入 train_x, train_y, opt,得到 L打印 L 的形状#设置参数:C = 2 ** -30s = 0.8par 字典,包含 lambdaG, C, s, NumLayer, range, randstate, ActFun#设置模型参数:NumWin = 10NumWinNode = 20NumHid = 100#训练和测试模型:调用 bls2deep_graph 函数,传入 train_x, train_y, test_x, test_y, NumWin, NumWinNode, NumHid, L, s, C获取并返回训练和测试准确率 trAcc, ttAcc

这段代码的功能是实现数据预处理、生成拉普拉斯矩阵并训练和测试GBLS模型。首先,通过定义 preprocess_data 函数加载并返回训练和测试数据,从 ./ORL/ORL7.mat 文件中加载训练数据 train_x、测试数据 test_x、训练标签 train_y 和测试标签 test_y,然后调用 check_inf_nan 函数检查数据中是否有无穷大或 NaN 值。接着,调用 generateLmatrix 函数,基于训练数据和标签生成拉普拉斯矩阵 L,并打印生成的拉普拉斯矩阵的形状。之后,定义模型的超参数,包括正则化参数 C、收缩参数 s 以及其他参数 parNumWin 表示窗口数量,NumWinNode 表示每个窗口的节点数量,NumHid 表示隐藏层节点数量。最后,调用 bls2deep_graph 函数,传入训练和测试数据、拉普拉斯矩阵和其他超参数,训练并测试基于 BLS 的模型,最终输出训练准确率 trAcc 和测试准确率 ttAcc。总结来说,这段代码的主要功能是加载和预处理数据,生成拉普拉斯矩阵,并使用深度广度学习系统(BLS)进行模型训练和测试,最终输出训练和测试的准确率。

示例:公开数据集训练——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数据集,用于人脸识别和计算机视觉领域的研究。

使用步骤

1.首先我们需要获取想要使用的公开数据集,最好放在项目目录中,在这里我已经将这两份数据集打包放在了附件文件包中,大家也可以前往数据集官网进行下载:MNIST;ORL;UMIST

2.在获取到数据集之后我们需要进去顶层文件GBLS.py中将所要使用的数据加载到内存环境中并进行预处理,在这里我已经为大家写好了对这两份数据集的加载以及预处理方法,大家可以将对应的代码取消注释便可以使用。

3.接下来运行代码便可以进行模型的训练和测试,最后我们需要输出对模型预测的评价指标,常见的对分类任务的评价指标有准确度,F1分数和查准率等,在这里我已经在bls2deep_graph.py的show_accuracy函数中为大家实现了一些通用的评价指标,大家也可以根据自己的需要编写更对的评价指标计算方法对模型进行更多方面的评估。

4.得到输出结果,这里以ORL6数据集为例,调整模型节点数为10,200,100

实验结果

在原论文中,作者将GBLS模型在多个图像识别数据集上进行了实验以验证了他们算法的有效性,因此,我在同样的的三种经典图像识别数据集上进行了多次实验,一是向大家介绍该如何使用这份代码,二是验证了这份代码的可靠性。实验结果如下图所示:

可以看到搭建的模型在三份数据集上都能取得不错而且稳定的效果,在粗略的手调情况下,在三份数据集上的各项指标都能达到90%以上,在UMIST数据集上的效果甚至已经达到原论文数值。同时,可以看到我们在一定范围内调节网络的节点数模型的分类效果保持稳定,在网络结构拓宽时分类性能稳步提升,这说明了搭建的模型学习能力不会出现剧烈抖动,我们可以通过网格搜索来进一步寻找到能让模型收敛的最优参数。

环境配置

  • python版本3.6及以上,操作系统可使用Windows、MacOs、Linux
  • 安装第三方库:scipy、sklearn、mat73、time

成功的路上没有捷径,只有不断的努力与坚持。如果你和我一样,坚信努力会带来回报,请关注我,点个赞,一起迎接更加美好的明天!你的支持是我继续前行的动力!"

"每一次创作都是一次学习的过程,文章中若有不足之处,还请大家多多包容。你的关注和点赞是对我最大的支持,也欢迎大家提出宝贵的意见和建议,让我不断进步。"

神秘泣男子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/8188.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Android Handler

Handler用于多线程消息分发和处理。与handler相关的几个对象:Message, Looper,MessageQueue, ThreadLocal. Handler是Message的消费者。 MessageQueue是容器。 Looper是整个Message分发的驱动。 Handler中有多种发送消息的方法,其中postxx…

Windows/Linux部署Qt并通过Qt Installer Framework制作安装包

本文参考 Qt Installer Framework Manual。 若要使用 Qt Installer Framework(简称 QIF),需要在 Qt Online Installer 或 Qt Maintenance Tool 中确保该组件已安装(QIF 组件在 Qt->Developer and Design Tools 下)&…

【大数据学习 | kafka】消费者的分区分配规则

1. 概述 上面我们提到过,消费者有的时候会少于或者多于分区的个数,那么如果消费者少了有的消费者要消费多个分区的数据,如果消费者多了,有的消费者就可能没有分区的数据消费。 那么这个关系是如何分配的呢? 现在我们…

【开发】关于Java中String与Integer的小小知识点(使用等号对比引用对象)

一个很简单的小知识点 我们都知道,如果使用对比包装类型或对象,那么比较的都是两者之间的地址(指针或句柄),而非对象本身,那么且看下方的代码。 public class A {public static void main(String[] args)…

2025年山东省考报名流程图解

2025年山东公务员考试备考开始 为大家整理了从笔试到录用的全部流程,希望可以帮助到你们!参考2024年山东省考公告整理,请以最新公告为准! 一、阅读公告和职位表 二、职位查询 三、网上报名 四、确认缴费 五、网上打印准考证 六、参…

网络安全入门篇之详细学习路线

什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性&…

什么是大数据治理?在企业数字化转型过程中有什么用?

建设背景 有效的数据治理不仅能够确保数据的安全和质量,还能为企业提供深入的业务洞察,推动决策制定和创新。数据治理是数字化转型的基础,是数据资源成为数据资产的基础,只有经过了数据治理,相应的数据资源才能产生价…

Kalshi PK Polymarket,谁更胜一筹

https://kalshi.com https://polymarket.com/ 在刚过去的2024 美大选中,这两个网站可谓风光无限。这两者究竟有何区别呢,今天咱们一起来扒一扒。 Kalshi与Polymarket主要有以下区别: 监管与合法性方面: Kalshi:经过美…

UI测试还在Selenium,难怪你会被淘汰

一、前言 在UI自动化测试的领域中,Selenium无疑是一颗璀璨的明星,它以其强大的浏览器自动化能力,长期以来一直是众多测试工程师的首选工具。它很经典,地位也毋庸置疑,但也是过去式了,现在我采用的自动化方…

基于ssm的网上药房管理系统的设计与实现(源码+LW+调试)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于java的ssm网上药房管…

godot——主题、Theme、StyleBox

我刚开始被这些术语吓到了,一直不敢去接触它们,都用的默认样式。现在好不容易有点思路了,记录下来。 下面看看怎么自定义样式。 1.先新建一个Theme 2.再次点击创建好的Theme 得到 图1 这样一个面板。(看不懂没事,继…

如何利用Python API接口实战中高效地获取商品详情信息

在电商数据分析和商品信息集成领域,高效地获取商品详情信息是至关重要的。本文将介绍如何使用Python结合API接口,从淘宝/天猫平台获取商品详情信息,并提供实战代码示例。 一、理解API接口的重要性 API(应用程序编程接口&#xff…

【Linux】编辑器vim 与 编译器gcc/g++

目录 一、编辑器vim: 1、对vim初步理解: 2、vim的模式: 3、进入与退出: 4、vim命令模式下的指令集: 移动光标: 删除: cv: 撤销: 其他: 5、vim底行模…

不支持UEFI的老显卡修改vBIOS进行支持

前段时间要在办公室玩恐怖黎明,但是联想自带的GT730实在是有点慢,后来闲鱼收了一张HD7750,虽然也是老掉牙,但是性能也有3成提升,聊胜于无吧.但是存在HD7750不支持UEFI的问题.具体表现为: 系统是win11未进系统时,什么都不显示,不能进BIOS.刚换卡未装驱动的时候,即使已经进入系统…

qt QWheelEvent详解

1、概述 QWheelEvent是Qt框架中用于处理鼠标滚轮事件的一个类。当用户滚动鼠标滚轮时,Qt会生成一个QWheelEvent事件,并将其发送到相应的窗口或控件。开发者可以通过重载窗口或控件的wheelEvent()方法来响应这个事件,并执行相应的操作&#x…

如何训练最懂您企业的AI助理?

随着人工智能技术的蓬勃发展,企业级AI助理已成为提升工作效率、优化客户服务体验的重要利器。这些智慧化的系统,通过模拟人类的认知功能,能够轻松应对复杂的数据分析、自动化繁琐的日常任务,甚至为企业决策提供有力支持。拥有一款…

2024网鼎杯web1+re2 wp

这两道题属于比较简单的,顺道说一下,今年的题有点抽象,web不是misc,re不是web的,也有可能时代在进步,现在要求全栈✌了吧 web1 最开始被强网的小浣熊带偏思路了,进来疯狂找sql注入&#xff0c…

【Android 系统中使用CallStack类来追踪获取和操作调用栈信息】

Android系统CallStack类的使用 定义使用方法使用场景注意事项应用举例 定义 在 Android 系统中,CallStack 类是一个用于获取和操作调用栈信息的工具类。这个类通常用于调试和日志记录,以帮助开发者了解函数调用的顺序和位置。以下是您提供的代码片段的解…

Vue 组件通信-自定义事件(七)

一、组件自定事件概念 自己定义的事件,包含事件名,事件回调等,定义好之后去给组件使用。也是一种组件的通信方式,适用于子组件传递给父组件。 二、 组件自定义事件实现子传父 1、在父组件中给子组件绑定一个自定义事件 在子组件标…

解决Qt Creator调试“warning: GDB: Failed to set controlling terminal“

本文档详细介绍了在Qt环境中遇到GDB提示Failed to set controlling terminal错误时的解决方案,步骤包括勾选Run in Terminal选项。适合开发者在调试过程中遇到此类问题时参考。 &"warning: GDB: Failed to set controlling terminal: \345\257\271\350\25…