基于卷积神经网络的高光谱分类 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…

基于python+Django的二维码生成算法设计与实现

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、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…

杰发科技AC7801——支持的纠错功能

1. 复位寄存器保留复位类型 低压检测复位(LVD Reset) 集成了一个低压保护系统,以便在电源电压发生变化期间保护存储器内容和控制 MCU 系统状态。该系统由上电复位(POR)电路和 LVD 电路组成,LVD 可以配置为不同的复位基准&#x…

MySQL的主从复制与主从切换详解

MySQL的主从复制与主从切换详解 一、MySql主从节点的搭建一、 master主节点的搭建1. 查看是否开启bin_log日志2. MySQL开启log_bin功能3. 创建主从复制用户并授权4. mysql数据库状态查看5. 主节点锁表并进行数据备份 二、solve从节点的搭建1. 配置文件添加内容2. 同步主库数据并…

【ITK配准】第七期 尺度(Metric)-直方图均方Metric

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享ITK中的直方图均方Metric,即itk::MeanSquaresHistogramImageToImageMetric,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞…

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产品介绍…

基于libmpv二次开发 使用函数整理

setlocale(LC_NUMERIC, "C");//必需要有,不然编译不过 mpv_handle *mpv mpv_create();//创建实例 WId widui->video->winId(); mpv_set_option(mpv,"wid",MPV_FORMAT_INT64,&wid);//设置播放器在哪个控件上显示 // Enable def…

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

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

【日常运维】pm2起的应用删除应用日志后,发现磁盘控间没有释放,lsof | grep delete 也没看到相关进程,怎么办?

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

三维dp,LeetCode 1463. 摘樱桃 II

目录 一、题目 1、题目描述 2、接口描述 python3 cpp 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 python3 cpp 一、题目 1、题目描述 给你一个 rows x cols 的矩阵 grid 来表示一块樱桃地。 grid 中每个格子的数字表示你能获得的樱桃数目。 你有…