【传知代码】用于图像识别的判别图正则化技术

news2024/11/23 3:26:26
🍑个人主页:Jupiter.
🚀 所属专栏:传知代码
欢迎大家点赞收藏评论😊

在这里插入图片描述

在这里插入图片描述

目录

  • 论文概述
  • 图正则化技术及其优点
    • 参考文献:
  • 算法流程
      • 在标准BLS中嵌入判别图正则化的方法
  • 模型整体架构
  • 代码复现
      • 图拉普拉斯矩阵的构建——generateLmatrix.py文件
      • 顶层文件——GBLS.py文件
      • 数据集介绍
      • 使用步骤
      • 实验结果
  • 环境配置


论文概述

在这里插入图片描述

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

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

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

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

相关文章

第二十五章 Vue父子通信之sync修饰符

目录 一、概述 二、完整代码 2.1. main.js 2.2. App.vue 2.3. BaseDialog.vue 三、运行效果 一、概述 前面的章节我们讲到,通过v-model我们可以实现父子组件间的通信,但是使用v-model的时候,子组件接收的prop属性名必须固定为valu…

头歌——机器学习(逻辑回归)

文章目录 逻辑回归简述代码 sklearn逻辑回归 - 手写数字识别代码 逻辑回归算法详解似然与概率的区别逻辑回归算法的代码实现代码 逻辑回归案例 - 癌细胞精准识别代码 逻辑回归简述 什么是逻辑回归 当一看到“回归”这两个字,可能会认为逻辑回归是一种解决回归问题的…

【高等数学】3-2多元函数积分学

1. 二重积分 可以想象你有一块不规则的平面薄板,它在一个平面区域上。二重积分就是用来求这个薄板的质量(假设薄板的面密度函数是)。 把区域划分成许多非常小的小方块(类似于把一块地划分成很多小格子),在每个小方块上,密度近似看成是一个常数,然后把每个小方块的质量加…

需求管理流程与工具:国内外10款综合评测

本文中,分享了10款需求管理工具:1.PingCode;2.Worktile;3.纷享销客;4.Teambition;5.Jira;6.Trello;7.Figma;8.万维需求管理;9.ClickUp;10.项目管理…

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…

嵌入式之C语言(基础篇)

首先,我们要知道什么是程序。程序:为了让计算机执行某操作或解决某个问题而编写的一系列有序指令的集合。 一、计算机语言简史 第一代是机器语言:时间实在1946年,第一台计算机ENIAC诞生,用的是穿孔卡片做的&#xff0c…

搜索引擎算法更新对网站优化的影响与应对策略

内容概要 随着互联网的不断发展,搜索引擎算法也在不断地进行更新和优化。了解这些算法更新的背景与意义,对于网站管理者和优化人员而言,具有重要的指导意义。不仅因为算法更新可能影响到网站的排名,还因为这些变化也可能为网站带…

牛客周赛65(C++实现)

比赛链接:牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 文章目录 1.超市1.1 题目描述1.2 思路1.3 代码 2. 雨幕2.1 题目描述2.2 思路2.3 代码 3.闺蜜3.1 题目描述3.2 思路3.3 代码 4. 医生4.1 题目描述4.2 思路4.3 代码 1.超市 1.1 题目描述 …

【解决方案】微信小程序如何使用 ProtoBuf 进行 WebSocket 通信

前言 故事背景 简单说下背景,项目中需要用 ProtoBuf 协议转换请求参数,并通过 WebSocket 进行双向通信。重点!一个是 web端(Vue3 TS),一个是微信小程序端(原生 JS)。 剧情发展 …

练习LabVIEW第三十四题

学习目标: 刚学了LabVIEW,在网上找了些题,练习一下LabVIEW,有不对不好不足的地方欢迎指正! 第三十四题: 在一个波形表中显示三条随机数组成的曲线,分别用红,绿,蓝三种…

rnn/lstm

tip:本人比较小白,看到july大佬的文章受益匪浅,现在其文章基础上加上自己的归纳、理解,以及gpt的答疑,如果有侵权会删。 july大佬文章来源:如何从RNN起步,一步一步通俗理解LSTM_rnn lstm-CSDN博…

Python | Leetcode Python题解之第528题按权重随机选择

题目: 题解: class Solution:def __init__(self, w: List[int]):self.pre list(accumulate(w))self.total sum(w)def pickIndex(self) -> int:x random.randint(1, self.total)return bisect_left(self.pre, x)

使用Python多线程抓取某图网数据并下载图片

前言 在互联网开发领域,数据抓取是一项非常实用的技术。通过数据抓取,我们可以从网页上获取所需的信息,并将其转化为结构化数据,以便进一步分析或使用。本文将介绍如何利用Python编写一个多线程程序来抓取网页上的图片数据&#…

SQL之排名窗口函数RANK()、ROW_NUMBER()、DENSE_RANK() 和 NTILE() 的区别(SQL 和 Hive SQL 都支持)

现有一张student 表,表中包含id、uname、age、score 四个字段,如下所示: 该表的数据如下所示: 一、ROW_NUMBER() 1、概念 ROW_NUMBER() 为结果集中的每一行分配一个唯一的连续整数,编号从 1 开始。‌ 该函数按照指…

Verilog HDL基础

模块的基本结构 module 模块名(端口列表); // 模块声明// 端口定义input [数据类型] [位宽] 输入端口列表; output [数据类型] [位宽] 输出端口列表; inout [数据类型] [位宽] 双向端口列表; // 数据类型定义wire [位宽] 线网名,线网名,…; …

C语言实验 选择结构

时间&#xff1a;2024.11.2 一、实验 实验一、7-1 计算分段函数[2] #include<stdio.h> #include<math.h> int main(){float x,r;scanf("%f",&x);if(x<0){rpow((x1.0),2)2*x1.0/x;}else rpow(x,0.5);printf("f(%.2f) %.2f",x,r);retu…

六、Go语言快速入门之数组和切片

文章目录 数组和切片数组:one: 数组初始化:two: 数组的遍历:three: 多维数组:four: 将数组传递给函数 切片(Slice):one: 切片的初始化:star: new和make区别 :two: 切片的使用:three: 将切片传递给函数:four: 多维切片:four: Bytes包:four: 切片和垃圾回收 &#x1f4c5; 2024年…

【Sublime Text】格式化Json和XML

无package control解决方案 删除文件中的package control这一行并保存 下载 下载中

vue常用的修饰符有哪些

1、修饰符是什么 在Vue 中&#xff0c;修饰符处理了许多 DOM 事件的细节&#xff0c;让我们不再需要花大量的时间去处理这些烦恼的事情&#xff0c;而能有更多的精力专注于程序的逻辑处理 vue中修饰符分为以下五种 汇总修饰符说明表单lazy光标离开标签的时候&#xff0c;才会…

微服务设计模式 - 发布订阅模式(Publisher Subscriber Pattern)

微服务设计模式 - 发布订阅模式&#xff08;Publisher Subscriber Pattern&#xff09; 定义 发布-订阅模式&#xff08;Publisher-Subscriber Pattern&#xff09;是一种常见的设计模式&#xff0c;被广泛用于云计算和分布式系统中&#xff0c;以实现松散耦合的组件间通信。发…