用于训练和使用高光谱数据的无监督自动编码器和有监督深度学习分类器的工具。

deephyp的Python项目详细描述


deephyp:高光谱的深度学习

pypipypi-downloads

用于训练和使用高光谱数据的无监督自动编码器和有监督深度学习分类器的工具。

自编码是一种无监督神经网络,在无监督特征学习和降维等领域有着广泛的应用。有监督的深度学习分类器可以在标记数据上训练以预测光谱的类别。该存储库提供了一个基于python的工具箱,名为deephyp,其中包含了为高光谱数据设计的密集和卷积自动编码器和分类神经网络的构建、训练和测试示例。网络易于设置,可以用不同的架构进行定制。也可以实施不同的培训方法。工具箱建立在tensorflow上。

alt text

如果你在研究中使用工具箱,请引用: Windrim等人。使用自动编码器对高光谱数据进行无监督特征学习。遥感11.7(2019):864。 本文解释了训练自编码器的谱角(sa)、谱信息散度(sid)和平方误差和(sse)损失函数。

如果在研究中使用余弦光谱角(CSA)损失函数,请引用: Windrim等人。无监督特征学习以提高照明鲁棒性。2016年ieee国际图像处理会议(icip)。

如果您在研究中使用分类网络,请引用: Windrim等人。有限训练样本的高光谱cnn分类。2017年英国机器视觉会议记录(bmvc)。

安装

工具箱的最新版本可以使用pip从命令行安装:

pip install deephyp

依赖项可以使用以下命令安装:

pip install -r requirements.txt

要导入:

import deephyp

先决条件

运行工具箱所需的软件依赖项是Python2或Python3(使用版本2.7.15和3.5.2进行测试),软件包:

  • Tensorflow(用v1.14.0测试)
  • numpy(使用v1.15.4进行测试)

每个包都可以使用pip安装。示例脚本使用一些附加包,如scipy(用v1.3.1测试)和matplotlib(用v3.0.3测试)。

快速启动

要立即开始训练自动编码器,请转到github repo中的/examples目录并运行示例脚本:

autoencoder_train_MLP_basic.py

它将下载pavia uni数据集并训练自动编码器。然后可以运行示例脚本:

autoencoder_test_MLP_basic.py

测试刚刚训练过的自动编码器,并在"结果"文件夹中生成一些潜在高光谱图像、潜在矢量以及光谱和重建的比较图像。

要开始训练分类网络,请从/examples目录运行脚本:

classifier_train_CNN_basic.py

它将下载pavia uni数据集和地面真值标签并训练分类器。然后运行示例脚本:

classifier_test_CNN_basic.py

将加载经过训练的分类器并生成带有预测和地面真值标签的图像以进行比较。

用法

工具箱包含几个关键过程:

每一项都详述如下:

数据准备

工具箱中来自数据模块hypimg的类处理数据集。类接受numpy格式的高光谱数据,其形状为[numrows x numcols x numbands]或[numsamples x numbands]。工具箱中的网络在光谱域中工作,而不是在空间域中工作,因此,如果图像是以形状[numrows x numcols x numbands]输入的,则将其重塑为[numsamples x numbands],将空间维度折叠为一个。

from deephyp import data
hypData = data.HypImg( img )

或具有类别标签的高光谱数据(即监督分类):

hypData = data.HypImg( img, labels )

然后可以使用hypimg类的函数对数据进行预处理。例如,使用"minmax"方法:

pip install deephyp
0

结果存储在属性中:

pip install deephyp
1

提供时,标签将转换为一种热格式,存储为:

pip install deephyp
2

值为<;=0的任何标签都被视为背景类,并在labelsonehot中显示为一行零。它们也不计入数据处理程序中存储的类数。

一些Matlab文件格式的高光谱数据集(.mat)可从此处下载。可以使用函数将Matlab文件(.mat)转换为numpy格式。

数据迭代器

数据模块中的迭代器类具有从用于训练网络的数据调用批处理的方法。为训练和验证数据创建了一个独立的迭代器对象。例如,由100个批大小为10的预处理高光谱训练样本构成的迭代器对象被定义为:

pip install deephyp
3

类似地,由20个验证样本构成的迭代器对象被定义为:

pip install deephyp
4

由于未指定批大小,因此所有20个样本都用于该批。

对于典型的无监督自动编码器,网络正在学习输出的目标与输入到网络中的数据样本相同,如上面的迭代器示例所示。训练监督分类器时,目标是一个热门类标签:

pip install deephyp
5

任何迭代器中的数据在用于训练网络之前也可以被洗牌:

pip install deephyp
6

建立网络

自动编码器模块具有用于创建自动编码器神经网络的类:

pip install deephyp
7

目前有两种类型的自动编码器可以设置。mlp自动编码器具有完全连接(即密集)层:

pip install deephyp
8

卷积式自动编码器主要具有卷积层,其中全连接层用于将编码器中的最终卷积层映射到潜在向量:

pip install deephyp
9

如果不使用配置文件设置网络,则必须指定数据的输入大小。这应该是光谱带的数目。

初始化对象时,还可以指定网络体系结构的其他方面。对于MLP自动编码器:

pip install -r requirements.txt
  • 编码器(和解码器)中的层数-这是"encoderSize"列表的长度
  • 编码器每层中的神经元数量-这些是"encoderSize"列表中的值。列表中的最后一个值是潜在向量中的维数。
  • 执行每个层的激活函数和最终解码器层的函数-activationfunc和activationfunc final
  • 初始化网络参数的方法(例如改进的Xavier)-"weightInitOpt"
  • 将编码器的哪些层绑定到解码器,以便它们共享一组参数-这些是"tiedweights"列表中的值
  • 网络是否在编码器和解码器中的相应层之间使用跳过连接-由boolean参数skipconnect指定

卷积式自动编码器在定义网络体系结构时有类似的参数,但没有"encodersize"和一些附加参数:

pip install -r requirements.txt
1
  • 编码器(和解码器)中的层数-这是"encodernumfilters"列表的长度
  • 每个conv层中的过滤器/内核数-这些是"encodernumfilters"列表中的值
  • 每个conv层中过滤器/内核的大小-这些是"encoderfiltersize"列表中的值
  • 每个conv层中过滤器/内核的跨距-这些是"encoderStride"列表中的值
  • 潜在向量-zdim中的维数
  • 每个conv层使用的填充类型-padding

也可以使用config.json文件来通过初始化参数定义体系结构:

pip install -r requirements.txt
2

一些示例配置文件可以在examples/example_configs中找到。

分类器模块具有用于创建监督分类神经网络的类:

pip install -r requirements.txt
3

目前有一种分类器可以设置,它包含卷积层(开始时)和完全连接层(结束时)的组合:

pip install -r requirements.txt
4

如果不使用配置文件,则必须为分类器网络指定输入大小和类数。与autoencoder类一样,可以指定体系结构的其他方面:

pip install -r requirements.txt
5
  • 卷积层数-这是"convnumfilters"列表的长度
  • 每个conv层中的筛选器/内核数-这些是"convnumfilters"列表中的值
  • 每个conv层中过滤器/内核的大小-这些是"convFilterSize"列表中的值
  • 每个conv层中过滤器/内核的跨距-这些是"conv stride"列表中的值
  • 每个conv层使用的填充类型-padding
  • 完全连接的层数-这是列表"fcsize"的长度
  • 每个完全连接层中的神经元数量-这些是"fcSize"列表中的值
  • 执行每个层的激活函数-activationfunc
  • 初始化网络参数的方法(例如改进的Xavier)-"weightInitOpt"

还可以使用配置文件设置分类器。

添加培训操作

创建网络后,可以向其添加培训操作。可以向网络中添加多个培训操作,因此每个操作都必须有一个名称:

pip install -r requirements.txt
6

添加列车操作时,可以指定如何使用该操作训练网络的详细信息。例如,使用余弦光谱角(CSA)损失函数的自动编码器的训练操作,0.001的学习率(无衰减),使用ADAM优化且无重量衰减,可通过定义:

pip install -r requirements.txt
7

有几种损耗函数可用于训练自动编码器,其中许多是专门为高光谱数据设计的:

请注意,当使用csa、sa和sid损失函数时,预计重构谱与目标谱具有不同的幅度,但形状相似。上证综指应该会产生类似的规模和形状。此外,由于sid在其表达式中包含log,该表达式对于值<;=0未定义,因此对于使用sid丢失训练的网络,最好使用sigmoid作为激活函数(包括最终激活函数)。例如,请参见train_mlp_sid.py。

降低学习率的方法也可以定制。例如,每100步呈指数衰减:

pip install -r requirements.txt
8

也可以使用逐步降低学习率的方法。例如,要在100步后将学习率从0.001更改为0.0001,然后在200步后更改为0.00001,请执行以下操作:

pip install -r requirements.txt
9

训练操作以相同的方式添加到分类器中,唯一的区别是训练时可以选择平衡类,并且没有指定损失函数(使用交叉熵损失函数):

import deephyp
0

培训网络

将一个或多个训练操作添加到网络后,可以使用它们通过训练来学习该网络的模型:

import deephyp
1

train方法使用一个train op来学习模型,因此对于添加的每个train op,应该至少调用一次train方法。必须指定train op的名称,并且必须输入先前创建的训练和验证迭代器。还必须指定保存模型的目录的路径。上面的例子将为训练数据集的100个阶段训练网络,并将模型保存在50和100个阶段。每5个周期显示一次训练损失,每10个周期显示一次验证损失。

还可以加载预先训练的模型,并通过将包含模型检查点的epoch文件夹的地址作为save-addr参数继续训练它。例如,如果将epoch 50处模型的目录(epoch_50文件夹)传递给上面的示例中的save_addr,则将对该模型进行额外50个epoch的培训,使其达到100,并将其保存在epoch_100文件夹所在的同一目录中。

训练自动编码器和分类器的界面是相同的。

加载经过训练的网络

要在新数据集上加载经过训练的模型,请使用以下方法确保数据已进行了类似的预处理:

import deephyp
2

然后建立网络。网络架构必须与正在加载的模型所用的架构相同。但是,这很容易,因为保存模型的目录应该包含一个自动生成的config.json文件,该文件可用于设置具有相同架构的网络:

import deephyp
3

一旦定义了体系结构,请将模型添加到网络:

import deephyp
4

因为可以将多个模型添加到一个网络中,所以必须为添加的模型命名。

当建立网络并添加模型后,高光谱数据就可以通过网络传输。使用经过训练的自动编码器提取某些光谱的潜在矢量:

import deephyp
5

请确保引用网络应使用的模型的名称。编码的高光谱(dataz)数据也可以被解码以获得重建:

import deephyp
6

也可以使用以下命令一步进行编码和解码:

import deephyp
7

使用经过训练的分类器预测某些光谱的分类标签:

import deephyp
8

要提取分类器网络的第二个最后一层中的特征:

import deephyp
9

结果

pavia university数据集的潜在空间示例,由使用余弦谱角(csa)训练的mlp自动编码器生成:

alt text

以及pavia university数据集的潜在空间的示例,由使用余弦谱角(csa)训练的卷积自动编码器生成:

alt text

两个图都是运行脚本生成的:

autoencoder_train_MLP_basic.py
0

使用cnn分类器生成的pavia university数据集的分类结果:

alt text

这个数字是通过运行脚本生成的:

autoencoder_train_MLP_basic.py
1

相关出版物

高光谱数据深度学习出版物的一些链接:

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何将cassandra中的行数据转换为与列相关的嵌套json   java如何使用jcr XPath在jcr:content/@jcr:data中搜索?   java在使用openCV进行安卓开发时如何利用手机的广角镜头   java解析扩展了接口,结束了一个潜在的无限循环   位置服务的@Override方法中存在java Android应用程序错误   java本地线程的用途和需求是什么   具有左右子访问的java节点树遍历   java验证JsonWebToken签名   JUL日志处理程序中的java日志记录   嵌入式Java读取给定时间段的串行数据。   java有没有办法从多个URL获取多个图像?   java线程通过等待intent阻止自己发送intent   java Spring MVC解析多部分内容请求   java JPA/Hibernate静态元模型属性未填充NullPointerException   java格式错误的字符(需要引号,得到I)~正在处理   java为什么PrintWriter对象抛出FileNotFoundException?   java Neo4j未正确保存标签   java IE不加载图像