【论文复现】用于图像识别的判别图正则化技术

在这里插入图片描述

📝个人主页🌹:Eternity._
🌹🌹期待您的关注 🌹🌹

在这里插入图片描述
在这里插入图片描述


论文概述

在这里插入图片描述

  • 需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版:地址

  • 宽度学习系统(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}{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文件

函数 generateLmatrix(train_x, train_y, opt):
    # 获取标签
    gnd = 调用 result_tra(train_y)
    Label = 获取 gnd 的唯一值
    nLabel = Label 的数量
    nSmp = train_x 的行数

    # 初始化权重矩阵 A
    A = 创建一个 nSmp x nSmp 的零矩阵

    # 遍历每个标签
    对于每个标签 Label[idx]:
        classIdx = gnd == Label[idx]
        设置 A 中 classIdx 对应元素为 1 / classIdx 的和

    # 减去 A 的对角线元素
    A = A - A 的对角线元素

    # 计算度矩阵 D
    D = A 每行的和

    # 计算拉普拉斯矩阵 L
    如果 opt['NORMALIZE'] == 1:
        D_inv_sqrt = D 的逆平方根对角矩阵
        L = 单位矩阵 - D_inv_sqrt * A * D_inv_sqrt
    否则:
        L = D 的对角矩阵 - A

    返回 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 ** -30
    s = 0.8
    par 字典,包含 lambdaG, C, s, NumLayer, range, randstate, ActFun

#设置模型参数:
    NumWin = 10
    NumWinNode = 20
    NumHid = 100

#训练和测试模型:
    调用 bls2deep_graph 函数,传入 train_x, train_y, test_x, test_y, NumWin, NumWinNode, NumHid, L, s, C
    获取并返回训练和测试准确率 trAcc, ttAcc

示例:公开数据集训练——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

编程未来,从这里启航!解锁无限创意,让每一行代码都成为你通往成功的阶梯,帮助更多人欣赏与学习!

更多内容详见:这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值