基于图卷积神经网络(GCN)的高光谱图像分类详细教程(含python代码)

目录

一、背景

二、基于卷积神经网络的代码实现

1、安装依赖库

2、建立图卷积神经网络

3、建立数据的边

4、训练模型

5、可视化

三、项目代码


一、背景

图卷积神经网络(Graph Convolutional Networks, GCNs)在高光谱图像分类中是一种有效的方法,特别适用于处理具有复杂空间关系的数据。高光谱图像通常包含数百个甚至数千个连续的频谱波段,每个波段对应一个光谱特征,这使得传统的卷积神经网络在处理高光谱图像时面临困难,因为它们无法有效地捕获像素之间的空间关系。

GCNs通过利用图结构来解决这一问题,将像素(或者像素附近的区域)视为图中的节点,并利用这些节点之间的关系进行特征学习和分类。以下是GCNs在高光谱图像分类中的一些关键点和优势:

  1. 图结构建模:将高光谱图像中的像素视为图中的节点,像素之间的空间关系(例如邻近关系)作为图的边,这样就能够在整个图上利用节点的局部和全局信息。

  2. 卷积操作:GCN引入了图卷积操作,允许在图结构上进行类似于传统卷积神经网络中的卷积操作。这种操作可以捕获节点及其邻居的特征,并利用这些信息来提取更有意义的特征表示。

  3. 特征学习:通过多层的图卷积操作,GCNs能够逐步学习出更加抽象和高级的特征表示,这对于高光谱数据的复杂特征提取尤为重要。

  4. 分类器:最后一层通常是一个分类器,用于将学习到的特征映射到类别标签空间,从而进行分类。

  5. 适应性:GCNs在处理高光谱图像时具有很强的适应性和灵活性,能够处理不同大小和分辨率的图像,以及不同数量和配置的频谱波段。

总体来说,图卷积神经网络通过充分利用高光谱图像中像素之间的空间关系,有效地提升了分类性能,并在遥感图像分析和其他高维数据的处理中展现出了广阔的应用前景。

二、基于卷积神经网络的代码实现

下面我们以IP数据集为例子进行展开讲解。

1、安装依赖库
matplotlib==3.3.4
networkx==2.1
numpy==1.19.5
pandas==1.1.5
scikit_learn==1.5.1
scipy==1.5.4
seaborn==0.11.2
spectral==0.22.4
torch==1.7.1+cu110
torch_geometric==2.0.2
tqdm==4.62.3
2、建立图卷积神经网络
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
import torch
import torch.nn as nnclass GCN(torch.nn.Module):def __init__(self, num_node_features, num_classes):super(GCN, self).__init__()self.conv1 = GCNConv(num_node_features, 32)self.conv1_bn_relu = nn.Sequential(nn.BatchNorm1d(32),nn.ReLU())self.conv2 = GCNConv(32, 64)self.conv2_bn_relu = nn.Sequential(nn.BatchNorm1d(64),nn.ReLU())self.cls = nn.Sequential(nn.Linear(64, num_classes),)def forward(self, edge, data):x, edge_index = data, edgex = self.conv1_bn_relu(self.conv1(x, edge_index))x = self.conv2_bn_relu(self.conv2(x, edge_index))return self.cls(x)
3、建立数据的边

首先进行PCA数据降维:

X_pca = applyPCA(X, numComponents=pca_components)

然后将无标签数据进行剔除:

    X_pca = X_pca.reshape(-1,pca_components)y = y.ravel()mask = y == 0# 剔除无标签的数据data = X_pca[~mask]label = y[~mask]

划分训练验证集(训练70%):

X_train, X_test, y_train, y_test = splitTrainTestSet(range(len(data)),label,trainRatio=0.7)

最后建立所有样本的边(这里取最近邻的样本为3):

Edge_build(data,k=3)

4、训练模型

加载数据和模型:

    X_train_index,X_test_index = utils.create_train_test('./data/'+patch_+'/train_index.txt','./data/'+patch_+'/test_index.txt')data,label = utils.create_features('./data/'+patch_+'/data.txt','./data/'+patch_+'/label.txt')edge = pd.read_csv('./data/'+patch_+'/edge.txt', sep=" ", header=None).values.T# 建立模型model = GCN(30, 16)

训练模型:

