AhTong's blog

但盼风雨来,能留你在此

原文:《Collaborative learning of lightweight convolutional neural network and deep clustering for hyperspectral image semi-supervised classification with limited training samples》

主要问题

  1. 为了训练一个具有良好泛化能力的深度学习模型,需要大量的数据集和足够的标记数据。然而,地面真相收集和标记工作是昂贵和耗时的。因此,对于许多特定的应用,HSI分类方法被研究为在只有有限数量的训练样本可用时能够处理高维数据。
  2. 当可用的训练样本有限时,深度学习方法可能会出现过拟合。

本文方法

  1. 将深度CNN与深度聚类相结合,设计了一种协同学习的半监督HSI分类框架,该框架可以同时迭代学习CNN的参数和深度特征的聚类分配。
  2. 提出了一种用于深度分层光谱空间特征学习和分类的轻量级3D CNN。所提出的网络比经典的3D神经网络具有更少的参数,这更适合于只有非常有限的训练样本的情况。
  3. 提出了一种基于近似秩序聚类(AROC)算法的伪标记方法。伪标记方法由于AROC算法具有优异的聚类性能和较低的计算复杂度,可以生成高质量的伪标签,有利于对预训练网络进行微调。

主要思路

  • 用于半监督学习的集群标签技术是典型的生成模型。它首先用无监督聚类算法在无标记数据中识别聚类,然后对每个聚类进行标记或学习。这种技术已经证明了聚类和现有标签之间的依赖性。受这一概念的启发,我们提出了一种协同学习模型,迭代学习深度神经网络的参数和深度特征的聚类分配。
阅读全文 »

原文:《Hyperspectral imagery classification based on semi-supervised 3-D deep neural network and adaptive band selection》

1 主要问题

HSI分类仍然有以下问题:

  1. 光谱波段之间的高度相关性;
  2. 不同光谱特征的空间变异性;
  3. 产生Hughes现象的大量光谱波段,即当波段数量非常高时,分类性能降低,而训练样本的数量非常有限。

所以降维(DR)在HSI分类之前是必要的,因为它允许减少光谱波段的数量,以及分类所需的时间。DR的两个主要方法是特征提取和光谱波段选择。特征提取旨在将原始高光谱数据投影到具有原始光谱波段线性或非线性变换的缩减子空间中,其中缩减子空间的维度远小于原始 HSI 的维度。波段选择试图选择相关光谱波段的子集,即所选择的光谱带应该是最有鉴别力的,信息量最大的,而且相关性和冗余度都很低的。

2 解决方法

  1. 提出了一种自适应DR方法,通过寻找最具信息量、最具辨识度和最具特色的低冗余光谱波段,同时保留HSI的物理意义,解决维数问题。它是一种半监督波段选择方法,不需要大量的训练样本来选择光谱波段。
  2. 提出了一种基于卷积编码器-解码器的半监督三维CNN的HSI空间光谱分类方法,利用较少的训练样本提取HSI的空间光谱特征,提高了分类性能。
阅读全文 »

原文:《Effective Training of Deep Convolutional Neural Networks for Hyperspectral Image Classification through Artificial Labeling》

主要问题

  1. 虽然深度学习神经网络(DLNN)可以获得非常好的精度分数,但它的缺点是需要大量的训练数据来估计模型参数。这样的数据并不总是可用的,因为通常一个高光谱图像只有少量训练标签可用。
  2. 迁移学习可以解决训练样本数量少的问题,但是这一策略并不直接适用于高光谱图像,因为通常情况下只有一种特定类型或特征的图像可用。

思路

对于DLNN分类,缺乏大量的训练数据是一个严重的复杂问题,因为它们通常需要大量数据才能实现高效率。DLNN在HSI分类中的最佳使用将需要仅用几个标记样本来学习它们。这可以通过搜索针对特定任务的定制良好的体系结构来获得,然而,这种方法需要相对较大的验证集才能获得有意义的结果。一种方法是扩大可用的训练集。这可以通过人工增加训练集或使用不同的数据集作为预训练的来源来实现。另一种方法是增加正则化步骤,以提高有限训练样本数量的泛化能力。在MugNet网络中采用了用于分类的网络体系结构的简化,其中训练样本很少。最后,在可能的情况下,使用转移学习方法。 迁移学习使用来自两个领域的训练样本,这两个领域具有共同的特征。网络首先在第一个域上进行预训练,该域有充足的训练样本供应,但不能解决手头的问题。随后,用第二个域更新训练,使权重适应实际问题。

本文方法

为了缩小数据效率低下的深度学习模型与HSI实际应用之间的差距,我们提出了一种利用HSI图像上大量未标记数据点的方法。准确地说,我们提出了一个假设:可以利用未标记数据点的空间相似性来获得高光谱分类的准确性。为了证实我们的假设,我们构建了一个简单的空间聚类方法,该方法根据图像上的每个像素的空间位置为其分配人工标签。利用该人工数据集对深度学习分类器进行预训练。接下来,使用原始数据集对模型进行微调。通过一系列实验,我们证明了该方法优于标准的学习过程。我们的方法是由两个已知的现象驱动的:聚类假设和类中噪声的正则化效应。我们注意到,许多遥感图像具有共同的属性,最值得注意的是“聚类假设”——彼此接近或形成不同的聚类或组的像素经常共享类标签。此外,由于我们的聚类方法的简单形式,我们有目的地在预训练阶段使用的标签中引入噪声;只要正确标记的示例数量按比例缩放,这个标签噪声对最终的精度几乎没有影响。 我们的方法适用于以下情况:

  1. 高光谱遥感图像像素的分类;
  2. 神经网络用作分类器;
  3. 可用的培训标签很少。

