赞
踩
深度学习是机器学习的一种更复杂的形式,它使系统能够自动发现数据中的表示形式。深度学习与机器学习的不同之处在于,它能够在没有外部指导或干预的情况下自行不断改进预测的能力。深度学习算法通过遍历神经网络中的所有层来得出结论来学习模式,这类似于大脑如何处理信息。
对于遥感,深度学习尝试发现图像中的空间和光谱表示。它通常用于识别特征,例如车辆、公用设施、道路等。训练深度学习模型以使用一组标记的像素数据为参考来识别特定特征。借助ENVI深度学习,可以在训练模型时尝试不同的参数以获得最佳解决方案。
从图像中提取特征的过程涉及几个步骤,如下图所示。这些步骤不一定是线性顺序,并且可能需要一个以上的迭代才能产生最佳结果。
TensorFlow模型是整个过程的核心。TensorFlow是ENVI用于执行深度学习任务的开源库。TensorFlow模型由一组基础的神经网络参数定义。必须使用一组已知特征样本的输入标签栅格来训练模型进而寻找特定特征。
在TensorFlow模型从标签栅格中了解特定特征后,可以通过使用经过训练的模型对其他图像进行分类,从而在其他图像中寻找相似特征。例如,可能在比模型训练的更大的图像中找到相同的特征,或者甚至找到具有相似空间和光谱特性的不同图像。最终结果是各种要素的分类栅格。如果只对某个特定功能感兴趣,则结果将是一个二进制分类栅格,其值为0(背景)和1(特征)。如果要提取多个要素,则分类栅格的像素值范围为0(背景)到类数。
分类步骤的第二个输出是类激活栅格,它是灰度图像,每个特征一个波段,显示了像素属于感兴趣特征的概率。
初始分类栅格和类别激活栅格可能并不完全准确,这取决于输入训练样本的质量。可选步骤是通过创建最高像素值的ROI来优化标签栅格,然后编辑ROI以消除误报。可以将精炼的ROI与原始ROI结合使用,以再次训练新模型或完善训练后的模型。
《深度学习流程化工具》旨在帮助用户轻松进行ENVI深度学习。它突出显示了可能希望在每个步骤中使用的工具,并解释了为什么要使用它们。同时,还会跟踪过程中生成的结果(训练模型,标记栅格,分类栅格等。
为深度学习模型提供希望它找到的特征样本--这个过程称为“标注”。结果是一个标签栅格,它被用作训练深度学习模型的输入。可以是二维特征,例如,建筑物和停车场的轮廓。一维特征包括道路和铁轨。点特征包括树木或站牌的位置。
可以训练一个深度学习模型来寻找一个特征,从而得到一个二分类图像。或者可以训练它寻找多个特征,从而得到一个具有多个类的分类图像。
创建标签栅格最常用的方法是在训练栅格中的特征上绘制兴趣区域(ROI)。通过ENVI深度学习,需要更多的ROI来识别特征样本。相比之下,传统的监督式分类方法只需要几个ROI就能产生良好的结果。虽然只标注几个特征就可以得到足够的结果,但在这个过程中投入一些时间,你会得到更准确的结果。
训练栅格是用ROI标记的图像。它们可以是ENVI支持的任何格式。
如果使用的是一个大型的训练栅格数据,则可能需要太多时间来标记整个图像中的所有要素。考虑创建图像的空间子集以用于训练目的,然后在子集图像中的特征上绘制ROI。要创建空间子集,从ENVI菜单栏中选择“文件”>“另存为”,选择要子集的文件,然后单击“空间子集”按钮。
还可以使用多个图像进行训练,然后在每个图像上绘制ROI。图像可以是不同的尺寸。例如,可能有数十个UAV图像,每个图像都覆盖一个小区域。与使用单一图像相比,从多张图像中定义ROI可以在深度学习模型中提供更普遍的结果。在多个训练栅格上绘制ROI的最简单方法是使用深度学习标注工具,如下所述。
注意:虽然当图像不是字节数据类型时,深度学习标签工具会自动进行转换。但它会用自己的最小值和最大值来转换每张图像,而对于每个图像的最小值和最大值并不是单个最小值和最大值那样最佳。
介绍如何从一个或多个训练栅格和感兴趣的特征的 ROI 创建标签栅格。标记训练栅格的最简单方法是使用深度学习标记工具。还可以使用从 ROI 工具构建标签栅格来创建标签栅格。
一旦为每个训练栅格定义一组ROI,深度学习标签工具就会自动创建标签栅格。不必采取任何额外步骤来构建标签栅格。
要开始使用,在ENVI工具箱中选择 "深度学习">"深度学习标注工具"。将使用该工具来定义输出类,并管理工程文件、ROI和训练栅格。也可以通过从深度学习流程工具中启动深度学习标签工具。训练一个新模型 > 训练一个多类模型 > 标注栅格:
工程可以组织与记录过程相关的所有文件,包括训练栅格和ROI。它们还可以跟踪类别名和训练参数值。
注意:该文件夹必须是空文件夹。
创建新项目并定义训练栅格时,ENVI会对输入的每个训练栅格创建子文件夹。每个子文件夹将包含在标注过程中创建的ROI和标签栅格。
ENVI还在每个子文件夹中创建一个名为source_raster.json的文件。这是训练栅格的简化版本(dehydrated),其中所有信息都压缩为JSON代码。如果将项目文件夹移动到其他位置,则每个项目子文件夹中的source_raster.json文件将告诉ENVI在哪里可以找到训练栅格。
要恢复先前创建的项目,在深度学习标签工具菜单栏中选择文件>打开项目。导航到项目文件夹,然后选择文件deep_learning_labeling.json。
设置项目后,下一步是定义输出类。
使用 "深度学习标签工具 "的 "定义类别 "部分来定义要标记的特征。特征名称决定了输出分类图像中的类名称。
下图显示了代表住宅不同类型财产损失的四个类的示例(来自ENVI深度学习教程:提取多个特征):
接下来,将选择要用于训练的栅格。
现在,可以通过在训练栅格中绘制ROI来标记特征。
对于每个训练栅格,"ROI(s) "列显示绘制的ROI占类别总数的比例。按照以下步骤开始绘制ROI。
光标会变为十字线,这样就可以开始绘制ROI多边形。
深度学习标注工具会同步类的名称和颜色及其相关的ROI。如果更改类的名称或颜色,ROI名称或颜色将自动更新(反之亦然)。还可以根据需要添加或删除ROI。
注意:不要使用ROI工具来更改ROI的文件位置、创建或删除ROI或更改其颜色。相反,使用 "深度学习标签工具 "来进行这些更改,以便将它们应用于所有的训练栅格。
可以将一个或多个训练栅格的现有的ROI文件导入项目。ROI名称不必与指定的类名相匹配。参照以下步骤:
可以将矢量文件导入到项目中以获取一个或多个训练栅格。例如,如果已经具有要用于标记的要素的shapefile。参照以下步骤:
如果所选属性具有20个以上的唯一值,则只能选择一个值与给定类关联。
单击"选项"下拉列表,选择 "显示标签统计",可查看有关当前项目的信息以及执行了多少标签。
在 "项目统计 "对话框中,报告的开头提供了有关项目的一般信息,包括:
之后是关于用于标记每个训练栅格的ROI的细节。本节的目的是报告每个训练栅格中做了多少标记。可以快速确定某些训练栅格是否没有足够的ROI,或者其他栅格是否有较高的ROI平衡。下图显示了一个训练栅格的ROI统计:
要将项目统计数据保存到文本文件,单击 "项目统计 "对话框中的 "保存 "按钮。然后选择一个位置来保存文本文件。默认的文件名是 report.txt。
要将项目统计数据复制到系统的剪贴板,单击 "项目统计 "对话框中的 "复制 "按钮。
用ROI标记所有训练栅格后,下一步就是训练深度学习模型。深度学习标签工具提供了一种简化的模型训练方法。完整的训练场景包括创建标签栅格,初始化TensorFlow模型以及设置多个训练参数。当使用深度学习标签工具训练深度学习模型时,将自动完成创建标签栅格和初始化TensorFlow模型的步骤。
参照以下步骤:
同时,在新的Web浏览器中会显示一个TensorBoard页面。TensorBoard是TensorFlow随附的可视化工具包,用于报告实时指标。
如果选择不使用深度学习标签工具来创建标签栅格,那么将需要自己定义和组织训练栅格和ROI,而无需使用标签工具提供的项目文件。然后使用“从ROI构建标签栅格”工具创建标签栅格。
也可以使用ENVIBuildLabelRasterFromROITask编写脚本以从ROI构建标签栅格。
首先,准备好训练栅格,参照以下步骤标注训练栅格数据:
对每个训练栅格和相关的 ROI 文件,参照以下步骤:
现在可以将标签栅格传递给Train TensorFlow Mask Model工具。
可以使用分类图像来构建用于训练深度学习模型的标签栅格。例如,已经拥有一张分类图像,它提供了感兴趣的特征的准确位置。分类图像提供了标记的像素数据,可以将其传递给深度学习模型,以学习特征的样子。
所有用于训练的图像应该具有相同的数据类型(字节)和数据值范围。为了获得更好的效果,在使用Build Label Raster from Classification工具之前,使用Build Deep Learning Raster工具,所有图像的最小和最大像素值都要相同。注意,虽然图像不是字节数据类型时,Build Label Raster from Classification将自动进行这种转换,但它以自己的最小值和最大值转换每个图像,这不如为所有图像提供一个单一的最小值和最大值来的理想。
可以用ENVIBuildLabelRasterFromClassificationTask写一个脚本,从分类图像中创建一个标签栅格。
例如,这是一个住宅区的多光谱输入图像:
这是一个由同一地理区域创建的二分类图像,该图像由一个“屋顶”类组成,该类是通过ENVI支持向量机分类工具创建的:
分类图像的像素值由每个类别的唯一整数组成。值为0表示背景。
该工具分别对每个输入栅格进行归一化。对于多光谱栅格,它会在所有波段上将像素值拉伸到相同的最小值和最大值之间。
对每个栅格和关联的分类图像,执行以下步骤:
现在,可以将标签栅格传递到Train TensorFlow mask model工具。
提供一些关于选择ROI类型和绘制ROI作为ENVI深度学习的标签过程的指导。首先,决定哪种类型的ROI最适合要标注的特征。
如果想对特征进行计数和定位,而不是定义它们的边界和形状(称为分割),则选择点或多线ROI。点和多段线比多边形更容易和更快地绘制,它们是标记具有类似尺寸和形状的特征的最佳选择。点可用于识别单个特征,如汽车或树木。多线可用于识别线性特征,如道路或河流。对于点和多段线,可以在以后的训练中使用 Solid Distance 参数 "增长 "特征的大小,以反映其真实世界的大小。
多边形 ROI 是标记具有不规则尺寸和形状的特征的最佳选择。当想定义特征的边界和形状时,使用多边形。然而,绘制多边形可能会比使用点或多线花费更多时间。
对于点ROI,在图像窗口中单击对象的中心添加点。然后右键单击并选择 "接受点"。下图显示了在住宅车道上绘制点 ROI:
对于多条线或多边形,在 "图像 "窗口中单击以添加线段。要在绘制每条多线后完成每条多线,选择完成并接受多线。要在绘制后完成每个多边形,选择 "完成并接受多边形"。如下图所示:
在训练栅格中的每个特征实例上绘制ROI。尽量包含感兴趣的特征的各种形状、颜色和纹理,这将有助于提高最终分类的准确性。
在某些情况下,可能希望创建一个完全由背景像素组成的标签栅格,而没有特征像素。要做到这一点,在 "图层管理器 "中右键单击输入的栅格,然后选择 "新建感兴趣区域"。在 "感兴趣区域(ROI)工具 "中,接受ROI #1的默认ROI名称,将创建一个空的ROI。然后在从ROI工具中构建标签栅格的输入ROI字段中选择ROI。
标记好训练栅格后,可以训练基于mask的TensorFlow模型,从而了解特征。该模型可以为空,也可以事先进行训练。
训练深度学习模型涉及许多随机过程,这些过程包含一定程度的随机性。使用相同参数进行训练将产生不同的模型,这是因为算法尝试收敛到结果的方式,并且它是训练过程的基本部分。
还可以编写脚本来使用ENVITrainTensorFlowMaskModelTask训练模型。
可以分为以下几个部分:
在开始训练之前,必须建立或初始化TensorFlow模型。这定义了模型的结构,包括体系结构,补丁大小和将用于训练的波段数。如果要恢复以前训练的模型,则无需初始化。
还可以编写脚本来使用ENVIInitializeENVINet5ModelTask(单类)或ENVIInitializeENVINet5MultiModelTask(多类)来初始化模型。
架构是定义底层卷积神经网络的一组参数。 ENVI深度学习使用的架构(称为ENVINet5和ENVINet5Multi)基于Ronneberger,Fischer和Brox(2015)开发的U-Net架构。与U-Net一样,它们是基于掩码的编码器-解码器体系结构,可对图像中的每个像素进行分类。
Patch是提供给模型进行训练的小图像。可以在以下步骤中初始化模型时指定Patch Size和波段数量:
出现训练TensorFlow Mask Model对话框。
也可以单击从数据管理器添加按钮以加载一个或多个在数据管理器中已经打开的标签栅格。
此处描述的参数是为为了在训练期间更好地控制TensorFlow模型学习识别特征。都是可选的,可以参阅“训练背景“以了解有关这些参数的更多信息。
如果不确定如何设置这些字段的值,则可以使用ENVI Modeler创建随机值。有关详细信息,参见下面的使用ENVI Modeler训练深度学习模型。
如果有训练效果较好的参数,也可以单击从模型导入参数以使用先前训练过的TensorFlow模型中的相同值。
一个Batch包括一次完整的训练。模型参数在每次迭代结束时进行调整。Batch在一个Epoch中运行,直到达到或超过每个Epoch的Patch数量。下表提供了一些有关选择此值的粗略指导,具体取决于指定的Patch Size和图形卡的内存大小。每Batch至少4个Patch,训练通常更稳定。具体值可以根据其他进程消耗多少图形内存以及选择多少个波段而有所不同。
Graphics Memory | Patch Size | Patches per Batch |
16 GB | 704 | 4 |
16 GB | 464 | 9 |
12 GB | 608 | 4 |
12 GB | 464 | 7 |
8 GB | 672 | 2 |
8 GB | 464 | 4 |
4 GB | 464 | 2 |
4 GB | 320 | 4 |
2 GB | 464 | 1 |
2 GB | 224 | 2 |
在Train TensorFlow Mask Model对话框中单击确定。
由于涉及到计算,因此训练模型需要大量时间。根据系统和图形硬件,处理可能需要几分钟到几小时。训练模型对话框显示了进度以及更新的验证损失值:
同时,在Web浏览器中会显示一个TensorBoard页面。TensorBoard是TensorFlow随附的可视化工具包,用于报告训练期间的实时指标,例如损失、准确性、准确性和召回率。
在每个Epoch,都会调整模型的权重以使其更正确,并且标签栅格将再次暴露给模型。产生最小验证损失的Epoch的权重将用于最终的训练模型。例如,如果希望模型完成25个Ecpoch,并且在第20个Ecpoch期间实现了最低的验证损失,则ENVI将在训练的模型中保留并使用该Ecpoch的权重。
ENVI深度学习包括两个可以在ENVI Modeler中运行的预构建模型。ENVI Modeler是一个可视化的编程工具,可让ENVI中构建自定义数据处理工作流。
注意:此处描述的预构建“模型”不是深度学习模型,而是与ENVI Modeler一起使用的模型文件。
可以从“深度学习流程化工具”中的“工具”菜单访问预构建的模型。一种模型提供用于训练深度学习模型的简单工作流,另一种模型为各种训练参数生成随机值。
Deep_Learning_Tutorial.model模型文件可以训练一个深度学习模型并用来多分类。输入训练栅格和 ROI 文件,并使用它们来训练 TensorFlow 模型。它使用训练的模型对输入的栅格进行分类。这个示例模型提供了一种在ENVI深度学习中一次性运行所有步骤的方法,而不必单独选择和运行工具。
模型中的每个黄色节点均基于特定的ENVITask。在这种情况下,模型将运行以下任务:
该模型运行了几分钟。完成后,结果分类栅格将显示在“图像”窗口中,并将其添加到数据管理器中。
名称为Deep_Learning_Randomize_Training.model的ENVI Modeler文件,该文件可多次运行ENVI深度学习,每次都有一组不同的随机训练参数。它接受输入TensorFlow模型以及训练和验证栅格。每次训练运行都会产生一个新的TensorFlow模型,该模型用于对图像进行分类。 每个结果分开显示,以便确定哪个训练运行产生最佳的TensorFlow模型。 当不熟悉用于数据的最佳训练参数值时,运行此ENVI Modeler模型文件可提供一种有效的方法来训练TensorFlow模型。
模型中的每个黄色节点均基于特定的ENVITask。灰色节点提供有关使用和修改模型的提示。
该节点的目的是设置ENVI Modeler模型运行的条件。例如,可以选择仅在输入栅格满足特定条件(例如多光谱,具有有理多项式系数(RPC)空间参考或数据类型为“字节”)时运行模型。要查看和选择任何这些条件,单击“迭代器”对话框中的“示例”下拉列表。
过滤器表达式可用于跳过Sobol序列的一部分以继续或分配实验。例如,如果随机化程序最初以五次迭代运行,那么将完成五次深度学习运行,每一次都有不同的参数集。如果这些结果不可接受,则可以通过将“迭代次数”值设置为10并在“过滤器表达式”字段中键入%i ge 5来在序列中再运行五次迭代。同样,可以在多个ENVI实例之间(也许在不同的系统上)拆分运行。
由于它为每次迭代执行完整的训练,所以该模型需要很长时间才能运行。完成后,结果分类和类激活栅格将显示在“图像”窗口中,并添加到数据管理器中。将色彩密度分割应用于类激活栅格。
训练的实质是将标签栅格重复暴露于模型。随着时间的流逝,模型将标签栅格中的光谱和空间信息转换为类激活栅格,以突出显示训练期间明显的特征。在第一轮训练中,模型尝试进行初始猜测并生成随机类激活栅格,将其与标签栅格的mask波段进行比较。通过拟合函数(也称为损失函数)的优度,模型可以了解其随机猜测在哪里出现误差。以调整模型的内部参数或权重以使其更正确,然后将标签栅格再次暴露给模型。
但在实际操作中,数据并不是一次性全部用于训练。而是从标签栅格中提取给定大小的方形Patch,每次只给几个Patch进行训练。
ENVINet5架构图显示了一个模型如何处理单个Patch。ENVINet5架构是为单类训练工作流程设计的。该架构有5个 "层次 "和27个卷积层。每个层次代表模型中不同的像素分辨率。本例使用的Patch Size为464 x 464,有3个波段。输出结果之一是类激活栅格,它被转换为掩码,并与标签栅格的mask波段进行比较。
在ENVI Deep Learning 1.1版本中,引入了该架构的变体(称为ENVINet5Multi)来处理多个特征/类的训练。
架构的上下文视野(contextual field of view)表示在训练过程中,周围区域对每个像素的贡献有多大。对于ENVINet5架构,上下文视野是185 × 185像素。比上下文视场大的Patch Size可以一次进行更多的训练,分类速度更快。为了让模型学习大于185 x 185像素的形状,必须对训练栅格进行降采样[g_2] 。
可以通过指定Epoch数、每个Epoch的Patch数和每个Batch的Patch数来指示要执行多少训练。下面将介绍这些内容:
在传统的深度学习中,一个Epoch是指将整个数据集通过一次训练。然而,在ENVI深度学习中,Patches是以一种智能的方式从标签栅格中提取的。因此,在训练开始时,特征像素密度高的区域比密度低的区域被看到的次数更多。在训练结束时,所有的区域被看到的频率更加平等。由于这种偏向性决定了补丁的提取方式,ENVI深度学习中的一个Epoch则是指在调整偏向性之前训练了多少个Pctches。
为了充分训练一个模型,需要多个epochs。Epochs数和每个Epoch的Patches数取决于正在学习的特征集的多样性,没有确切的数字。一般来说,应该有足够多的epochs来顺利地调整权重;建议的数值是 10 到 30。一旦指定了epochs的数量,每个epoch的Patchs数量就决定了训练的数量。对于小数据集,Patchs数量应该较低。对于大数据集,这个数字应该较高,数值通常在 200 到 1000 之间,但对于大型数据集来说可能会高得多。
训练过程通常不会一次只训练一个Patch。通常在一次迭代中同时使用多个Patch。batch指的是在一次迭代训练中使用的训练Patch集。Batch在一个 epoch 中运行,直到达到或超过每个 epoch 中指定的Patch数量。通常情况下,应该尽可能多地指定适合图形处理单元(GPU)内存的Patches数量。例如,对于大小为464 x 464和三个波段的Patch,以及8 GB的GPU内存,该值约为4。
名词 | 定义 |
Epoch | 使用训练集的全部数据对模型进行一次完整训练,被称之为“一代训练” |
Batch | 使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新,这一小部分样本被称为“一批数据” |
Iteration | 使用一个Batch数据对模型进行一次参数更新的过程,被称之为“一次训练” |
epoch:训练时,所有训练数据集都训练过一次。
batch_size:在训练集中选择一组样本用来更新权值。1个batch包含的样本的数目,通常设为2的n次幂,常用的包括64,128,256。网络较小时选用256,较大时选用64。
iteration:训练时,1个batch训练图像通过网络训练一次(一次前向传播+一次后向传播),每迭代一次权重更新一次;测试时,1个batch测试图像通过网络一次(一次前向传播)。所谓iterations就是完成一次epoch所需的batch个数。
Epoch:一个超参数,定义了学习算法在整个训练数据集中的工作次数。通俗点,Epoch的值就是整个训练数据集被反复使用几次。“Number of Epochs”参数,输入要运行的Epoch数。训练参数在每代结束时进行调整。默认值为25。回答了全部训练数据使用了多少遍?
Batch:使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新,这一小部分样本被称为“一批数据”。“Number of Patches per Batch”参数,输入每Batch(批次)要运行的训练Patch(样本)的数量,称为Batch Size。如果未指定该值,则ENVI将自动确定合适的值。每批次更新参数需要训练多少Patch(样本)?
Patch:Patch是提供给模型进行训练的小图像(样本)。“Number of Patches per Epochs”参数,输入每个Epoch要使用的训练Patch(样本)的数量。如果未指定值,则ENVI将自动确定要使用的合适值。每遍训练的输入多少Patch(样本)?
问题:一个Epoch包含了多少个Batch?Batch在一个Epoch中运行,直到达到或超过每个Epoch的Patch数量,所以Batch数量是1至Patch数量。
Number of Batches=Number of Patches/ Batch Size
即:Number of Batches=Number of Patches per Epoch/Number of Patches per Batch)
ENVI使用专有技术来训练深度学习模型,该技术基于偏置的Patch选择。通常,训练TensorFlow模型时以相等的概率选择Patch训练。如果图像中代表感兴趣的特征的像素是稀疏的,那么在整个图像中平均选择Patch可能会导致模型学习产生一个完全由背景像素组成的Mask。
为了避免这种情况,ENVI引入了一个偏置,使模型更频繁地看到具有较高特征像素密度的斑点。该方法基于一种称为逆向变换采样的统计技术,其中喂给模型的样本与它们对概率密度函数的贡献成正比。这种偏置是使用"类别权重 "参数来控制的。可以为"类别权重 "设置最小值和最大值。最大值用于在训练开始时偏置选择Patch。当训练结束时,该值会降低到最小值。
在大多数情况下,最小值应该是0,以便在最后一个Epoch模型完成时看到特征与背景像素的实际比例。为了帮助确定一个合适的最大值,记住,当正例与负例的比例约为 1:100 时,机器和深度学习应用通常会产生更好的结果。
可以使用附加的“损失权重”参数来使损失函数产生偏差,从而比识别背景像素,更侧重于正确识别特征像素。当要素稀疏或未标记所有要素时,此功能很有用。值为0表示模型应平等对待特征像素和背景像素。增加损失权重会使损失函数偏向寻找特征像素。有用的值范围在0到1.0之间,默认值为0.8。
还可以设置 "Patch采样率 "参数,以指示应该使用的采样密度。这是训练和验证栅格中每个像素所属的平均Patch数。当特征稀疏时,增加该值可能会有所帮助,因为选择包含特征的Patch的可能性更大。对于较小的patch sizes,在稍有不同的位置对特征像素进行过采样,增加采样值可使模型更通用。减少该值的唯一原因是要素密集并且不需要使用训练Patch多次覆盖每个像素。这可以帮助加快训练时间。
除了对特征和背景像素进行加权外,训练过程还必须考虑特征的大小和边缘。接下来会介绍这个问题。
补充内容:
逆变换采样(逆采样):在蒙特卡罗方法中,有一个关键的问题需要解决,即如何基于概率密度函数去采的n个x的样本集。对于常见的分布,如均匀分布,高斯分布,指数分布,t分布,F分布,Beta分布,Gamma分布等,可以采用逆采样的方法进行采样。
逆变换采样(Inverse Transform Sampling)。假设待采样的目标分布的概率密度函数为p(x),它的累积分布函数为
则逆变换采样法按如下过程进行采样:
(1)从均匀分布U(0,1)产生一个随机数ui;
(2)计算 是累积分布函数的逆函数。
如果待采样的目标分布的累积分布函数的逆函数无法求解或者不容易计算,则不适用于逆变换采样法。此时可以构造一个容易采样的参考分布,先对参考分布进行采样,然后对得到的样本进行一定的后处理操作,使得最终的样本服从目标分布。常见的拒绝采样(Rejection Sampling)、重要性采样(Importance Sampling)
实心距离 Solid Distance
在标注要训练的要素时,在感兴趣的要素周围绘制多边形可能很麻烦。如果更关心对要素计数,而不是精确地捕获其形状(或对其进行mask),则可以使用折线或点来标记要素。提供“实心距离”参数可扩展线性和点要素的大小,以便它们完全代表其关联的真实世界对象。以涂漆的道路中心线为例。使用兴趣区(ROI)工具收集道路中心线的样本时,应使用折线ROI。折线的宽度为一个像素,但实际上,TensorFlow模型需要学习关联的道路中心线有限宽度(大约10英寸)。
实心距离值是指标签周围所有方向的像素数,这些像素也是目标特征的一部分。可以使用 "实心距离 "来扩展多边形特征的大小,但它的用途是有限的。它最常用于点和多线特征。定义 "实心距离 "值往往对具有相当一致宽度的线性特征(如道路、道路中心线和运输集装箱)或具有相当一致尺寸的紧凑特征(汽车和停车标志)很有效。可以使用 ENVI 工具栏中的 Mensuration 工具来测量从 ROI 点或多段线到特征边缘的长度。在出现的光标值对话框中,选择单位下拉列表中的像素选项。
例如,如果在一辆汽车的中心添加一个宽约34像素的点标签,标签周围17像素的半径将涵盖汽车的大部分。因此,实心距离值将是17。
模糊距离 Blur Distance
深度学习算法在学习建筑物等特征中的mask尖锐边缘时可能会有困难。在训练过程中模糊边缘并降低模糊度可以帮助模型逐渐聚焦于特征。为了控制这一点,设置最小和最大模糊距离。在训练开始时,特征会以从特征边缘(如果定义了实体距离,则包括这些距离)到最大模糊距离的衰减梯度展开。随着训练的进行,距离逐渐减小到最小值。
一般来说,设置最大模糊距离,使其在模型的上下文视野内充分模糊。在ENVINet5架构中,这是185×185像素。所以合理的最大模糊距离应该是几个像素到不超过70。将最小模糊距离设置在任何地方,从边界清晰的0到特征边界不清晰时的几个像素。
可以使用 TensorBoard 或通过查看训练模型的元数据来评估一个或多个训练会话的性能。TensorBoard 选项可提供更详细的信息和来自训练会话的实时准确性指标。
训练开始时,TensorBoard在网络浏览器中显示。TensorBoard是TensorFlow的可视化工具包。它报告与训练相关的关键指标。详细信息参阅在线文档(https://www.tensorflow.org/tensorboard )。
注意:要关闭TensorBoard,在“ ENVI首选项”中设置。
训练开始时,TensorBoard在scalars仪表板中显示损失、精度、准确性和召回率的实时图。
损失(Loss)是一个无单位的数字,表示分类器与验证训练数据的拟合程度。值为0表示完美契合。值距0越远,拟合精度越低。对于训练数据集和验证数据集,每个Epoch内完成的Batches和已完成的Epoch,都有单独的Loss图。理想情况下,在epoch_loss和epoch_val_loss图中报告的损失(loss)值应该在最初的几个epoch中迅速减少,然后随着Epoch数的增加而趋于0。epoch_val_loss 图对应于模型训练时训练模型对话框中显示的 "损失(loss)"值。下图是训练过程中的验证数据集的loss:
在这个例子中,Train TensorFlow Mask Model对话框中的Number of Epochs值最初设置为25。然而,可以看到损失(Loos)值在第8个Epoch左右接近0(图中x轴所示)。此时,可以通过单击训练模型进度对话框中的 "取消 "按钮选择停止训练,因为不需要进一步的Epoch。
TensorBoard 通过在训练过程中指定的 "Number of Epochs "来报告每个Epoch的验证损失值。每一个 epoch,都会调整模型的权重,使其更加正确,标签栅格也会再次暴露给模型。产生最低验证损失的epoch的权重将用于最终的训练模型。例如,如果想让模型完成 25 个epoch,并且在第20个epoch实现了最低的验证损失,ENVI 将在训练模型中保留并使用该纪元的权重。
TensorBoard 还会报告以下精度指标:
准确率(也叫分类准确率或总体准确率):模型得到正确预测的数量与预测总数的比率。对应于epoch_acc和epoch_val_acc图。
精确度(也叫用户精度):预测某个类别中的值确实是该类别的概率。这个概率是基于正确预测的值占预测为某类的总值的比例。对应于epoch_precision和epoch_val_precision图。
召回率(也叫生产者精度)。这是一个给定类别中的值被正确分类的概率。对应于epoch_recall和epoch_val_recall图。
补充:
二分类四个不同的结果:真正例(TP)、假正例(FP)、真反例(TN),以及假反例(FN)。
列表示真实值,行表示预测值。
准确率(Accuracy):预测正确的占总样本数的比例。
Accuracy=(TP+TN)/(TP+FP+TN+FN)
虽然准确率能够反映总的正确率,但是在样本不均衡的情况下,并不能作为很好的指标来衡量结果。
精确率(Precision):也叫查准率。代表对正样本结果中的预测准确程度。其含义是在被所有预测为正的样本中实际为正样本的概率。
P=TP /(TP+FP)
召回率(Recall):也叫查全率。召回率是覆盖面的度量。衡量了分类器对正例的识别能力。含义是在实际为正的样本中被预测为正样本的概率。
R=TP /(TP+FN)
F1 Value
目标:希望精确率和召回率都很高,但实际上是矛盾的,无法做到双高。因此,选择合适的阈值点。但通常情况下,可以根据他们之间的平衡点,定义一个新的指标:F1分数(F1-Score)。F1同时考虑精确率和召回率,让两者同时达到最高,取得平衡。F1表达式为
如果在“Display TensorBoard During Training''首选项设置为“否”,则训练期间将不会显示TensorBoard。但是,可以按照以下步骤查看训练指标:
要删除先前训练运行的报告,在TensorBoard对话框中单击“删除历史记录”按钮,然后选择要删除的训练日志。 或者,从“Deep Learning Guide Map”菜单栏中选择“训练指标”>“删除训练历史记录”。
还可以编写脚本以在培训期间显示TensorBoard或使用ENVITensorBoard启动和停止TensorBoard服务器。
深度学习模型训练完后,其元数据将包含各种准确性指标,可以通过“Deep Learning Guide Map”进行查看。参照以下步骤查看指标:
验证损失(validationLoss):一个无单位的数字,表示分类器对验证训练数据的拟合程度。值为0代表完美拟合。该值离0越远,拟合的精度越低。
验证准确度(validationAccuracy):是一个无单位的数字,表示分类器与验证训练数据的拟合程度。这是模型正确的预测数与总预测数的比值。
验证精度(validationPrecision)。这是被预测为某一类的值的概率,它真的是那一类。这个概率是基于正确预测的值占预测为某类的值总数的比例。
验证召回率(validationRecall)。这是某类中的一个值被正确分类的概率。
validationF1,也叫F1得分,是精度和召回率的调和平均值。
使用TensorFlow Mask Classification工具,使用经过训练的TensorFlow模型对栅格进行分类。需要多次运行此工具以对多个栅格进行分类。输出是分类栅格和类激活栅格。
还可以使用ENVITensorFlowMaskClassificationTask编写脚本以对栅格进行分类。
注意:如果安装带有ENVI 5.5 Service Pack 2的ENVI®Py forArcGIS®版本1.3,则可以在ArcMap或ArcGIS Pro的ENVI深度学习工具箱文件夹中使用TensorFlow蒙版分类工具。
参照以下步骤执行分类:
分类栅格的像素值范围从0(背景)到类数,如下图。背景像素被涂成黑色,并指定为“未分类”。这些类别代表了龙卷风造成的不同程度的财产损失:
参照步骤将分类栅格叠加在输入栅格上:
例如:
也可以通过点击ENVI工具栏中的 "注释 "下拉菜单,选择 "图例",然后在显示中点击来显示分类图例。
类激活栅格
如果选择创建并显示类激活栅格,则它将作为前三个波段的彩色复合显示,并添加到“层管理器”的顶部。 在“图层管理器”中取消选中颜色合成图层,然后将类激活栅格的各个区域从“数据管理器”拖到视图中。 例如:
类激活栅格的每个波段显示了每个特征类的匹配概率(0到1)。明亮的像素表示与特征的高匹配度。下图显示了 "表面损伤 "类(左)的类激活栅格的一个小样本,显示在真彩色图像旁边。
栅格色彩密度分割有助于可视化与感兴趣的特征匹配概率最高的像素。按照以下步骤创建色彩密度分割:
分类后工具
既然有了类激活栅格,就可以选择对其应用阈值,并将最高像素值转换为分类图像,像素ROI,多边形ROI,折线shapefile或多边形shapefile。
创建分类图像和类激活栅格是使用ENVI深度学习从图像中提取特征的最后一步。但是,结果可能包含误识别。可以优化结果并使用它们来改进训练的模型,这可以获得更准确的分类。为此,使用“ ENVI感兴趣区域(ROI)”工具编辑从“类激活到像素ROI”或“类激活到多边形ROI”工具创建的ROI。可以使用ROI工具删除误识别记录或在更多示例上绘制新的ROI。将已编辑的ROI保存到磁盘上的新文件中。可以将精炼的ROI与原始ROI结合使用,以再次训练新模型或完善训练后的模型。
标记特征和训练深度学习模型并不总是简单的过程。虽然通常可以通过只标记几个特征和接受默认的训练参数来获得良好的结果,但通过在这些步骤中投入一些时间,会得到更准确的结果。一旦建立了一个好的模型来寻找特定的特征,就不必重新训练它。可以一次建立它,并多次使用它来分类不同的图像(只要它们具有相似的光谱和空间属性)。
如果得到的类激活栅格完全是黑色的,有可能是模型无法准确重现训练数据。或者,也许训练确实收敛了,但收敛到了一个不正确的解。如果发生这种情况,需要重新运行训练步骤,看看是否产生有效的结果。也可以尝试增加 "类权重 "和/或 "模糊距离 "的最大值。
如果不确定如何设置训练参数,可以使用 ENVI Modeler尝试许多随机组合。
不应该尝试屏蔽掉输入图像中不需要的特征,如云或水像素。ENVI深度学习中不支持栅格掩膜(Mask),因为可能导致无效的分类结果。
通过Deep Learning Guide Map访问的单类训练过程使用ENVINet5架构,该架构在ENVI深度学习1.0版本中引入。
多类训练过程使用新的ENVINet5Multi架构,该架构是在ENVI深度学习1.1版本中引入的。
如果收到与CUDnn相关的错误信息,使用系统的设备管理器禁用并重新启用显卡。或者,重新启动系统。
如果收到类似以下的错误信息,尝试减少训练步骤中的Number of Patches per Batch值。这个错误信息表明在训练过程中出现了内存问题。
Error:tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[6,128,392,392] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
如果安装了 ENVI® Py for ArcGIS® 1.3 版和 ENVI 5.5 Service Pack 2,则 ArcMap 或 ArcGIS Pro 中的 ENVI 深度学习工具箱文件夹中会有一个"TensorFlow Mask Classification"工具可供使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。