基于卷积神经网络的高光谱分类 CNN(上)

基于卷积神经网络的高光谱分类 CNN

  • 混合光谱HybridSN
    • 传统的2-D CNN
    • 混合光谱3-D CNN
  • 操作步骤
    • 前言(准备)
      • 获取数据以及引入基本的库函数
      • 导入相关的包
    • 创建模型
      • 模型网络结构
      • 代码
      • 测试

混合光谱HybridSN

传统的2-D CNN

传统的2-D CNN方法在处理HSI时往往只考虑了光谱信息,而忽略了空间信息的重要性。

混合光谱3-D CNN

HybridSN通过引入3-D CNN的思想,将光谱信息空间信息结合在一起进行特征学习和分类。具体来说,HybridSN在网络结构中设计了专门处理光谱信息的卷积层和处理空间信息的卷积层,同时考虑了各个波段之间的相关性和空间上的局部特征。这种混合光谱的设计能够更全面地捕捉HSI图像中的特征,提高分类性能并减少信息损失。

操作步骤

环境:Jupyter Notebook

前言(准备)

获取数据以及引入基本的库函数

# 下载Indian Pines数据集的纠正版本和地面真实值数据集
! wget http://www.ehu.eus/ccwintco/uploads/6/67/Indian_pines_corrected.mat
! wget http://www.ehu.eus/ccwintco/uploads/c/c4/Indian_pines_gt.mat# 安装Python库spectral,用于处理和分析遥感数据
! pip install spectral

导入相关的包

import numpy as np  # 导入NumPy库,用于处理数组和矩阵运算
import matplotlib.pyplot as plt  # 导入Matplotlib库,用于绘制图表和可视化数据
import scipy.io as sio  # 导入SciPy库的io模块,用于读取和写入MATLAB文件格式
from sklearn.decomposition import PCA  # 导入PCA算法,用于数据降维
from sklearn.model_selection import train_test_split  # 导入train_test_split函数,用于划分训练集和测试集
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report, cohen_kappa_score  # 导入评估指标函数
import spectral  # 导入Spectral Python库,用于处理和分析遥感数据
import torch  # 导入PyTorch库,用于构建神经网络模型
import torchvision  # 导入PyTorch的视觉库,用于处理图像数据
import torch.nn as nn  # 导入PyTorch的神经网络模块
import torch.nn.functional as F  # 导入PyTorch的神经网络函数
import torch.optim as optim  # 导入PyTorch的优化器模块

创建模型

模型网络结构

在这里插入图片描述
三维处理

  • conv1:(1, 30, 25, 25), 8个 7x3x3 的卷积核 ==>(8, 24, 23, 23)
  • conv2:(8, 24, 23, 23), 16个 5x3x3 的卷积核 ==>(16, 20, 21, 21)
  • conv3:(16, 20, 21, 21),32个 3x3x3 的卷积核 ==>(32, 18, 19, 19)

具体来说,对于输入数据的维度为(1, 30, 25, 25),其中1表示通道数,30表示光谱维度,25表示空间维度(高度和宽度)。
在你提供的三维卷积部分中,“conv1”、"conv2"和"conv3"分别表示三个卷积层,每个卷积层通过不同大小的卷积核对输入数据进行卷积操作,得到相应的输出特征图。这些卷积层通常会被跟随着激活函数、池化操作等其他层,构成一个完整的深度学习模型。

二维处理
接下来要进行二维卷积,因此把前面的 32*18 reshape 一下,得到 (576, 19, 19)
二维卷积:(576, 19, 19) 64个 3x3 的卷积核,得到 (64, 17, 17)

1.Reshape操作:将(32, 18)的特征矩阵reshape为(576, 19, 19)的三维特征矩阵,其中576表示特征的数量,19表示空间维度。
2.二维卷积操作:使用64个3x3的二维卷积核对(576, 19, 19)的三维特征矩阵进行卷积操作。每个3x3的卷积核在三维特征矩阵上进行滑动操作,计算每个位置的卷积结果,最终得到64个输出通道的特征图。
3.输出特征图:经过64个3x3的卷积核的卷积操作后,我们得到了一个维度为(64, 17, 17)的输出特征图,其中64表示卷积核的数量,17表示空间维度。这个输出特征图将作为下一层神经网络的输入,继续进行后续的处理和学习。

一维处理
接下来是一个 flatten 操作,变为 18496 维的向量
接下来依次为256,128节点的全连接层,都使用比例为0.4的 Dropout,最后输出为 16 个节点,是最终的分类类别数

1.Flatten操作:将(64, 17, 17)的特征图展平为一个18496维的向量。
2.全连接层1(256节点):将18496维的向量输入到一个拥有256个节点的全连接层中,进行权重计算和激活操作。
3.Dropout操作(比例为0.4):在全连接层1的输出上应用Dropout操作,随机丢弃40%的神经元,以防止过拟合。
4.全连接层2(128节点):将经过Dropout操作后的输出输入到一个拥有128个节点的全连接层中,进行权重计算和激活操作。
5.Dropout操作(比例为0.4):在全连接层2的输出上再次应用Dropout操作,同样丢弃40%的神经元。
6.输出层(16个节点):最后将经过Dropout操作后的输出输入到一个拥有16个节点的全连接层中,这个全连接层的输出就是最终的分类类别数。