在这种情况下,我们建议用一个使用人工标签的预训练步骤来增强训练,这是独立于训练标签的。这一预训练步骤的加入可以看作是迁移学习方法的一种改进。在这种情况下,传统的迁移学习将使用具有大量标签的相关数据集(源域)进行预训练,然后使用当前数据集(目标域)进行微调。在我们的例子中,源域由高光谱图像中的每个点组成,而目标域仅由标记的样本组成。

阅读全文 »

原文:《Generative Adversarial Networks-Based Semi-Supervised Learning for Hyperspectral Image Classification》

核心思想

  1. 采用三维双边滤波器(3DBF),通过将HSI自然处理为体积数据集来提取光谱空间特征。通过3DBF将空间信息集成到提取的特征中,这有利于后续的分类步骤
  2. 在半监督学习的频谱空间特征上训练GAN。GAN包含两个相互对立训练的神经网络(即生成器和鉴别器)

主要问题

  1. 许多无监督方法,如模糊聚类、模糊C-均值方法、人工免疫算法、基于图的方法,如果先验知识太少,就无法确保集群和类之间的关系。
  2. 典型的监督分类器包括支持向量机(SVM)、人工神经网络(ANN)和基于稀疏表示的分类(SRC)等,它们的性能在很大程度上取决于标记样本的数量。与标记样本的迫切需求相反,他们忽略了大量未标记样本以帮助分类。

半监督方法四种类型

  1. 生成模型,其估计条件密度以获得未标记样本的标签。
  2. 低密度分离,其目的是在存在少量样本(标记或未标记)的区域设置边界。最先进的算法之一是转导支持向量机(TSVM)。
  3. 基于图的方法,该方法利用标记和未标记的样本来构建图并最小化能量函数,从而将标签分配给未标记的样品。
  4. 基于包装器的方法,迭代地应用监督学习方法,并且在每次迭代中标记一定数量的未标记样本。自训练和联合训练算法是常用的基于包装器的方法。

本文方法

  1. 通过3DBF提取光谱空间特征。与基于向量/矩阵的方法相比,3DBF提取的结构特征可以通过自然遵循HSI的3D形式并将3D立方体视为一个整体来有效地保存光谱空间信息。
  2. 由GAN以半监督的方式对HSI进行分类。与监督方法相比,GAN可以利用有限的训练样本和大量的未标记样本。与非对抗性网络相比,GAN利用区分模型来训练基于博弈论的生成网络。
阅读全文 »

原文:《Generative Adversarial Network with Folded Spectrum for Hyperspectral Image Classification》

摘要

本文提出了一种新的基于生成对抗网络(GAN)和折叠谱(FS-GAN)的半监督方法。具体来说,将原始光谱向量折叠为二维正方形光谱作为GAN的输入,可以生成光谱纹理,并在相邻和非相邻光谱波段上提供更大的感受野,用于深度特征提取。然后将生成的假折叠谱、标记和未标记的真实折叠谱输入到鉴别器中进行半监督学习。采用特征匹配策略防止模型崩溃。

本文工作

  1. 提出了一种新的基于半监督GAN的HSI分类算法,该算法结合了折叠谱和端到端半监督GAN模型。折叠谱可以挖掘谱域中的纹理信息,而端到端半监督GAN模型提供了最好的未标记样本。
  2. 采用特征匹配策略来稳定GAN的训练过程
阅读全文 »

设置种子

1
2
3
4
5
6
def set_seed(args):
random.seed(args.seed) # python的随机性
np.random.seed(args.seed) # np的随机性
torch.manual_seed(args.seed) # torch的CPU随机性,为CPU设置随机种子
if args.n_gpu > 0:
torch.cuda.manual_seed_all(args.seed) # torch的GPU随机性,为所有GPU设置随机种子
  1. 设置随机种子
  2. 将种子赋予np
  3. 将种子赋予torch
  4. 将种子赋予cuda

GPU设置

1
2
3
4
5
6
7
8
9
10
if args.local_rank == -1:
device = torch.device('cuda', args.gpu_id)
args.world_size = 1
args.n_gpu = torch.cuda.device_count()
else:
torch.cuda.set_device(args.local_rank)
device = torch.device('cuda', args.local_rank)
torch.distributed.init_process_group(backend='nccl')
args.world_size = torch.distributed.get_world_size()
args.n_gpu = 1

根据local_rank决定是否采取分布式。如果local_rank=-1,说明分布式失效;如果local_rank不等于-1,则根据不同的卡配置不同的进程数;获取设备device方便后续将数据和模型加载在上面(代码为.to(device));初始化设置分布式的后端等。

torch.distributed.barrier()的使用:

①数据集:

1
2
3
4
5
6
7
8
9
if args.local_rank not in [-1, 0]:
torch.distributed.barrier()

# 获取数据集
labeled_dataset, unlabeled_dataset, test_dataset = DATASET_GETTERS[args.dataset](
args, './data')

if args.local_rank == 0:
torch.distributed.barrier()

有些操作是不需要多卡同时运行的,如数据集和模型的加载。因此,PyTorch对非主进程的卡上面的运行进行了barrier设置。如果是在并行训练非主卡上,其它进行需要先等待主进程读取并缓存数据集,再从缓存中读取数据,以同步不同进程的数据,避免出现数据处理不同步的现象。

②模型

1
2
3
4
5
6
7
if args.local_rank not in [-1, 0]:
torch.distributed.barrier()

model = create_model(args)

if args.local_rank == 0:
torch.distributed.barrier()

先对其余进程设置一个障碍,等到主进程加载完模型和数据后,再对主进程设置障碍,使所有进程都处于同一“出发线”,最后再同时释放。

阅读全文 »
0%