class Trainer():def __init__(self, data,y,edge,X_train_index,X_test_index, model, optimizer, loss_function, epochs):self.y = yself.edge = torch.from_numpy(edge).type(torch.LongTensor).to(device)self.X_train_index = X_train_indexself.X_test_index = X_test_indexself.data = torch.from_numpy(data).type(torch.FloatTensor).to(device)self.model = model.to(device)self.optimizer = optimizerself.loss_function = loss_functionself.epochs = epochsself.y_train = torch.from_numpy(y[X_train_index]).type(torch.LongTensor).to(device)self.y_test = torch.from_numpy(y[X_test_index]).type(torch.LongTensor).to(device)self.preds = Nonedef train(self):passdef test(self):self.model.eval()passtrainer = Trainer(data=data,y=label,edge=edge,X_train_index=X_train_index,X_test_index=X_test_index,model=model,optimizer=optim.Adam(model.parameters(), lr=0.001),loss_function=nn.CrossEntropyLoss(),epochs=1000)trainer.train()trainer.test()

5、可视化
if __name__ == '__main__':patch_ = "IP"graph, A = utils.create_Graphs_with_attributes_adjadjency_matrix('./data/' + patch_ + '/edge.txt','./data/' + patch_ + '/data.txt')data, label = utils.create_features('./data/' + patch_ + '/data.txt','./data/' + patch_ + '/label.txt')edge = pd.read_csv('./data/' + patch_ + '/edge.txt', sep=" ", header=None).values.Tmodel = GCN(30, 16)model.eval()net_params = torch.load("./weight/model.pkl")model.load_state_dict(net_params)  # 加载模型可学习参数trainer = Trainer(data=data,y=label,edge=edge,model=model,)pred = trainer.pre() + 1y_ = sio.loadmat('./data/Indian_pines_gt.mat')['indian_pines_gt']a, b = y_.shapeprint('Label shape: ', y_.shape)y = y_.ravel()mask = y == 0outputs = np.zeros_like(y)outputs[~mask] = predoutputs = outputs.reshape((a, b))import spectralimport matplotlib.pyplot as pltpredict_image = spectral.imshow(classes=outputs.astype(int), figsize=(5, 5))plt.savefig('./results/pre.png', dpi=300)plt.pause(1)

三、项目代码

本项目的代码通过以下链接下载:基于图卷积神经网络(GCN)的高光谱图像分类详细教程(含python代码)

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

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

相关文章

CSS实现文本溢出处理

1.单行文本溢出 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

Dependency Injection: 如何解决依赖注入失败问题

Dependency Injection: 如何解决依赖注入失败问题 &#x1f489; **Dependency Injection: 如何解决依赖注入失败问题 &#x1f489;**摘要引言正文内容1. 依赖注入的基础概念代码示例&#xff1a;构造函数注入 2. 依赖注入失败的常见原因2.1 未能找到依赖的实例2.2 循环依赖2.…

Gogs搭建免费好用的Git服务器

1、说明 代码托管系统是开发中一个不可缺少的工具&#xff0c;通过代码托管系统可以方便协同开发&#xff0c;代码权限控制&#xff0c;代码异地灾备、版本管理、问题跟踪、项目文档管理等等项目管理所必须的工具。在项目的任何一个过程中&#xff0c;代码托管系统始终有着重要…

Axios的几种不同的responseType处理响应,以及blob与arraybuffer的解析

在使用 Axios 时&#xff0c;你可以通过设置 responseType 选项来指定如何处理响应数据。Axios 提供了几种不同的 responseType 选项&#xff0c;每种选项都会影响响应数据的格式。 以下是这些选项及其示例&#xff1a; 1. responseType: json 这是默认选项&#xff0c;表示…

App测试分发的秘密:如何让你的应用程序快速上线

App测试分发的重要性 在移动应用程序的开发过程中&#xff0c;测试分发是一个非常重要的环节。它可以帮助开发者快速地将应用程序推广到目标用户手中&#xff0c;收集反馈&#xff0c;进行bug修复和优化&#xff0c;从而提高应用程序的质量和用户体验。但是&#xff0c;测试分…

创业团队如何选择DevOps工具?

极狐GitLab 正式推出 499/人/年的 SaaS 团队版&#xff0c;AI DevOps 专业技术服务支持&#xff0c;让软件研发效率起飞&#xff01;官网链接&#xff1a;https://dl.gitlab.cn/tfk6s7bh 首先要考虑创业团队关心的点&#xff0c;主要包括以下几个&#xff1a; 价格便宜 对于创…

Android分区管理工具sgdisk使用

#有时df -h查看分区信息无法满足需求# 借助Android系统自带的sgdisk可以查看详细的分区信息&#xff0c;类似fdisk命令&#xff0c;sgdisk同样可以创建分区&#xff0c;功能也很强大。 一、sgdisk帮助信息 127|console:/ # sgdisk USAGE: sgdisk [OPTION...] <device>…

linux脚本:自动检测的bash脚本,用于检查linux的系统性能

目录 一、要求 二、脚本介绍 1、脚本内容 2、解释 3、使用方法&#xff1a; &#xff08;1&#xff09;脚本文件 &#xff08;2&#xff09;赋予权限 &#xff08;3&#xff09;执行结果 三、相关命令介绍 1、top &#xff08;1&#xff09;定义 &#xff08;2&…