代码

class_num = 16class HybridSN(nn.Module):def __init__(self):super(HybridSN, self).__init__()# 3D卷积层self.conv_3d = nn.Sequential(nn.Conv3d(1, 8, (7, 3, 3)),  # 输入通道数为1,输出通道数为8,卷积核大小为(7, 3, 3)nn.LeakyReLU(0.2, inplace=True),  # LeakyReLU激活函数nn.Conv3d(8, 16, (5, 3, 3)),  # 输入通道数为8,输出通道数为16,卷积核大小为(5, 3, 3)nn.LeakyReLU(0.2, inplace=True),  # LeakyReLU激活函数nn.Conv3d(16, 32, (3, 3, 3)),  # 输入通道数为16,输出通道数为32,卷积核大小为(3, 3, 3)nn.LeakyReLU(0.2, inplace=True)  # LeakyReLU激活函数)# 2D卷积层self.conv_2d = nn.Sequential(nn.Conv2d(576, 64, (3, 3)),  # 输入通道数为576,输出通道数为64,卷积核大小为(3, 3)nn.LeakyReLU(0.2, inplace=True)  # LeakyReLU激活函数)# 全连接层self.linear = nn.Sequential(nn.Linear(18496, 256),  # 输入特征维度为18496,输出特征维度为256nn.LeakyReLU(0.2, inplace=True),  # LeakyReLU激活函数nn.Dropout(0.4),  # Dropout操作,丢弃比例为0.4nn.Linear(256, 128),  # 输入特征维度为256,输出特征维度为128nn.LeakyReLU(0.2, inplace=True),  # LeakyReLU激活函数nn.Dropout(0.4),  # Dropout操作,丢弃比例为0.4nn.Linear(128, class_num),  # 最终输出层,输出类别数为class_numnn.LogSoftmax(dim=1)  # LogSoftmax函数,用于多分类问题的输出)def forward(self, x):x = self.conv_3d(x)  # 3D卷积操作x = x.view(-1, x.shape[1] * x.shape[2], x.shape[3], x.shape[4])  # reshape操作x = self.conv_2d(x)  # 2D卷积操作x = x.view(x.size(0), -1)  # flatten操作x = self.linear(x)  # 全连接层操作return x

以上代码是一个名为HybridSN的神经网络模型类,包含了3D卷积层、2D卷积层和全连接层。在forward方法中,定义了模型的前向传播过程,包括卷积操作、reshape操作、激活函数、Dropout操作和LogSoftmax函数。

测试

#测试网络结构是否通
def test_net():# 随机输入x = torch.randn(1, 1, 30, 25, 25)net = HybridSN()y = net(x)print(y.shape)
test_net()

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

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

相关文章

密码口令初步

一,弱口令(ctfhub) 1.打开环境,发送到bp的instruder板块,一般id默认为admin,也可以用bp找出来,这里就是 2.先clear ,再把password等号后面添加进来(add)&am…

通过 Java 操作 redis -- list 列表基本命令

目录 使用命令 lpush,lrange,rpush 使用命令 lpop 和 rpop 使用命令 blpop,brpop 使用命令 llen 关于 redis list 列表类型的相关命令推荐看Redis - list 列表 要想通过 Java 操作 redis,首先要连接上 redis 服务器&#xff…

记一次java进程频繁挂掉问题排查修复

前言 最近业务部门有个java服务进程会突然无缘无故的挂掉,然后这个服务会产生一堆类似hs_err_pid19287.log这样的日志。业务部门负责人就把hs_err_pidxxx的日志发给我,让我帮忙看下问题。本文就来回顾一下,我是如何帮业务部门进行问题排查 …

一篇文章fpmarkets澳福盘点摇摆交易优缺点

通过之前的文章,我们各位投资者想必都已经明白了什么是摇摆交易,以及摇摆交易的特点和使用方法,今天fpmarkets澳福就一篇文章盘点摇摆交易优缺点: 摇摆交易策略优势: 更有利可图 与趋势策略不同,投资者可能会在摇摆交易…

Beego 使用教程 5:页面视图

beego 是一个用于Go编程语言的开源、高性能的 web 框架 beego 被用于在Go语言中企业应用程序的快速开发,包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado, Sinatra 和 Flask beego 官网:http://beego.gocn.vip/ 上面的 bee…

Could not resolve placeholder ‘xx.xxx.host’ in value “xxx“问题解决

Could not resolve placeholder ‘xx.xxx.host’ in value "xxx"问题解决 众多原因其中之一 springboot 项目,idea 配置apollo 时,运行指定了配置文件 uat 所以使用本地配置文件启动 时,一直去找uat 配置文件,结果自…

