当前位置:   article > 正文

HybridSN高光谱图像分类:3-D–2-D CNN特征层次结构

hybridsn

前言

HybridSN——探索用于高光谱图像分类的3-D–2-D CNN特征层次结构
相关论文:HybridSN: Exploring 3-D–2-D CNN Feature Hierarchy for Hyperspectral Image Classification(Swalpa Kumar Roy, Student Member, IEEE, Gopal Krishna, Shiv Ram Dubey , Member, IEEE,and Bidyut B. Chaudhuri, Fellow, IEEE)

高光谱图像(HSI:Hyperspectral image)分类在遥感图像分析中有着广泛的应用,而卷积神经网络(CNN)是最常用的基于深度学习的视觉数据处理方法之一。大多方法基于2-D CNN。然而HSI的分类性能高度依赖于空间和光谱信息,但由于增加了计算的复杂性,很少有方法使用3-d-cnn。而上述论文提供了一种混合光谱CNN (hybrid spectral CNN)——HybridSN。

HybridSN是一个频谱空间的3-D-CNN,然后是空间的2-D-CNN。3-D-CNN促进了从光谱波段堆栈的联合空间-光谱特征表示。在3-D-CNN之上的2-D-CNN进一步学习更抽象的空间表示。此外,与单独使用3-D-CNN相比,混合cnn的使用降低了模型的复杂性。

实验步骤

首先取得数据,并引入基本函数库。

! 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
! pip install spectral
  • 1
  • 2
  • 3

导入相关包

import numpy as np
import matplotlib.pyplot as plt
import scipy.io as sio
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report, cohen_kappa_score
import spectral
import torch
import torchvision
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

1. 创建模型

(1)模型网络结构

如下图所示:
Fig. 1. Proposed HybridSpectralNet (HybridSN) model that integrates 3-D and 2-D convolutions for HSI classification
三维卷积部分:

  • 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)

接下来要进行二维卷积,因此把前面的 32*18 reshape 一下,得到 (576, 19, 19)

二维卷积:(576, 19, 19) 64个 3x3 的卷积核,得到 (64, 17, 17)

接下来是一个 flatten 操作,变为 18496 维的向量,

接下来依次为256,128节点的全连接层,都使用比例为0.4的 Dropout,

最后输出为 16 个节点,是最终的分类类别数。

(2)代码

下面是 HybridSN 类的代码:(torch.nn查漏补缺直通车

class_num = 16

class HybridSN(nn.Module):
  def __init__(self):
    super(HybridSN, self).__init__()

    self.conv_3d = nn.Sequential(
        nn.Conv3d(1, 8, (7, 3, 3)),
        nn.LeakyReLU(0.2, inplace=True),
        nn.Conv3d(8, 16, (5, 3, 3)),
        nn.LeakyReLU(0.2, inplace=True),
        nn.Conv3d(16, 32, (3, 3, 3)),
        nn.LeakyReLU(0.2, inplace=True),
    )

    self.conv_2d = nn.Sequential(
        nn.Conv2d(576, 64, (3, 3)),
        nn.LeakyReLU(0.2, inplace=True)
    )

    self.linear = nn.Sequential(
        nn.Linear(18496, 256),
        nn.LeakyReLU(0.2, inplace=True),
        nn.Dropout(0.4),
        nn.Linear(256, 128),
        nn.LeakyReLU(0.2, inplace=True),
        nn.Dropout(0.4),
        nn.Linear(128, class_num),
        nn.LogSoftmax(dim=1)
    )

  def forward(self, x):
    x = self.conv_3d(x)
    x = x.view(-1, x.shape[1] * x.shape[2], x.shape[3], x.shape[4])
    x = self.conv_2d(x)
    x = x.view(x.size(0), -1)
    x = self.linear(x)
    return x
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

(3)测试

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

2. 创建数据集

首先对高光谱数据实施PCA降维;然后创建 keras 方便处理的数据格式;然后随机抽取 10% 数据做为训练集,剩余的做为测试集。

首先定义基本函数:

# 对高光谱数据 X 应用 PCA 变换
def applyPCA(X, numComp
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/934172
推荐阅读
相关标签
  

闽ICP备14008679号