基于卷积神经网络的高光谱分类 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://xiahunao.cn/news/3020264.html

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

相关文章

Redis(十) Java客户端

文章目录 前言SSH端口转发Jedis的使用Redis 通用命令的使用Redis String 类型命令的使用Redis List 类型命令使用Redis Hash 类型命令的使用Redis Set 类型的使用Redis Zset 类型命令的使用 前言 前面我们学习 redis 的时候都是在 redis 的原生客户端上输入 redis 命令的&…

npm安装指定版本,npm删除依赖,卸载依赖

安装指定版本 npm中安装指定的版本号,格式为 ‘包名版本号’ npm install 包名称版本号 --save 例如安装jquery: npm install jquery3.0.0 --save在package.json里面可以看到对应的包: "jquery": "^3.0.0"注意:已有…

解决硬盘灯不停的闪硬盘不停的读cpu占用率高的Microsoft Windows Search

可能你发现了,你的硬盘灯一直亮着,为什么??可能你发现了,你的CPU占用率一直居高不下,为什么?也许就是因为Microsoft Windows Search这个进程 一、windowsSearch的罪证 SearchIndexer和Search…

2024 CorelDraw最新图形设计软件 激活安装教程来了

2024年3月,备受瞩目的矢量制图及设计软件——CorelDRAW Graphics Suite 2024 正式面向全球发布。这一重大更新不仅是 CorelDRAW 在 36 年创意服务历史中的又一重要里程碑,同时也展现了其在设计软件领域不断创新和卓越性能的领导地位。 链接: https://pan…

7天精通Web APIs——-Bom操作(理论+实战)(第五天)

一、window对象 1.1 window对象和bom的关系 首先理解dom和bom之间的关系 显然bom的范围比较大 bom的全称为浏览器对象模型 window是bom的核心对象,window里面有很多属性和方法,用于实现浏览器与 JavaScript 代码之间的交互。作为 JavaScript 的全局对…

电脑提示‘找不到msvcr110dll,无法继续执行代码’的解决方法,3分钟快速修复

不知道大家有没有遇到过这种情况,无端端电脑提示你找不到msvcr110dll,无法继续执行代码?当出现这个情况,证明你的某个程序就已经运行不了,你需要去修复这个错误,才能正常的运行程序,下面我们一起来详细的了…

Java集合 总结篇(全)

Java集合 集合底层框架总结 List 代表的有序,可重复的集合。 ArrayList -- 数组 -- 把他想象成C中的Vector就可以,当数组空间不够的时候,会自动扩容。 -- 线程不安全 LinkedList -- 双向链表 -- 可以将他理解成一个链表,不支持…

TSINGSEE青犀视频边缘计算AI智能分析网关V4告警消息语音推送的配置流程

TSINGSEE青犀视频边缘计算硬件智能分析网关V4内置了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,上报识别结果,并能进行语音告警播放。今天我们来分享一下如何配置和使用AI智能分析网关V4的语音推送。 提前准备…

docker私有仓库的registry

简介 Docker私有仓库的Registry是一个服务,主要用于存储、管理和分发Docker镜像。具体来说,Registry的功能包括: 存储镜像:Registry提供一个集中的地方来存储Docker镜像,包括镜像的层次结构和元数据。 版本控制&…

【Qt】常用控件(一)

文章目录 一、核心属性1、enabled代码示例: 通过按钮2 切换按钮1 的禁用状态 2、geometry代码示例: 控制按钮的位置代码示例:window frame 的影响代码示例: 感受 geometry 和 frameGeometry 的区别 3、windowTitle4、windowIcon代码示例: 通过 qrc 管理图片作为图标…

小米手机怎么截屏?一篇文章教会你!

我们经常需要截取手机屏幕上的内容,无论是为了分享、教学还是记录。对于小米手机用户来说,掌握截屏技巧不仅能够方便地记录精彩瞬间,还能在需要时轻松分享或保存屏幕内容。小米手机怎么截屏,有哪些截屏方式呢?本文将为…

软件测试实战项目(含电商、银行、APP等)

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快 今天给大家带来几个软件测试项目的实战总结及经验,适…

指定地区|CSC高级研究学者赴澳大利亚访学交流

CSC高级研究学者均是正高或博导级的,学术背景较强,多数能DIY联系到国外合作机构。但也有些申请者因指定地域或学校,或须在短期内获取邀请函故而求助于我们。本案例D教授就指定澳大利亚的墨尔本地区,我们最终用维多利亚大学的邀请函…

taro3兼容支付宝/微信小程序的自定义拖拽排序组件

描述:列表可以完成拖拽排序 此组件是根据支付宝原生文档改编成taro-vue3的形式,只保留了拖拽的部分,其他功能都去除了,测试下来可以兼容支付宝和微信小程序。 支付宝原生文档: https://opendocs.alipay.com/support/…

Linux下使用RAID

目录 1. 创建RAID准备 2. 创建RAID 0 2.1. 创建磁盘阵列 (1)创建磁盘阵列 (2)查看磁盘阵列信息 (3)挂载文件系统 (4)保存RAID信息 (5)开机自动挂载RA…

字符编码(十六进制)

题目描述 假设一个简易的变长编码规则XUTF:每个字符有一个唯一编号值 unicodeVal(如汉字“华”的编号十进制值是21326),使用1~6个字节进行编码,编码规则如下: 编码格式: 编号值范围编码后字节长度n二进制格式(x 表示有效位,其它为固定位)[0, 2^7)1字节1xxxxxxx[2^7,…

3dmax-vray6渲染器参数设置

适用于3dmax2018-2023版本 一、【公用】 小图输出大小:1500*1125,勾选大气、效果; 大图输出大小:3000*2250,勾选大气、效果、置换; 二、【vray】 小图抗锯齿类型:渐进式;最小细分:1,最大细分:100&#…

Day_3

1. HttpClient HttpClient是Apache的一个子项目&#xff0c;是高效的、功能丰富的支持HTTP协议的客户端编程工具包 作用&#xff1a;发送HTTP请求&#xff0c; 接受相应数据 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>…

B1506脉冲测试中的孔径

孔径&#xff08;Aperture Time&#xff09;是示波器或测量设备中使用的一个术语&#xff0c;指的是在一次测量中&#xff0c;示波器或测量设备对信号进行采样的时间长度。在进行波形捕获或测量时&#xff0c;孔径时间决定了采样的持续时间&#xff0c;从而影响测量的分辨率和准…

视频提取gif怎么制作?试试这个网站一键转换

通过把视频转换成gif动图的操作能够更加方便的在各种平台上分享和传播。相较于视频&#xff0c;gif图片具有较小的文件体积&#xff0c;gif动图能够快速的加载播放&#xff0c;不需要等待就能快速欣赏。很适合从事新媒体之类的小伙伴&#xff0c;可以用来做展示、宣传等。想要实…