rust使用serde_json转换Value为rust中的数据类型

为了方便转换未知json数据,我们可以使用serde提供的value类型来进行转换,将json字符串转化为Value值,然后可以快速使用get方法来获取值: let json_str r#"{"name": "John","age": 30,"c…

Satellite Communications Symposium(WCSP2022)

1.Power Allocation for NOMA-Assisted Integrated Satellite-Aerial-Terrestrial Networks with Practical Constraints(具有实际约束的 NOMA 辅助天地一体化网络的功率分配) 摘要:天地一体化网络和非正交多址接入被认为是下一代网络的关键组成部分,为…

Git === Git概述 Git安装

第1章 Git概述 Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。 Git易于学习,占地面积小,性能极快。 它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion…

Webshell绕过技巧分析之-base64/HEX/Reverse/Html/Inflate/Rot13

在网络安全运营,护网HVV,重保等活动的过程中,webshell是一个无法绕过的话题。通常出现的webshell都不是以明文的形式出现,而是针对webshell关键的内容进行混淆,编码来绕过网络安全产品(IDS,WAF&…

YOLO系列自研改进:基于注意力机制的多尺度特征提取模块

目录 一、原理 二、代码 三、在YOLO中的应用 一、原理 这个模块的原理仍然是利用不同大小的卷积核来提取不同尺度的特征,同样将通道划分为两部分,一部分通过注意力机制进行通道信息和空间信息的提取,另一部分通过多个不同大小的卷积核来提取多尺度的特征信息。 二、代码…

Baidu Comate——AI时代的软件开发利器

目录 Comate产品介绍 1.产品背景 ​编辑 2.产品优势 3.产品特性 4. 支持开发环境及语言 5.使用场景 Comate产品体验 Comate场景应用 2.快捷键的使用 专业插件体验 1.行间注释 2. 代码优化 3.解释说明代码 4.调优建议 5.AutoWork Comate实测体验感受 Comate产品介绍…

Java 8特性(一) 之 手写Stream流filter、map和forEach方法

Java 8特性(一) 之 手写Stream流filter、map和forEach方法 今天看了一下Java 8的Stream流,学习了一下函数式编程,这才感受函数式编程如此爽,之前就使用过ES8.7.1的函数式编程,当时就在想啥时候咱也能写出这…

Java的BIO/NIO/AIO

1. Java中的BIO、NIO和AIO的基本概念及其主要区别 BIO (Blocking I/O): 传统的同步阻塞I/O模型。每个连接创建成功后都需要一个线程来处理,如果连接没有数据可读,则线程会阻塞在读操作上。这种模型简单易理解,但在高并发环境下会消耗大量系统…

ORACLE 19C RAC DIAG进程消耗大量内存的分析

近期一个ORACLE 19C的RAC环境,多次出现数据库实例的后台进程DIAG消耗很多内存(达到20G),节点1、节点2都出现过次问题。 问题分析:通过对DIAG进程TRACE分析,结合在ORACLE官方后台进行问题、BUG查询匹配&…

思腾合力受邀参加VALSE 2024视觉与学习青年学者研讨会

在充满学术氛围的五月,思腾合力荣幸受邀参加了于2024年5月5-7日在重庆举行的第十四届VALSE大会。作为视觉与学习领域的顶级交流平台,VALSE大会每年都吸引着全国专家与学者的目光。 本次大会不仅延续了往届的高水平学术研讨,还进一步拓宽了研究…

台湾精锐APEX行星减速机噪音产生及优化策略

台湾精锐APEX行星减速机在各种机械装置中的应用逐渐广泛。然而,其噪音问题也日益凸显。噪音不仅影响工作环境,还可能对设备的正常运行和使用寿命产生负面影响。因此,了解APEX行星减速机噪音的产生以及优化噪音问题变得至关重要。 APEX行星减…

安卓自动化脚本制作流程详解!

在移动应用日益普及的今天,安卓自动化脚本制作成为了开发者提高工作效率、减少重复劳动的重要手段,本文将详细介绍安卓自动化脚本的制作流程,并通过五段源代码的实例,帮助读者更好地理解和掌握这一过程。 一、安卓自动化脚本制作…

从U盘到云端:企业数据泄露的那些事

在企业的日常运营中,数据安全无疑是极为关键的一环。无论是U盘还是云,数据泄露事件的发生都可能导致企业的核心机密被窃取,甚至损害企业的商业利益和声誉。以下是关于从U盘到云端,企业数据泄露的一些常见情况和应对策略。 U盘&…

各种流量包特征

[CVE-2013-1966] Apache Struts2 远程命令执行漏洞 要执行的命令在exec里面,而且回显数据包里面有明显执行结果回显 [CVE-2017-8046] Spring Data Rest 远程命令执行漏洞 回显不明显,考试提供的解码工具不能解密, [CVE-2017-12149] JBOSS…