基于图卷积神经网络(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.…

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

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

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: …

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;所以在…

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

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

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

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

【保姆级教程】Windows 远程登陆 Linux 服务器的两种方式:SSH + VS Code,开发必备

0. 前言 很多情况下代码开发需要依赖 Linux 系统&#xff0c;远程连接 Linux 服务器进行开发和维护已成为一种常态。对于使用Windows系统的开发者来说&#xff0c;掌握如何通过 SSH 安全地连接到 Linux 服务器&#xff0c;并利用 VS Code 编辑器进行开发&#xff0c;是一项必备…

海外问卷调查这个项目怎么样?

大家好&#xff0c;我是橙河老师&#xff0c;今天讲一讲海外问卷调查这个项目怎么样&#xff1f;我自己做这个项目已经有三四年的时间了&#xff0c;在这个行业里算是资深玩家&#xff0c;我自己的工作室也一直稳定在操作这个项目&#xff0c;首先可以肯定的是&#xff0c;这个…

<数据集>棉花识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;13765张 标注数量(xml文件个数)&#xff1a;13765 标注数量(txt文件个数)&#xff1a;13765 标注类别数&#xff1a;4 标注类别名称&#xff1a;[Partially opened, Fully opened boll, Defected boll, Flower] 序…

甄选范文“论企业集成架构设计及应用”软考高级论文,系统架构设计师论文

论文真题 论企业集成架构设计及应用企业集成架构(Enterprise Integration Arhitecture,EIA) 是企业集成平台的核心,也是解决企业信息孤岛问题的关键。企业集成架构设计包括了企业信息、业务过程、应用系统集成架构的设计。实现企业集成的技术多种多样,早期的集成方式是通过…

仕考网:公务员可以报考军队文职吗?

公务员可以报考军队文职考试&#xff0c;但是需要满足前提条件。 对于已经与国家、地方的用人单位建立劳动关系的社会人才&#xff0c;在获得当前用人单位的许可后才可以申请报考。 在面试过程中&#xff0c;考生必须出示一份由其用人单位出具的且加盖公章的同意报考证明。一…

远程文件下载

在本机启动 http 服务&#xff0c;在你要下载文件的目录下输入 cmd &#xff0c;运行 python -m http.server前提条件&#xff1a;本机安装了 python 服务。 查看本机 IP&#xff08;无线局域网 IP&#xff09;&#xff0c;重新开一个窗口&#xff0c;查看本机 IP 地址。 ipc…

【arxiv 2024】Latte: Latent Diffusion Transformer for Video Generation

【arxiv 2024】Latte: Latent Diffusion Transformer for Video Generation 一、前言Abstract1 Introduction2 Related Work3 Methodology3.1 Preliminary of Latent Diffusion Models3.2 The model variants of Latte3.3 The empirical analysis of Latte3.3.1 Latent video c…

C语言 ——— 函数指针数组的讲解及其用法

目录 前言 函数指针数组的定义 函数指针数组的使用 前言 数组是存放一组相同类型数据的存储空间 关于指针数组的知识请见&#xff1a;C语言 ——— 指针数组 & 指针数组模拟二维整型数组-CSDN博客 那么要将多个函数的地址存储到数组中&#xff0c;这个数组该如何定义…

C++中的依赖注入

目录 1.概述 2.构造函数注入 3.setter方法注入 4.接口注入 5.依赖注入框架 6.依赖注入容器 7.依赖注入框架的工作原理 8.依赖注入的优势 9.总结 1.概述 依赖注入是一种设计模式&#xff0c;它允许我们在不直接创建对象的情况下为对象提供其依赖项&#xff1b;它通过将…

云仓技术带来的物流变革影响

1、实时可视性&#xff1a; 云仓技术使物流公司能够实时跟踪和监控货物在供应链中的位置和状态。这种实时可视性提供了更好的货物追踪和管理能力&#xff0c;同时也提高了客户服务的质量。 ———————————————————— 2、仓储优化&#xff1a; 云仓技术可以…

从0开始搭建vue + flask 旅游景点数据分析系统(四):编写前端首页【数据驾驶舱】

本期我们编写数据驾驶舱页面(Dashboard)这个页面。主要任务是引入echarts 组件编写数据驾驶舱页面。 视频教程后续会更新在我的B站&#xff1a;https://space.bilibili.com/1583208775?spm_id_from666.25.0.0 推荐从教程第一集开始从零开始学习&#xff1a;https://blog.csdn…