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

2024-05-08 16:44

本文主要是介绍基于卷积神经网络的高光谱分类 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()

这篇关于基于卷积神经网络的高光谱分类 CNN(上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970872

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

用Pytho解决分类问题_DBSCAN聚类算法模板

一:DBSCAN聚类算法的介绍 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,DBSCAN算法的核心思想是将具有足够高密度的区域划分为簇,并能够在具有噪声的空间数据库中发现任意形状的簇。 DBSCAN算法的主要特点包括: 1. 基于密度的聚类:DBSCAN算法通过识别被低密

深度学习实战:如何利用CNN实现人脸识别考勤系统

1. 何为CNN及其在人脸识别中的应用 卷积神经网络(CNN)是深度学习中的核心技术之一,擅长处理图像数据。CNN通过卷积层提取图像的局部特征,在人脸识别领域尤其适用。CNN的多个层次可以逐步提取面部的特征,最终实现精确的身份识别。对于考勤系统而言,CNN可以自动从摄像头捕捉的视频流中检测并识别出员工的面部。 我们在该项目中采用了 RetinaFace 模型,它基于CNN的结构实现高效、精准的

机器学习之监督学习(三)神经网络

机器学习之监督学习(三)神经网络基础 0. 文章传送1. 深度学习 Deep Learning深度学习的关键特点深度学习VS传统机器学习 2. 生物神经网络 Biological Neural Network3. 神经网络模型基本结构模块一:TensorFlow搭建神经网络 4. 反向传播梯度下降 Back Propagation Gradient Descent模块二:激活函数 activ

PMP–一、二、三模–分类–14.敏捷–技巧–看板面板与燃尽图燃起图

文章目录 技巧一模14.敏捷--方法--看板(类似卡片)1、 [单选] 根据项目的特点,项目经理建议选择一种敏捷方法,该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用以下哪种方法? 易错14.敏捷--精益、敏捷、看板(类似卡片)--敏捷、精益和看板方法共同的重点在于交付价值、尊重人、减少浪费、透明化、适应变更以及持续改善等方面。

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

图神经网络框架DGL实现Graph Attention Network (GAT)笔记

参考列表: [1]深入理解图注意力机制 [2]DGL官方学习教程一 ——基础操作&消息传递 [3]Cora数据集介绍+python读取 一、DGL实现GAT分类机器学习论文 程序摘自[1],该程序实现了利用图神经网络框架——DGL,实现图注意网络(GAT)。应用demo为对机器学习论文数据集——Cora,对论文所属类别进行分类。(下图摘自[3]) 1. 程序 Ubuntu:18.04

PMP–一、二、三模–分类–14.敏捷–技巧–原型MVP

文章目录 技巧一模14.敏捷--原型法--项目生命周期--迭代型生命周期,通过连续的原型或概念验证来改进产品或成果。每个新的原型都能带来新的干系人新的反馈和团队见解。题目中明确提到需要反馈,因此原型法比较好用。23、 [单选] 一个敏捷团队的任务是开发一款机器人。项目经理希望确保在机器人被实际建造之前,团队能够收到关于需求的早期反馈并相应地调整设计。项目经理应该使用以下哪一项来实现这个目标?