Layui修改表格分页为英文

Layui修改表格分页为英文 1.前言2.Laypage属性 1.前言 主要记录初次使用Layui没有好好看官方文档踩坑&#xff0c;修改了源码才发现可以自定义 使用的Layui版本2.9.14 2.Laypage属性 Laypage属性中带的有自定义文本的属性 示例代码 table.render({.......page: {skipText: …

【Python】numpy库中上难度例题4道+详解考察点(多维数组+多层嵌套循环)

题目一&#xff1a;灰度图像中识别并统计特定像素模式的出现次数 题目: 假设你正在开发一个图像处理算法&#xff0c;需要在一个较大的灰度图像中识别并统计特定像素模式的出现次数。给定一个大图像 large_image 和一个较小的模板图像 template&#xff0c;编写一个 Python 函…

2.4GHz射频前端集成芯片:AT2401C芯片中文资料

关于AT2401C的基本资料&#xff1a; AT2401C是一款面向Zigbee&#xff0c;无线传感网络以及其他2.4GHz频段无线系统的全集成射频功能的射频前端单芯片。 那么射频放大器的作用是什么&#xff1f;它是用来放大来自射频信号源的低功率信号&#xff0c;放大到较高的功率后&#xf…

7. 运行时数据区-栈

栈的分类 栈分为Java虚拟机栈还有本地方法栈&#xff1a; Java虚拟机栈&#xff1a;用于保存Java中的方法相关的内容本地方法栈&#xff1a;用于保存在Java中使用native 标记的用C来实现方法 由于hotspot的作者发现使用一个栈就可以保存以上两个部分的内容&#xff0c;所以在…

探索编程语言的基本结构

在编程的世界里&#xff0c;每种语言都有其独特的语法和规则&#xff0c;但无论是哪种语言&#xff0c;它们都遵循着一些共同的基本结构&#xff0c;这些结构构成了程序的骨架。了解这些基本结构对于初学者来说至关重要&#xff0c;因为它们是编写有效、可维护代码的基础。以下…

ElasticSearch第4篇(亿级中文数据量 ElasticSearch与Sphinx建索引速度、查询速度、并发性能、实测对比)

经过实测&#xff1a;1.09亿的数据量进行中文检索。ElasticSearch单机的检索性能在0.005~5.6秒之间&#xff0c;此检索速度可满足95%的业务场景&#xff08;注意&#xff1a;每条ES文档平均65个汉字&#xff0c;数据源取自几千本小说&#xff0c;大部分文档在15~300个汉字之间&…

守护模型安全:在Mojo模型中实现动态自定义安全性保障

守护模型安全&#xff1a;在Mojo模型中实现动态自定义安全性保障 在机器学习领域&#xff0c;模型的安全性是一个至关重要的议题。Mojo模型&#xff0c;作为一个通用的术语&#xff0c;可以指代任何机器学习或深度学习模型。随着模型被集成到生产环境中&#xff0c;确保其安全…

moment.js的使用方法

moment.js 是一个功能强大的 JavaScript 库&#xff0c;用于解析、验证、操作和显示日期和时间。虽然 moment.js 因其庞大和一些性能问题已经被推荐逐步淘汰&#xff0c;但它仍然是一个非常流行的库&#xff0c;在许多项目中使用。以下是 moment.js 的基本使用方法。 安装 你…

学习测试14-实战3-复习-使用CANoe打开半成品

数据 链接: https://pan.baidu.com/s/1k0SFq0luDvEbqimFgtfyKg?pwd9a5t 提取码: 9a5t 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 1&#xff0c;导入信号、报文、节点 2&#xff0c;导入数据库 3&#xff0c;导入can代码 4&#xff0c;导入环境变量 5&#x…

云计算环境中的等保测评挑战与解决方案

随着云计算技术的飞速发展&#xff0c;越来越多的企业和组织选择将业务迁移到云端&#xff0c;以享受其带来的高可靠性、高性能和弹性伸缩等优势。然而&#xff0c;云计算环境的复杂性和动态性也给信息安全带来了新的挑战&#xff0c;特别是等级保护测评&#xff08;以下简称“…

vue 进入页面自动刷新并且只刷新一次

方法一&#xff1a;&#xff08;在当前页面写&#xff09; if (location.href.indexOf("#caseDsc") -1) {location.href location.href "#caseDsc";this.reload();} 方法二&#xff1a;&#xff08;在home页面写&#xff09; 通过监听路由跳转&#…

CTF竞赛介绍以及刷题网址(非常详细)零基础入门到精通,收藏这一篇就够了

前言 CTF&#xff08;Capture The Flag&#xff09;中文一般译作夺旗赛&#xff0c;在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会&#xff0c;以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今…