TowardsDataScience 博客中文翻译 2021(二百二十七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

基于深度学习的癌症患者分层

原文:https://towardsdatascience.com/deep-learning-based-cancer-patient-stratification-a12f4e2615f2?source=collection_archive---------21-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

国家癌症研究所Unsplash 上拍摄的照片

癌症是一个重大的公共卫生和经济问题,其负担日益加重。仅在美国,它就占了 900 亿美元的直接医疗费用。开发一种抗癌药物要花费 27 亿美元。每年大约有 950 万人死于癌症。这比世界上一些大城市的人口还要多。我们的 Arcas 项目旨在通过在几十年的基因组技术基础上采用最先进的数据整合和分析方法来改善这种情况。

为什么癌症负担这么高?

开发药物并将其提供给患者是一个漫长而耗时的过程。首先,一种需要到达患者体内的化合物,必须经过临床前研究和临床试验的不同阶段。接下来是批准程序,最后医生必须开处方,并相信这可以帮助病人。有时这类药物需要在指南中列出才能被开出——即使它们被批准了。可以肯定地说,这个过程的每一步都存在许多低效之处。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1 :药物研发流程和基因组学数据的使用。作者图片

效率低下最常见或最具影响力的原因是在流程链的不同部分采用了过于简单和狭隘的方法。这里有一个例子:我们说癌症是一种基因组疾病,然而,癌症患者很少得到他们的基因组测序和解释。当他们这样做时,只有几百个基因被测序。信息,如影像学和组织病理学分期等。是有用的,但是提供了疾病的有限图像。因此,如果你不考虑整个基因组,很多信息就会丢失。这是治疗决策的情况,也是药物开发的情况。

现在很清楚,对治疗的反应,特别是对靶向药物的反应,强烈依赖于肿瘤的遗传、表观遗传、转录组构成以及肿瘤微环境(例如: WINTHER 试验)。所有这些在不同的癌症之间有很大的不同,甚至来自同一组织。因此,必须根据癌症的基因型/表观基因型/转录组来评估药物反应。此外,许多药物之所以会失败,仅仅是因为它们只对一部分癌症有效,而这一点在试验时并没有得到最初的认识。

许多药物之所以会失败,仅仅是因为它们只对一部分癌症有效,而这一点在试验时没有得到最初的认识

用于临床变量建模的多组学模式

消除这些问题的一个方法是接受临床变量,如药物反应,是由基因组/转录组/表观基因组模式驱动的,而不仅仅是由单个基因的突变驱动的。一旦我们接受了这一点,我们就必须有有效的方法来分析来自癌症活检或肿瘤模型的多水平数据集,如多组学。多组学数据的有效整合将为临床变量建模提供无假设或假设稀疏、数据驱动和整合的方法。

“一种无假设或假设稀疏、数据驱动和集成的临床变量建模方法。”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2 :癌症组学的数据整合可以提供预测临床变量的分子模式。作者图片

在 Arcas,我们开发了这样的框架,它使用深度学习来整合任何类型的组学数据,并发现分子模式,或所谓的潜在因素。潜在因素可用于 1)聚类/亚型检测或绘制疾病模型和原发肿瘤——类似于生物搜索引擎。想象一下,你可以为你的疾病模型输入多组学数据,我们可以告诉你这些模型最能代表哪些原发性癌症。此外, 2)我们可以对生存和药物反应等变量进行建模。此外,3)我们还可以解释潜在的因素,并了解它们对应于哪些分子机制或途径

使用深度学习进行患者分层

分子模式或潜在因素可以根据预后或对药物的反应或任何其他临床变量对患者进行分层。我们已经将部分 Arcas 技术应用于结肠直肠癌。结肠直肠癌主要使用基因表达谱定义了四种亚型。这些亚型被称为共有分子亚型或 CMS。该联盟定义了四种亚型,它们具有不同的分子特征,在某种程度上与存活率相关,然而 19%的患者不能被归入特定的亚型。

我们能用潜在因素预测亚型吗?

如果这些分子模式,即潜在因素,包含相关信息,我们应该能够从中预测 CMS。这里我们看到的是一个接收器工作特性曲线,或 ROC 曲线,它显示了一个分类器有多好。在我们的病例中,ROC 曲线显示潜在因素能够预测 CMS 亚型。我们比较了我们的方法与其他方法,也产生潜在的因素或相关的主成分。在所有情况下,我们的预测精度更高。在图 3 的右侧,我们根据 CMS 状态对潜在因素的 2D 投影进行了颜色编码。每个点是原发性肿瘤,由 CMS 状态着色。你可以看到颜色的分离,这意味着有关于 CMS 状态的潜在因素的信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3 :利用深度学习获得的潜在因子预测亚型更加准确。左,与其他工具相比的准确性。右,通过减少 2D 的潜在因素来表现结肠直肠肿瘤。从作者的公开出版物【https://pubmed.ncbi.nlm.nih.gov/31792061/. 获得的情节

细化子类型

我们可以使用这项技术进一步细化子类型。您可能已经注意到,在图 3 中,有比基于 CMS 的颜色更多的聚类。如果我们应用聚类算法,我们可以找到六个聚类。最大的区别是我们把 CMS2 分成两个集群。从生存的角度来说,这其实很有道理。在图 4 中,我们展示了这两个新集群的生存曲线,它们非常不同。因此,将 CMS2 分成两个亚型是合理的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4 :结直肠癌细化亚型。绿点和蓝点代表 CMS2 亚型,然而根据这两个组的不同生存特征,根据潜在因素聚类的建议将该亚型分成 2 个亚型更有意义。从作者的公开出版物https://pubmed.ncbi.nlm.nih.gov/31792061/获得的情节

对其他癌症也有效

我们应该强调的一点是,这种方法并不局限于特定的癌症类型。它适用于任何具有多组学信息的数据集,包括肿瘤模型,如细胞系、PDX 或类器官。事实上,你可以用我们的方法整合细胞系、PDX 和原发肿瘤——这在正常情况下是很难做到的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5 : Arcas 平台比使用临床特征改善了生存预测。作者图片

我们已经在至少有 100 个样本的癌症基因组图谱数据集上运行了这个,在图 5 中,我们显示了我们改善了多少 C 指数。c 指数是生存预测准确性的一个衡量标准。我们展示了当我们试图仅通过使用临床变量,如年龄、性别和肿瘤分期来预测生存率时会发生什么——与临床变量+潜在因素进行比较。正如你所看到的,在许多癌症中,当使用潜在因素时,我们将这个准确性指标推向了一个更高的水平。

结论

随着测序价格的下降,构建和运行我们的模型所需的数据变得越来越容易生成。在不久的将来,液体活检和活检将通过多组学方法进行常规分析。整合和理解这些数据集是改进药物开发和诊断过程的关键。我们的 Arcas 平台从肿瘤活检或疾病模型的多组学数据集提供可操作的见解。

【https://arcas.ai/blog/】本文原载于https://arcas.ai/blog/

用于 3D 合成的深度学习

原文:https://towardsdatascience.com/deep-learning-for-3d-synthesis-2dd57e2001f?source=collection_archive---------3-----------------------

人工智能的现状

变压器与卷积深度网络用于合成 3D 数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由迪奥戈·努内斯Unsplash 拍摄

3D 数据简介

人们一致认为,从单一视角合成 3D 数据是人类视觉的一项基本功能,这对计算机视觉算法来说极具挑战性。但是,随着激光雷达、RGB-D 相机(RealSense、Kinect)和 3D 扫描仪等 3D 传感器的可用性和可负担性的提高,3D 采集技术的最新进展取得了巨大的飞跃。与广泛可用的 2D 数据不同,3D 数据具有丰富的比例和几何信息,从而为机器更好地理解环境提供了机会。然而,与 2D 数据相比,3D 数据的可用性相对较低,且采集成本较高。因此,最近已经提出了许多深度学习方法来从可用的 2D 数据合成 3D 数据,而不依赖于任何 3D 传感器。但是在我们深入研究这些方法之前,我们应该理解处理 3D 数据的格式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 2D 输入的 3D 合成

基于数据的最终用途,合成的三维数据可以用不同的格式表示。一些常用的格式有:

  1. 深度图像
  2. 点云
  3. 体素
  4. 网状物

深度图像包含一个场景的深度值,其形式为图像帧中每个像素与相机的距离(米)。这种来自场景的深度信息对于许多任务都具有巨大的价值,如自动驾驶汽车、增强现实、机器人等。这种信息对于像在相机扫描静止场景和虚拟相机中的动画时启用运动视差这样的任务非常有用,但是当强调场景中的特定对象用于 3D 建模时,这种信息在现有技术中变得不充分和不准确

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

深度图像

****点云是分布在三维空间中的三维点的集合。这些 3D 点中的每一个都具有由某个(x,y,z)坐标以及其他属性(如 RGB 颜色值)表示的确定性位置。与深度图像不同,点云表示保留了更多高质量的三维空间几何信息,无需任何离散化。然而,点云表示在点之间没有局部连接,从而导致非常大的自由度和高维数,这使得精确合成更加困难。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点云表示

****体素或体积像素是空间网格像素到体积网格体素的直接延伸。简单来说,体素就是三维空间中的一个像素。每个体素的相对位置一起定义了体积数据的独特结构。一个体素可以看作是一个固定大小的量化点云。然而,对于 3D 建模,体素表示太稀疏,并且显示出细节和计算资源之间的折衷,这使得其更不可行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

体素表示

****多边形网格是边、顶点和面的集合,它们共同定义了多面体对象的形状和体积。网格的凸多边形面连接在一起,近似于一个几何曲面。与体素类似,网格也可以看作是从一组连续曲面上采样得到的三维点云集合(复杂度相对较低)。网格面可以是三角形(三角形网格)、四边形(四边形网格)或凸多边形(n 边形网格)。接近更真实的表示,网格也可以由带孔的多边形或凹多边形组成,这取决于表示的通用性。然而,与体素和点云不同,体素和点云会丢失重要的表面细节,且对于重建表面模型来说不是微不足道的,网格对于许多实际应用来说是更理想的。因此,考虑到以上几点,与其他格式相比,多边形网格似乎更真实,也是合成的更好的表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

多边形网格表示

在这篇博客中,我们将讨论三种可用于从 2D 数据合成 3D 数据的方法。在这三种方法中,一种方法基于基于变换器的架构,而另外两种方法分别基于自动编码器和基于图的卷积神经网络。这两种方法之间的关键区别在于,与后者不同,基于变压器的深度网络完全依赖于注意机制来绘制输入和输出之间的全局依赖关系。

卷积神经网络

在本节中,我们将讨论最近提出的两种方法,它们使用自动编码器和基于图形的卷积神经网络来合成 3D 数据。

基于自动编码器的卷积神经网络

为了理解这种方法,我们将以使用自动编码器网络的 3D 人脸重建和人脸对齐为例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

人脸重建和人脸对齐

自动编码器使用卷积网络来将输入 2D 图像的维度降低到潜在空间,然后使用该潜在空间表示来重建原始 3D 数据格式。许多研究已经使用自动编码器(基于编码器-解码器的架构)来估计 3D 面部可变形模型系数和模型扭曲函数。这些研究的目的主要是使用这些 3D 模型扭曲函数从单个 RGB 图像恢复相应的 3D 形状,从而同时提供密集的 3D 人脸对齐和重建输出。然而,这种方法的性能受到由人脸模型模板定义的 3D 表示空间的限制。类似地,体积回归网络(VRN) [1]等方法使用全卷积层架构来估计三维二进制体积,作为点云的离散化版本。然而,大多数输出点对应于浪费的非表面点,并且这种离散化也限制了输出表示的分辨率。因此,要讨论的更好的研究将是类似位置图回归网络(PRN)[2]的网络,该网络使用 UV 位置和纹理图来联合预测密集对齐并重建 3D 人脸形状。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

UV 位置和纹理贴图的图解

PRN 以 UV 位置图的形式构建了 3D 面部结构的 2D 表示。UV 位置是记录面部点云的 3D 面部坐标的 2D 图像。该地图还在表示中的每个位置附加 3D 坐标的语义特征。简而言之,UV 贴图是 3D 数据的 2D 表示,它记录了 UV 空间中所有点的 3D 坐标。在计算机图形领域,研究人员经常使用 UV 空间和 UV 位置图来将 3D 空间参数化为 2D 图像平面。转到 PRN 的网络架构,网络采用输入 RGB 图像,并使用简单的编码器-解码器结构(自动编码器)将 2D 图像信息传输到 UV 位置图。自动编码器通过使用 10 个下采样残差块和 17 个上采样转置卷积块来拟合该传递函数,以最终预测 256×256×3 的 UV 位置图。学习的 UV 位置图有助于直接回归要合成的 3D 面部的最终 3D 结构和语义特征。对于像 PRN 这样的训练网络,我们只需要像 2D 图像到 3D 点云映射这样的数据集,这使得这种方法更有用,因为网络的输出格式不受特定 3D 模板或 3D 变形模型线性空间的限制。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

PRN 建筑

因此,考虑到该方法的简单性和有效性,PRN 似乎是从 2D 影像合成 3D 数据用于网络输出格式的最佳选择之一。

基于图的卷积神经网络

如前一节所述,大多数传统的基于自动编码器的深度学习方法利用点云和体素数据格式来合成 3D 数据。特别强调这两种数据格式的主要原因是流行的基于网格的网络架构所施加的限制。然而,点云和体素表示有其自身的缺点,如第一部分所述。因此,为了避免体素或点云表示的缺点,许多研究已经转向合成 3D 多边形网格数据,从应用的角度来看,这是更理想的格式。一些在合成网格数据方面非常有效的最佳架构设计方法包括基于图形的卷积神经网络。在本节中,我们将以王等人提出的方法为例。al [3] (Pixel2Mesh)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Pixel2Mesh 重建真实世界图像

Pixel2Mesh 是一个基于图形的端到端深度学习框架,它以单个 RGB 彩色图像作为输入,并将 2D 图像以更理想的相机坐标格式转换为 3D 网格模型。基于图形的卷积神经网络提取并利用 2D 图像中的感知特征,通过逐渐变形椭圆体直到其达到语义正确和优化的几何形状来产生 3D 网格。所采用的策略是一种由粗到细的方法,使得椭球体变形过程在几何上平滑和稳定。作者还定义了各种网格相关的损失函数,帮助网络捕捉更多的属性,以保证物理和视觉上吸引人的 3D 几何结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图像特征网络和级联网格变形网络

Pixel2Mesh 的结构主要由级联的网格变形网络和图像特征网络组成。图像特征网络负责从输入 2D 图像中提取感知特征,并将这些特征渐进地传递给基于图形的级联网格变形网络,以将椭球网格的几何形状渐进地变形为目标对象的 3D 网格。网格变形网络的图形卷积网络包含三个变形块以及两个中间图形展开层。变形块渐进地处理网格模型的输入图形,而中间图形展开层渐进地增加图形顶点以增加图形的信息保持能力,同时仍然保持数据的三角形网格结构。除了架构细节,Pixel2Mesh 基于图形的架构的主要优势之一是能够执行同步形状分析,类似于传统的基于图表的方法,直接针对曲面流形进行卷积运算。这种方法通过合并网格对象的两种自然表示(图形和表面流形)在基于图表的方法和 3D 重建方法之间充当桥梁。

基于变压器的深层架构

卷积神经网络广泛用于计算机视觉任务,因为它们具有端到端的能力来学习直接从数据执行任务,而不需要任何手工设计的视觉特征。然而,虽然 CNN 的架构设计在计算上要求很高,但是 3D 合成的任务使得这种计算更加密集,并且开启了计算优化和效率提高的大范围。展望下一代神经架构,变压器是可扩展视觉模型的最佳家族,不仅是领域不可知的,而且是计算高效和优化的。此外,最近的研究表明,变换已经在许多基于计算机视觉的任务上取得了最先进的结果。为了理解变压器在 3D 数据合成中的工作,我们将以 Deepmind 的 Polygen 为例[4]。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

PolyGen 生成的样本

Polygen 是一种直接模拟 n 边形 3D 网格的方法,它使用基于转换器的体系结构依次预测网格面和顶点。模型设计是这样的,它可以调节一系列输入(对象类、体素和 2D 图像),并从概率上产生输出,以捕捉模糊场景中的不确定性。该网络由顶点模型和人脸模型组成。顶点模型是一个屏蔽的变换器解码器,它无条件地表示顶点序列上的分布,以模拟网格顶点。而面部模型是基于指针网络的变换器,其有条件地表达可变长度输入顶点序列上的分布,以对网格面部建模。因此,简而言之,两个转换器模型的目标是通过首先生成网格顶点,然后使用这些顶点生成网格面,来估计 3D 网格上的分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于变形器的多边形顶点和面模型

Polygen 中使用的变压器架构受到 WaveNet、PixelRNN 和 pointer networks 等顺序模型的启发。这项工作还从多边形 RNN(使用多边形分割)中获得了重要的灵感,而顶点模型类似于 PointGrow [8]的定制自关注架构,使用自回归分解对 3D 点云进行建模。与顺序自回归模型相比,PointGrow 具有更浅的自关注架构,该架构通过对固定长度的点云输入进行操作,使用自关注机制来预测离散坐标分布。因此,Polygen 可以被认为是通过一种新颖的基于变压器的网络设计手段结合起来的一些最佳想法的均衡组合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

网格变形块和感知特征池操作

Polygen 的一个关键特性是能够根据输入上下文(上下文示例:2D 图像、对象类)调节输出。为了实现这种条件性质,顶点和面部模型的输入流被改变以结合上下文。对于像 2D 图像和体素这样的输入格式,首先使用域适当的编码器对输入进行编码,以便为变换器解码器检索上下文嵌入,从而在嵌入序列中执行交叉注意。而对于像对象类这样的输入格式,预学习类嵌入被投影到一个向量,该向量被添加到位于每个网络块中的自关注层之后的中间变换器预测表示中。这是完全可能的,因为顶点模型的一般性质使用简单的、有表现力的和高建模能力的变换器-解码器架构,该架构允许网络对来自不同域的数据进行建模。转换器使用其高效信息聚合的能力来捕捉网格顶点和对象几何体中存在的强非局部依赖性。

结论

在这篇博客中,我们讨论了两种主要的 3D 合成方法,即卷积深度网和基于变换器的深度网。新一代网络的变换器是以计算效率更高和优化的方式设计的,因此可以认为比传统的卷积网络领先了一步。然而,在接近实时推理场景时,transformers 还有很长的路要走,才能赶上我们在 autoencoder 一节中讨论的相对轻量级且快速的推理方法。然而,变形金刚拥有巨大的研究范围,它们的注意力机制能够有效地聚合信息并提取输入和输出之间的全局依赖关系,这使它们更有前途。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源

我的博客反映了我所从事的工作,并简单地传达了我对这些话题的理解。我对深度学习的解读可以和你不一样,但我的解读只能和我一样无误。

参考

[1] Jackson,A.S .,Bulat,a .,Argyriou,v .,Tzimiropoulos,g .,Jackson,A.S .。国际计算机视觉会议。(2017)

[2] 用位置图回归网络联合 3D 人脸重建和密集对齐

[3] Pixel2Mesh:从单幅 RGB 图像生成 3D 网格模型(ECCV2018)

【4】PolyGen:3D 网格的自回归生成模型

[5] 孙,杨,王,杨,刘,z,西格尔,J. E .和萨玛,S. E .点增长:自回归学习点云生成与自我关注。在2020 年计算机视觉应用冬季会议

利用语音命令数据集对音频进行深度学习

原文:https://towardsdatascience.com/deep-learning-for-audio-with-the-speech-commands-dataset-79f7023de903?source=collection_archive---------20-----------------------

在这里,我们在语音命令音频数据集上训练一个非常简单的模型,并分析它的失败案例,看看如何最好地改进它!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在过去的十年中,深度学习已经成为一种流行而有效的技术,用于学习各种不同的数据类型。虽然大多数人都知道深度学习在图像或文本中的应用,但深度学习也可以用于音频数据的各种任务!

在我之前从事自动驾驶汽车的工作中,我花了很多时间研究图像和 3D 点云的深度学习模型。虽然我们有一些很酷的音频处理应用程序,但我只是浅尝辄止,从未认真做过。

然而,在水族馆这里,我们有一些客户正在开发一些非常有趣的音频数据应用程序。我们最近举行了为期 3 天的黑客马拉松,所以我决定尝试为自己做音频深度学习。

在这篇博文中,我们将在语音命令音频数据集上训练一个非常简单的模型。然后,我们将使用 Aquarium 来分析其失败案例,并确定如何最好地改进模型。

如果你想继续下去,我在这个项目中使用的全部代码可以在这里找到。数据集和模型推论可以在这里访问

选择数据集

我寻找一个数据集,它不是太小而不能做任何有趣的事情,而是足够小,以至于我可以使用我的本地机器在其上训练一个模型,而不需要一个更好的分布式设置。

经过一番搜索,我找到了语音命令数据集,它由大约 1 秒长的人们说单个单词的音频记录以及包含背景噪音的片段组成。该任务是分类任务,其中模型收听音频片段,并对某个触发词是否被说出进行分类。

更好的是,还有一个漂亮的 Pytorch 示例,它加载数据集并在其上训练一个模型。对于这个项目,我使用了这段代码,做了一些相对较小的修改。我想从盒子里拿出一些相对的东西,训练它,然后理解它是如何以及为什么失败的。

与数据融为一体

首先,我下载了数据集,以了解数据集中的数据类型。在这个阶段,检查原始数据是否损坏/不正确是很重要的,但也要确保标签相当准确。它还让你感觉到这项任务有多困难——如果你作为一个人很难分辨出说的是什么单词,那么对于 ML 模型来说就更难了。

在这个阶段,最好的数据集检查工具是您的文件管理器!我点击了 Nautilus 中的各种文件夹,并聆听了数据的随机样本,以了解它们的“声音”是什么样的。粗略地看一下,每个类都有文件夹,其中包含该类发言人的音频文件。我听了这些音频文件大约 15 分钟,并确认这些音频文件似乎与它们所属的标签文件夹相匹配,因此数据集的基本质量似乎相当好。

专业提示:你可以在 Nautilus 中按住 shift 键单击一系列文件,在 VLC 播放器中打开它们,VLC 播放器将按顺序播放它们,这使得你可以非常快速地收听许多不同的音频剪辑。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

信不信由你,鹦鹉螺和 VLC 播放器是 ML 工具链的关键部分。

现在以编程方式加载数据集。好消息是已经有了一个加载数据并根据数据训练模型的例子。坏消息是,这是 Colab 笔记本代码,我不太喜欢笔记本代码。在我从示例中删除了所有这些内容之后,我开始研究如何以编程方式加载数据。

但是首先,一个音频文件实际上包含什么?为了理解这一点,我们必须复习一些物理和音频处理知识。声音基本上是一种振动——压力的变化——以波的形式在空间中传播。为了记录音频,计算机麦克风测量压力随时间变化的幅度,进行一些处理/压缩,并将其写入磁盘。

然而,现实中的声波是模拟信号,而计算机麦克风以数字方式记录和保存声音。这意味着如果一个人将实际的声波绘制成振幅随时间变化的图表,他将得到一个平滑连续的曲线。数字麦克风 随时间推移对该波形 进行采样——数字麦克风不是记录并保存连续的模拟波形,而是周期性地测量振幅(该时序被称为采样率),此外,振幅也不完全匹配真实振幅——它在某一分辨率下舍入到最近的振幅值,这由其 位深度 决定。记录下来后,计算机可以压缩并保存它随时间测量的量化振幅。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实际的模拟声波,用红色表示,是一条平滑连续的曲线。数字麦克风在不同的时间点对此曲线进行采样(用蓝色表示)并保存这些数据。来源

使用示例代码加载数据集时,每一行数据都包含:

  • 一种音频波形,表示为代表量化样本的一维数字阵列(如上图中的蓝色点)
  • 作为附加元数据的采样率(单位为 hz)。
  • 剪辑中说出的单词的标签(即模型将被训练来预测的类别)。
  • 扬声器 id。
  • 以区分来自同一说话者的多个记录。

然后,这些数据被分割成训练集(约 85k 行)、验证集(约 10k 行)和测试集(约 5k 行)。每个音频片段以 16kHz 采样,大多数片段的音频阵列为 16,000 长,这相当于 1 秒长的音频剪辑。然而,一些音频段短于 16,000 长,当神经网络需要固定长度的输入时,这可能是一个问题。

训练一个模特,和一些专业建议

现在我们了解了数据,是时候训练一个模型了。

Pytorch 示例代码在向模型提供数据之前做了一些简单的预处理。首先,如果有任何长度小于 1 秒的示例,它会用零填充它们,以确保它们与其他示例的长度相同。这确保了模型在固定大小的输入上训练。

def pad_sequence(batch):
    # Make all tensor in a batch the same length by padding with zeros
    batch = [item.t() for item in batch]
    batch = torch.nn.utils.rnn.pad_sequence(
        batch, batch_first=True, padding_value=0.)
    return batch.permute(0, 2, 1)

其次,它将音频重新采样到 8kHz,以减小输入的大小。

def get_transform(sample_rate):
    new_sample_rate = 8000
    transform = torchaudio.transforms.Resample(
        orig_freq=sample_rate, new_freq=new_sample_rate)
    return transform

之后,我们可以定义一个模型架构来训练这些数据。示例代码附带了一个相当简单的网络,它建立在波形的 1D 卷积之上。我要指出的是,这种模型架构与用于图像任务的架构非常相似,这也是深度学习在许多不同领域中被证明有用的部分原因。

我发现了一些在进行深度学习时相当有用的东西,这些东西没有包含在示例代码中,我一般会推荐给大多数开始深度学习项目的人。

  • 确保列车/ val /测试装置之间没有泄漏。否则,您的模型将在评估时处于不公平的优势,无法对其泛化性能做出准确的评估。当我用样本代码检查时,我发现训练集不恰当地包含了来自验证集和测试集的数据!这个 bug 可能与我在 Ubuntu 系统上运行这段代码有关,而不是像最初的例子那样在 Colab 笔记本上运行。
  • **在数据进入网络之前,检查/可视化预处理后的数据,并确认这是您所期望的。**根据我的经验,在数据预处理中可能会出现很多错误,这会搞乱您的模型训练。在 Matplotlib 中绘制一些数据点/用 simpleaudio 播放一些音频是检查数据预处理结果的简单方法。
  • **建立 Tensorboard 或类似的工具来监控你的训练进度。**这非常重要,因为它允许您观察您的训练+验证损失曲线,跟踪您的模型是否收敛,并确定它何时开始过拟合或欠拟合。
  • 每隔几个时期将模型权重的检查点保存到磁盘。如果你的电脑崩溃了,你可以从一个检查点恢复进度,而不是丢失一天的工作。根据 Tensorboard 日志,您还可以使用它来选择具有最佳验证损失的模型检查点。
  • **通过寻找模型训练过程的加速方法来缩短周期时间。**如果您有可用的 GPU,请为您的预处理设置 GPU 加速,并对向前+向后过程建模。CUDA 安装可能会非常令人沮丧,但当您的模型训练速度提高 10 倍时,这是非常值得的。如果你有多个可用的 GPU(通常在一个强大的云机器中),尝试实现数据并行,这样你的模型会更快地烧穿迷你批处理。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目测损耗曲线很重要!

接下来呢?

经过 50 个时期的训练后,该模型在训练集上达到约 93%的 F1 分数,在测试集上达到约 85%的 F1 分数。这还不算太糟,但我相信我们可以做得更好!我想尝试做一些事情来提高模型性能:

  • 实现一个在 Mel 频谱图上使用 2D 卷积的模型(而不是在原始波形上使用当前模型的 1D 卷积),因为这往往会在其他音频任务上实现最先进的性能。
  • 做一些数据扩充,以获得数据集中更多的变化(添加噪声,改变音频剪辑的定时,等等)。)来增加最终模型的泛化能力。
  • 尝试使用具有原始(更高)采样速率的输入音频,以便模型可以对更多信息的输入进行操作。
  • 收集更多表现不佳的类的数据,以提高这些类的模型的准确性。

这通常是大多数教程博客文章的结尾。然而,让我们更进一步,实际分析失败案例,以便我们可以明智地处理最能提高模型性能的东西。

使用水族箱进行故障案例分析

首先,我想检查标记数据集和来自我的模型的推论之间的差异,以便分析它的一些失败案例。经过短暂的迂回以生成一些可视化的光谱图后,我将数据集上传到水族馆 GCS 桶中,然后使用水族馆客户端库上传我的标签、元数据和推论。

###
# add label data
###al_labeled_frame = al.LabeledFrame(frame_id=frame_id)# Add arbitrary metadata, such as the train vs test split
al_labeled_frame.add_user_metadata('speaker_id', speaker_id)al_labeled_frame.add_user_metadata(
    'utterance_number', utterance_number)al_labeled_frame.add_user_metadata(
    'waveform_shape', waveform.shape[1])al_labeled_frame.add_user_metadata('split', dataset_split)# Add a spectrogram image to the frame for visualization
al_labeled_frame.add_image(
    sensor_id='spectrogram', image_url=image_url)# Add the audio file to the frame for audio-lization
al_labeled_frame.add_audio(
    sensor_id='waveform', audio_url=audio_url)# Add the ground truth classification label to the frame
label_id = frame_id + '_gt'
al_labeled_frame.add_label_2d_classification(
    sensor_id='spectrogram',
    label_id=label_id,
    classification=utterance
)

al_dataset.add_frame(al_labeled_frame)###
# add inference data
###al_inf_frame = al.InferencesFrame(frame_id=frame_id)inf_label_id = frame_id + "_inf"al_inf_frame.add_inference_2d_classification(
    sensor_id="spectrogram",
    label_id=inf_label_id,
    classification=pred_class,
    confidence=float(confidence)
)al_inferences.add_frame(al_inf_frame)

上传完成后,我进入水族馆用户界面,可以查看我的数据集并播放一些音频片段。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目测和…打耳洞(?)一些例子

我还绘制了类别分布图,并发现与其他类别相比,有些类别在数据集中的代表性相对较低。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有些课的例题是其他课的一半!

Aquarium 还会自动显示数据集中的高损失示例,这些示例可能是标签错误或严重的模型故障。使用这个工具,并通过查看交互式模型度量视图,我发现:

  • 一些音频剪辑实际上包含多个单词而不是一个!在这种情况下,似乎说话者不小心说错了单词,然后纠正自己,模型正确地将第一个单词分类。
  • 有几个听起来很像的词是模型混淆的——上下车树和三个前进和四个。一个人可以区分这些例子中的一些,而其他情况则很难区分。
  • 在各种失败案例中,似乎有一些说话者的声音被切断的例子。在许多这样的片段中,在片段结束之前,说话者几乎没有开始说话,这使得几乎不可能区分像“four and forward”这样在开始时听起来相同的单词。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我检查的有限数据集中,最后一种失败模式似乎发生在多个类中,但我并不清楚这个问题有多大,我也不想花几个小时来听数据集中的所有音频剪辑来判断这一点。然而,在决定下一步尝试什么之前,了解要解决的最大问题是什么是很重要的。

幸运的是,水族馆的一个独特之处在于它能够利用神经网络嵌入将相似的数据点聚集在一起。该功能允许我们找到相似数据点的聚类以及数据集中的异常值。这在识别模型故障模式时特别有用。

从模型中提取嵌入并不太难,只需在数据点上运行模型,然后从倒数第二层(在最后的类方式 FC 层之前)获取模型的激活。数据点的嵌入向量在这里只是一个浮点的 1D 向量,代表一个学习的特征向量。我在数据集上运行我的模型,提取出嵌入和推论,并将它们保存到磁盘上:

# embedding extraction
activation = {}
def get_activation(name):
    def hook(model, input, output):
        activation[name] = output.detach()
    return hook
audio_model.pool4.register_forward_hook(get_activation("pool4"))def predict(tensor):
    # Use the model to predict the label of the waveform
    tensor = tensor.to(device)
    tensor = transform(tensor)
    tensor = audio_model(tensor.unsqueeze(0))
    likely_ind = model.get_likely_index(tensor)
    out_label = data.index_to_label(likely_ind.squeeze(), labels)
    probs = torch.exp(tensor).squeeze()
    confidence = probs[likely_ind]
    embedding = activation["pool4"].flatten() return out_label, confidence.item(), embedding.cpu().tolist()

然后我把它们从磁盘上传到水族馆:

embeddings = None
with open("embeddings.pickle", "rb") as f:
    embeddings = pickle.load(f)inferences_map = {}
embeddings_map = {}
for i in range(len(inferences)):
    (frame_id, pred_class,
        confidence, dataset_split) = inferences[i]
    inferences_map[frame_id] = inferences[i]
    embeddings_map[frame_id] = embeddings[i]...al_labeled_frame.add_frame_embedding(
    embedding=embeddings_map[frame_id])
al_dataset.add_frame(al_labeled_frame)

一旦嵌入被上传和处理,我们就可以了解数据集在嵌入空间中的分布。在这里你可以随意尝试一下

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后通过模型推断和标签之间的一致/不一致来给嵌入云着色。我们清楚地看到在数据集的一个部分中有一个巨大的不一致集群,比任何其他错误模式都要大得多!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过模型和标签之间的一致/不一致给嵌入云着色

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

只显示模型和标签之间的不一致。

仔细看,所有这些数据点都是音频剪辑,扬声器被切断,让人无法分辨正在说什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

观察这些例子的波形,你会发现所有这些片段在结尾几乎都被剪掉了。

该问题影响数据集中的数千个示例,并且是最大的单一故障模式。然而,这不一定是模型的问题,而是模型预期的问题——人类没有办法听这些音频剪辑并合理地推断出正在说什么单词,它们只是以它们的方式被标记,因为语音命令的原始数据收集设置涉及指示用户说某个单词,并保存那些标记有说话者被指示说的单词的音频剪辑。

我们可能应该通过创建一个新的“未知”或“切断”类并重新训练模型来解决这个问题。这样,它就不会被那些被标记为合法类别但实际上并没有包含足够信息来准确分类的例子所迷惑。然而,这是我在 hackathon 上花完时间的地方,所以我将把它留给读者做练习。

结论

在机器学习项目中,总有一个点,你有一个做得不错但不太好的模型,并且有许多可以尝试的东西可以提高你的性能。对于这种情况,吴恩达有很好的实用建议:与其尝试随机的事情,看看什么能提高性能,不如花些时间了解哪里出了问题,然后修复那些搞砸的事情。

在这里,我们采用了一些非常现成的示例代码,在数据集上训练了一个非常简单的模型,并分析了哪里出错了。因此,我们发现最大的问题与模型本身无关,而是与数据的基本且容易修复的问题有关。通过花一点时间做误差分析,我们发现了提高模型性能的最高投资回报率的方法,这是我们可以尝试的许多方法中的一种。

我使用我们公司的产品,水族馆,为这篇文章做了大量的可视化和错误分析。如果你有兴趣亲自尝试一下水族馆,请告诉我们吧!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

物体检测的深度学习:初学者友好指南

原文:https://towardsdatascience.com/deep-learning-for-object-detection-beginners-friendly-guide-ae1180b34042?source=collection_archive---------16-----------------------

人工智能工程师的研究和行业趋势

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者制作的图像

背景

当我在 2018 年实习时,我开始研究物体检测技术,因为我需要解决一个视觉检查问题。这个问题需要在来自工业相机的图像流中检测许多不同的对象。

为了应对这个挑战,我首先尝试将分类与滑动窗口结合使用!自然,这个系统非常慢,不适合生产。

在这之后,我开始研究执行对象检测的端到端深度学习模型。我偶然发现了 google research 的一篇著名论文,题目是:

现代卷积目标探测器的速度/精度权衡

这篇论文是我对使用深度学习的对象检测领域的介绍。

物体检测是一个古老的任务,深度学习给它带来了什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者制作的图像

目前,目标检测是计算机视觉领域中一个比较古老的课题。在深度学习成为主流之前,许多研究人员和工程师都在研究这个问题。他们主要使用经典的图像处理技术,他们可能经常使用滑动窗口方法。那么深度学习对物体检测的附加值是什么呢?

事实上,深度学习从根本上改变了我们进行物体检测的方式。随着 YOLO 和 R-CNN 系列的引入,对象检测的性能显著提高。大多数用于图像相关任务的神经网络使用卷积层。这些神经网络被称为 CNN(卷积神经网络)。这些 CNN 实际上自然而有效地执行了一种滑动窗口方法。这是神经网络学习图像表现方式的一部分。

目标检测的研究现状

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者制作的图像

在我写这篇文章的时候,谈论最多的对象检测模型是 YOLOR(你只学习一种表示)。设计该模型架构的研究人员正在寻找整合“隐性知识”的方法。这种隐性知识应该代表神经网络中的潜意识。作者希望建立一个架构,模仿我们人类在现实生活中如何解决对象检测任务。这种架构可能是未来工作的一个种子,该工作集成了隐式知识的概念,不仅用于对象检测,还用于各种计算机视觉任务。

还有另一种建筑可以成为未来许多作品的种子,那就是 DETR 建筑。DETR 代表检测变压器。

变压器是一种新型的神经层,它们正在与卷积层竞争大量的计算机视觉任务。

变形金刚已经在 NLP(自然语言处理)任务中显示出巨大的成果,并且他们正在稳步进入计算机视觉任务。

工业中物体检测的现状

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者制作的图像

在过去的几年里,我一直是一名机器学习工程师,专注于计算机视觉应用。通过在这个领域工作,也通过对需要机器学习和计算机视觉知识的职位进行几次面试,我实际上注意到了这个行业中物体检测的一些趋势。

如果你在这个行业工作,那么你肯定知道一项任务的最重要的指标可能与研究中使用的指标非常不同,对于同样的任务!

在对象检测任务的情况下,同样的事情适用。据我所知,在工业环境中实现目标检测模型时,有两个指标是最重要的:速度和鲁棒性。并不总是两者都有,但两者中至少有一个总是有的。

基于这些原因,***【v3,v4,V5】***更快——RCNN在业界得到了广泛的应用。通常,当速度是第一优先考虑的因素时,使用 YOLO,当鲁棒性是第一要求时,使用更快的 RCNN。

我亲自和 YOLOv3,SSDfast 合作过——RCNN

虽然很多在这个行业工作的人直接去了 YOLO——我猜是因为它的好名声——但我不认为这是一个万能的解决方案。

谈到推理速度,YOLO 和 SSD 都显示出了巨大的潜力。但是在某些情况下,他们仍然可能失败,特别是在工业领域。

我记得我曾尝试使用带有 InceptionV2 后端的 SSD 来执行一项高难度的物体检测任务。这是一项视觉检查任务,我们需要检测大型发动机(飞机或直升机,我不记得了)内部的机械部件。无论我如何调整我的神经网络的参数,我都不能让损失减少,它只是不停地振荡!

我以前使用过同样的架构,用同样的主干,来执行一些其他的对象检测任务,效果非常好!所以当我从事这项任务时,这无疑是更具挑战性的,SSD 失败了。因为发动机看起来体积庞大,因为有许多零件连接在一起,而且许多零件看起来非常相似。即使是人眼,也很难发现我们想要检测的特定机械部件!这应该告诉你注释我们的数据集有多困难!

此时,我记得当时认为这只是深度学习的极限。但在完全放弃之前,我决定尝试一种不同的架构,并试图避免 YOLO 和 SSD 等一级检波器。

我选择了 fast-RCNN,因为它是一个两阶段的对象检测模型。你瞧,这个模型工作得非常好!损失函数的收敛比保龄球还要平滑!

所以下次你在做物体检测任务的时候,在你下定决心之前,尝试一些不同的架构!

需要云计算来提高对象检测任务的性能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者制作的图像

在训练深度学习模型的时候,尤其是大型模型的时候,你需要一些非常好的设备。说到训练,GPU 可能是你的深度学习机器最重要的方面。许多公司购买这些设备,但也有许多公司选择云计算服务。

谷歌云平台(GCP)、亚马逊网络服务(AWS)和微软 Azure 是一些广泛使用的云计算服务。

对于物体检测和大型模型,如 fast-RCNN,这些云计算解决方案可能正是您正在寻找的训练模型。但是应该用哪一个呢?

答案真的取决于你公司的选择。对于许多公司来说,他们已经有了云基础设施,在上述云提供商之一,所以他们可能只是想继续使用同一提供商来保持标准化。但是,如果你刚刚开始,并试图选择其中一个作为你的目标探测任务,那么请继续阅读!

有多种方法可以训练你的物体检测模型,稍后我会详细介绍一些开源工具。但是如果你正在使用 Tensorflow (1 或 2),那么你可能正在使用 Tensorflow 对象检测 API

如果你是,那么当谈到在云上训练对象检测模型时,Google Cloud 应该是你的选择。你可能会问为什么?

嗯,由于 Tensorflow 是谷歌的产品,对象检测 API 也属于谷歌,谷歌云团队已经使在 GCP 上训练你选择的模型(从对象检测 API)变得极其容易。

具体来说,google 有 2 种产品可以轻松集成到您的管道中,用于训练对象检测模型。这两款产品分别是:AI 平台和 Vertex AI。

通过在你的机器上安装谷歌云帐户和谷歌云 SDK,训练来自 模型动物园 的任何物体检测模型,变得简单明了。

如果你想训练一个不属于模型动物园的模型(比如 YOLO),那么按照我在另一篇文章https://pub.towardsai.net/beginners-helpful-guide-to-training-deep-learning-models-on-the-cloud-3202f29afd1b中描述的一系列步骤,在谷歌云上也是可行的。

用于执行对象检测任务的开源深度学习工具

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者制作的图像

为了使用深度学习来执行对象检测,主要有三种广泛使用的工具:

  1. Tensorflow 对象检测 API。
  2. 探测器 2。
  3. mm 检测。

如果你是 Tensorflow 开发者,那么 Tensorflow 对象检测 API 最适合你。如果你是 PyTorch 开发者,那么 Detectron2MMDetection 更适合你。

如果你更关心选择的多样性,那么 MMDetection 是最好的选择,因为它有大量的对象检测深度学习模型。

这并不意味着仅仅因为一个架构不是这些工具的一部分,你就不能在其他地方找到它。例如,Tensorflow 对象检测 API 中没有 YOLO 模型,但您可以使用 Tensorflow 从社区中轻松找到一个开源实现。

结论

总结一下,下面是这篇文章的要点:

  1. 物体检测是计算机视觉中一项相对古老的任务,但深度学习已经将物体检测任务的性能大幅提升。
  2. 当涉及到用于对象检测的深度学习时,研究中推的指标可能不一定与行业中推的指标相同。
  3. 云计算可以成为深度学习模型训练性能的主要助推器,明智地选择云提供商。
  4. 使用深度学习进行物体检测的开源工具有几个,主要的三个是:Tensorflow 物体检测 API、Detectron2 和 MMDetection。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者制作的图像

我是一名机器学习工程师,致力于解决具有挑战性的计算机视觉问题。我想帮助你学习应用于计算机视觉问题的机器学习。以下是方法。

  1. 通过帮助您了解该领域的最新动态。我几乎每天都在【LinkedIn】Twitter上分享小型博客帖子。那就跟我去吧!
  2. 每周给你一份我的 时事通讯 上那些小帖子的摘要。所以订阅吧!
  3. 通过在 Medium 上写关于机器学习不同主题的文章。所以跟我来吧!
  4. 给你一份免费的机器学习工作清单,帮助你检查你需要学习的所有要点,如果你计划在 ML,特别是在计算机视觉方面的职业生涯。你可以在这里获得核对表

5.最后但同样重要的是,通过与你分享我的 免费入门 Tensorflow 课程 ,它有超过 4 小时的视频内容,你可以在那里问我任何问题。

此外,如果您有任何问题或者您只是想聊聊 ML,请随时在 LinkedIn 或 Twitter 上联系我!

用于弹丸弹道建模的深度学习

原文:https://towardsdatascience.com/deep-learning-for-projectile-trajectory-modeling-fb6380e06b8f?source=collection_archive---------27-----------------------

思想和理论

对我们最近关于为基于深度学习的轨迹建模生成模拟数据的论文的评论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

FCE 神经网络示意图(图片由作者提供)

本文作者为 Ayaan Haque 和 Sajiv Shah

在这篇文章中,我们将回顾我们最近的工作,题为“通过基于人工智能的机器人弹丸发射建模的算法力系数估计的模拟数据生成”,作者是萨吉夫·沙阿、阿亚安·哈克和刘飞。在本文中,我们提出了 FCE 神经网络,一种新的方法来模拟机器人发射非刚性物体使用神经网络训练的补充模拟数据,从算法力系数估计产生。这项工作已经被 2021 年的 ACIRS 接受。论文在 ArXiv 有,项目网址在这里。我们将首先介绍我们的动机和问题,然后回顾方法,最后提出一些简短的结果和最后的想法。

背景

动机

随着机器人开始变得更加先进,它们需要模仿类似人类的行为,因此必须获得类似人类的技能。其中很大一部分涉及到与对象的交互,包括操纵和启动。不幸的是,现实世界的对象建模是困难的。这是因为有一些外部因素和动力学控制着一个物体的运动,而这些因素和动力学在基本物理模型中没有得到解释。物体具有随时间增加的应力松弛量,以及在诸如温度或湿度的多种非恒定条件下变化的硬度。这产生了大量的不确定性,因为某个模型的每个对象将具有不同的条件。

对于物体发射来说,空气动力和机械装置的不精确性结合在一起会产生较差的动力学特性。为了精确地确定升力和阻力系数,必须使用昂贵的工具和传感器进行实验,如风洞。执行这些测试需要原型或小比例模型,这意味着物体的大致形状和材料必须预先确定,这使得设计与未知或形状变化的物体交互的机制变得困难。如果没有来自精确传感器和控制器的高速、准确的反馈,机器人就不能很好地模仿模型。在发射系统中,由于不均匀的质量分布,来自机构的摩擦和来自致动的振动,加上不理想的控制回路,导致目标参数与实际参数之间的差异。非包容性建模和不完善的机械系统的结合产生了实验和理论结果的巨大差异。

当前解决方案

为了解决这些问题,来自人工智能各个领域的方法已经被应用于机器人领域。在强化学习(RL)中,机器人通过反复试验来学习新的行为,这消除了对人类操作员的需要。然而,众所周知,RL 在架构上既危险又昂贵,这使得它在通用机器人领域相当不受欢迎。

其他数据驱动的深度学习方法已经被研究用于各种基于物理的建模任务,但是依赖于大型数据池。对于机器人应用程序,收集和生成大型数据集将使预测模型过时,因为以编程方式引用收集的数据将产生比基于该数据生成预测更准确的结果。

实验数据经常与模拟/生成的数据配对,为深度学习模型提供更多数据。然而,强生成模型需要访问大型数据集,以便准确地学习和再现数据的表示。我们建议使用一个简单的基于物理的模拟器,该模拟器考虑了射弹轨迹的已知动态,以生成用于深度学习的数据。为此,我们开发一组方程并设计模拟器,使用迭代算法估计系数,生成数据,然后调整神经网络以创建预测。

方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

FCE 神经网络示意图(图片由作者提供)

我们的方法由三部分组成。模拟器,包括系数估计器和数据生成器,以及神经网络。

基于物理的模拟器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们研究中使用的目标图(图片由作者改编自此处

虽然我们的方法可以应用于各种对象,但我们的工作涉及一个 7 英寸的泡沫球,它是从双飞轮机器人射手发射的。第一届机器人挑战赛给出了我们的目标,如上图所示,我们的目标是从不同的发射区将尽可能多的直径为 7 英寸的泡沫球射入 3 点目标,这些发射区距离目标底部 3 至 30 英尺。靶子的中心大约有 8 英尺高。

已知的作用在球上的力有重力、阻力和升力,其中一些力根据球在轨迹中的位置以不同的大小和方向作用在球上。本文概述了物理方程和模拟器设计:

我们假设访问测量的发射器配置 X_r 和发射结果 Y_r,以及带有发射器配置 X_s 和标签 Y_s 的模拟数据。X_r 和 Y_r 一起用于形成实验数据集 D _ r。X _ s 和 Y_s 一起用于形成模拟数据集 D_s。

我们的目标是训练我们的神经网络来预测基于某一组发射配置 X_r 的结果,其中每个配置都有 3 个特征:到目标的距离(米),范围为 0-1 的电机速度比,以及发射器与水平面的角度(度)。更常规地,X 是神经网络的输入,在这种情况下是发射器配置,Y 是输入的标签,在这种情况下,它是发射的结果。已知得分目标在距离(d)处,并且得分区域的中心在高度(h_target)处,我们分配结果如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发布结果的分配(图片由作者提供)

估算力系数

我们的目标是使用这个轨迹模拟器,通过比较从配置 X_r 生成的轨迹的结果与其结果 Y_r 来估计系数 C_l 和 C_d。为了估计最适合数据集的系数,我们使用多个系数对来模拟 X_r 的每个配置的轨迹。我们评估了 1000 个组合,每个系数在(0.000,5.000)的范围内,步长为 0.005。

对于给定的初始发射角、发射速度和系数对,模拟器能够生成物体轨迹并确定其是否穿过目标。我们可以简单地迭代多个系数对,以确定哪一个对 D_r 的轨迹建模最好。因为 D_r 的结果数据集(Y_r)表示物体可能经过的点的范围,所以大量系数对将从 X_r 模拟单个配置的轨迹。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用算法模拟器生成轨迹的例子。垂直蓝线代表 2 分区域的得分范围,垂直红线代表 3 分区域的得分范围。黑星表示物体发射时机器人的位置/距离。(图片由作者提供)

我们使用模拟器计算目标与计分目标中心的距离,并将该值标记为偏差。为了选择一个系数对用于数据生成,我们评估了 3 点和 2 点区域的精度以及平均值和中值偏差。我们的算法力系数估计方法可推广到与空气动力相互作用的其他物体。上图显示了不同空气动力系数对物体轨迹的影响,对于给定的配置子集,结果因分配的系数对而异。

神经网络训练

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

神经网络示意图(图片由作者提供)

一旦我们使用我们的力系数估计器生成额外的数据,我们就将其与我们的实验数据集 Dr 耦合,以训练神经网络来预测射弹是否会击中指定的目标。我们在论文中使用的神经网络如上所示,它是一个有目的的三层骨架网络。对于每个发射器配置,输入层有 3 个节点,隐藏层有 8 个节点,输出层有 2 个节点,每个节点用于 2 维向量,对 2 点或 3 点目标是否被击中进行二元预测。这个网络是一个简单的前馈网络,可以用一个更先进的网络来代替。神经网络的使用允许考虑我们的机制和模型中的不准确性。这些不准确性包括我们的射弹的非刚性属性,不能准确地模拟能量转移,等等。神经网络专门用于解释物理模型的不准确性。隐藏层允许网络模拟非线性系统并考虑非线性。收集的数据来自我们部署人工智能系统的领域。如果数据是从目标域收集的,它将解释物理模型不能解释的差异。

我们的网络根据如下所示的加权损失函数进行训练:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

损失函数项(图片由作者提供)

其中,X_r 和 Y_r 是实验特性集和标签,X_s 和 Y_s 是模拟特性集和标签集,F_θ是模型,L_R 是真实损失项,L_S 是模拟损失项,λ是模拟损失的拉格朗日乘数。L_R 和 L_S 都使用传统的交叉熵损失,计算方法相同。λ项在使用实验和模拟数据的方法中很重要。由于 D_s 远大于 D_r,因此必须适当调整损失函数,以优化模型,使其在目标域中有效运行。

结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们射手的计算机辅助设计模型(图片由作者提供)

我们使用一个双飞轮发射机构(CAD 如上所示)来测试我们的方法的准确性。

D_r 正好有 100 种配置,平均分布的数据代表我们的 3 种可能的结果。由于机制缺陷,只有 2 个数据实例必须被手动拒绝。对于训练和测试分割,我们使用 20%的数据集作为外部测试集来评估模型性能。该测试集不包含模拟数据。如上所述,模拟数据集具有 900 个均匀平衡的样本。作为额外的评估指标,我们对生成的 X_s 中的 50 个进行了采样,并使用我们机器人上的配置来确定我们场地上的实验结果。我们用它来形成一个额外的测试集。获取模拟输入 Xs 的实验标签不仅允许我们基于估计的系数评估来自模拟器的预测,还允许我们评估神经网络的预测。

力系数估算

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显示力系数估计器性能的表格(图片由作者提供)

在上表中,我们显示了模拟器在训练和测试集上的性能,并证明它能够非常准确地预测力系数以匹配训练集,这对神经网络来说是最佳的,但在测试集上表现不佳,这是使用神经网络的动机。如上所述,模拟器旨在复制训练集的数据分布,以便生成与训练集无法区分的新数据,这将最大程度地帮助神经网络性能。因此,因为模拟器在精确生成和模拟训练数据方面非常有效,所以它可以是训练神经网络的适当补充。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可视化轨迹模型(图片由作者提供)

上图显示了实验测量的轨迹和模拟器使用估计的力系数生成的轨迹的比较(左)。我们还显示了与测试集上的实验轨迹相比,使用估计的力系数生成的轨迹的不准确性(右)。这进一步证明了生成器在匹配训练集分布方面是准确的,但是在对测试集建模方面是不准确的。

神经网络性能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

神经网络性能(图片由作者提供)

上表显示了神经网络在预测发射器配置是否会产生目标得分方面的性能。结果表明,对于任何数量的模拟数据,网络都比在没有模拟数据的情况下训练的网络具有更强的性能。然而,在 900 个样本之后,性能开始下降,这表明对模拟数据的过度拟合降低了实验测试集上的性能。结果证实了使用模拟数据的重要性,并显示了性能的统计显著提高(p 值≤ 0.05)。此外,神经网络的精度比仅力系数估计高得多。

最终想法

在本文中,我们提出了 FCE 神经网络,一种使用力系数估计和深度神经网络对机器人系统发射的非刚性物体的轨迹进行建模的方法。我们介绍了一个使用实验发射器数据和物理模拟器估算力系数的算法过程。重要的是,我们使用这种算法模拟器来生成额外的数据,以训练数据匮乏的神经网络。我们利用在模拟和实验数据上同时训练的深度神经网络来基于输入配置预测和建模发射器的结果,允许非刚性物体发射的真实世界建模,这可以说明物体飞行的外部因素。

我们设想将这样一个系统部署在具有自动可变发射器的遥控移动机器人上,这样,现场测量的发射器配置就可以输入到模型中,以预测发射的结果。这些配置可以被发送到操作员仪表板,在那里,部署在网络上的网络可以有效地返回关于是否发射发射器的预测。与简单地返回二进制结果相反,它可以进一步用于提供关于调整什么配置以进行拍摄的建议。我们未来的工作将研究新的神经网络结构以及反向工程神经网络,以获得力系数。

如何利用深度学习预测时间序列数据

原文:https://towardsdatascience.com/deep-learning-for-time-series-data-ed410da30798?source=collection_archive---------4-----------------------

亚马逊开发的自回归递归神经网络

时间序列(TS)预测是出了名的挑剔。也就是说,直到现在。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:基于这个教程的 DeepAR 训练输出。图片作者。

2019 年,亚马逊的研究团队开发了一种名为 DeepAR 的深度学习方法,相对于最先进的 ts 预测模型,该方法的准确率提高了约 15%。它是健壮的开箱即用的,可以从许多不同的时间序列中学习,所以如果你有许多不稳定的数据,DeepAR 可能是一个有效的解决方案。

从实现的角度来看,DeepAR 在计算上比其他 TS 方法更复杂。它还需要比传统的 TS 预测方法如 ARIMA 或脸书的先知更多的数据。

也就是说,如果你有大量复杂的数据,并且需要非常准确的预测,DeepAR 无疑是最可靠的解决方案。

技术 TLDR

简而言之,DeepAR 是一个 LSTM RNN,带有一些附加功能来提高复杂数据的准确性。相对于传统的 TS 预测方法,DeepAR 有 4 个主要优势…

  1. **DeepAR 在学习季节性依赖关系方面很有效,只需要很少的调整。**这种开箱即用的性能使该模型成为 TS 预测的良好起点。
  2. DeepAR 可以使用几乎没有训练历史的协变量。通过利用相似的观察值和加权重采样技术,该模型可以有效地确定不频繁协变量的行为。
  3. **DeepAR 做概率预测。**这些概率以蒙特卡洛样本的形式,可用于开发分位数预测。
  4. **DeepAR 支持广泛的似然函数。**如果您的因变量呈现非正态或非连续分布,您可以指定相关的似然函数。

该模型受到了很多关注,目前在 PyTorch 中得到支持。教程和代码链接在评论里。

但是,到底是怎么回事呢?

好吧,让我们慢一点,讨论一下亚马逊的 DeepAR 模型实际上是如何工作的…

传统时间序列预测

让我们从头开始。

如上所述,时间序列预测是出了名的困难,主要有两个原因。首先,大多数时间序列模型需要大量的主题知识。如果你用传统的 TS 模型模拟股票价格,重要的是要知道什么协变量影响价格,这些协变量的影响是否有延迟,价格是否表现出季节性趋势,等等。

工程师通常缺乏创建有效功能所需的主题知识。

第二个原因是 TS 建模是一个相当小众的技能组合。给定时间步长的先前输出是下一个时间步长的输入,因此我们不能使用通常的建模技术或评估标准。

因此,工程师不仅需要对数据有深入的了解,还必须对 TS 建模技术有深刻的理解。

传统的递归神经网络

机器学习可以为传统的 TS 预测提供替代方案,这些方案通常更准确且更容易构建。支持顺序数据的最简单的 ML 算法是递归神经网络。

rnn 本质上是一堆堆叠在一起的神经网络。如图 2 所示,h 1 处模型的输出馈入下一个 h2 处的模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:递归神经网络的图示。图片作者。

这里,蓝色的 x 是预测变量,黄色的 h 是隐藏层,绿色的 y 是预测值。这个模型架构自动处理我们上面讨论的许多挑战。

但是即使是 rnn 在某些领域也有不足。首先,他们对于什么应该被传递到下一个隐藏层的假设过于简单。RNN 的更高级的组件,如长短期记忆(LSTM)和门循环单元(GRU)层提供了过滤器,用于过滤沿链传递的信息。它们通常比普通的 rnn 提供更好的预测,但遗憾的是,它们也有不足之处。

亚马逊的 DeepAR 模型是 LSTM 的最新版本,解决了它的两个主要缺点:

  1. **由于均匀采样分布,异常值拟合不佳。**DeepAR 的优势之一是它从许多时间序列中聚合信息,从而为单个单位(如用户)开发预测。如果所有单位都有相同的机会被采样,异常值将被平滑,我们的预测值将变得不那么极端(可能也不那么准确)。
  2. **RNN 不能很好地处理时间缩放。**随着时间的推移,时间序列数据通常会表现出整体趋势——想想你在 COVID 期间最喜欢(或最不喜欢)的股票。这些时间趋势使得拟合我们的模型变得更加困难,因为在拟合时必须移除这种趋势,然后将其添加回我们的模型输出。那是许多不必要的工作。

DeepAR 解决了这两个问题。

DeepAR 是如何工作的?

基于 RNN 架构,DeepAR 使用 LSTM 单元来拟合我们的预测变量和我们感兴趣的变量。以下是如何…

序列对序列编码器-解码器

首先,为了使我们的数据更有用,我们利用一个序列来排序编码器-解码器。该方法采用一组 n 个输入,用神经网络对这些输入进行编码,然后输出 m 个解码值。

有趣的事实——它们是所有语言翻译算法的支柱,比如谷歌翻译。因此,使用下面的图 3,让我们从将英语翻译成西班牙语的角度来思考这个方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3:序列对序列编码器-解码器的图形表示。图片作者。

这里,蓝色的每个 x_n 值是我们模型的输入,即英语单词。它们被依次送入 RNN,后者对它们的信息进行编码,并将其作为编码器矢量(黄色)输出。编码器向量的信息被表示为隐藏状态的权重向量。从那里,我们的编码器向量被送入我们的解码器,这是一个 RNN。最后的输出是西班牙语单词,用绿色标记为 y_n

很酷,对吧?

根据我们的数据进行扩展

其次,我们解决了使基本 LSTMs 不如 DeepAR 的两个问题:均匀采样和时间缩放。

这两者都使用比例因子来处理。比例因子是用户指定的超参数,但推荐值只是给定时间序列的平均值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 DeepAR 中使用的默认比例因子的公式——单个时间序列的平均值。图片作者。

为了处理极值的不均匀采样,我们使采样概率与 v_i 成比例。因此,如果给定时间序列的平均值较高,则更有可能被采样,反之亦然。

为了处理时间缩放,我们将每个 LSTM 单元的输入除以 v_i 。通过在将我们的值输入到每个单元格之前缩小它们,我们的模型可以专注于我们的预测器和结果变量之间的关系,而不是拟合时间趋势。在单元适合我们的数据后,我们将其输出乘以 v_i 以将我们的数据返回到其原始比例。

没那么酷,但还是很酷。只剩最后一节了…

使用似然函数拟合

第三,也是最后一点,处理完所有错综复杂的数据后,我们通过最大化因变量的条件概率来拟合给定的预测值和模型参数(图 5)。这种估计量称为最大似然估计量(MLE)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5:简化的 DeepAR 似然函数。图片作者。

上面的简化表达式是我们希望最大化的——我们希望找到最大化因变量( z )概率的模型参数( θ )。我们还以协变量( x_t )和前一个节点的输出( z_t-1 )为条件。

因此,给定我们的协变量和前一时间步的预测值,我们可以找到在给定参数的情况下最大化观察可能性的参数值。

现在,可能性还包括数据转换步骤,但是从理解和实现的角度来看,它并不是非常重要。如果你好奇,可以看看评论中链接的论文。

现在你知道了——简而言之就是 DeepAR。在你走之前,这里有一些关于实现这个方法的实用技巧…

实施说明

  • 作者建议将协变量标准化,即减去平均值并除以标准差。
  • 缺失数据对 DeepAR 来说可能是个大问题。作者建议通过从条件预测分布中抽样来输入缺失数据。
  • 对于论文中引用的例子,作者创建了对应于时间信息的协变量。一些例子是年龄(以天为单位)和星期几
  • 使用网格搜索优化参数是调整模型的有效方法。然而,学习速率和编码器/解码器长度是特定于主题的,应该手动调整。
  • 为了确保模型不是基于我们在 TS 中因变量的指数拟合的,作者建议在我们的开始阶段之前根据“空”数据训练模型。就用一堆零作为我们的因变量。

感谢阅读!我将再写 41 篇文章,将“学术”研究引入 DS 行业。查看我关于构建 DeepAR 模型的链接/教程的评论。

X 射线视觉的深度学习

原文:https://towardsdatascience.com/deep-learning-for-x-ray-vision-bd11564760fd?source=collection_archive---------20-----------------------

SCSE·NTU 大学最后一年项目(FYP)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

X 射线 CT 图像中的气孔检测(图像来自 ARTC

摘要

最近的讨论表明,添加剂材料中裂纹的位置始于孔隙。孔隙上产生的应力引发裂纹向下一个最近的孔隙扩展,最终导致破坏点。在 TinkerCAD 中创建了一个由逼真的孔状结构组成的 3D 模型,并上传到 aRTist,在那里进行模拟 CT 扫描以生成模拟 CT 图像。然后使用 VGStudio MAX 和 ImageJ 软件对图像进行预处理。使用可训练的 weka 分割插件,每个图像被半自动标记。这些图像然后被手动校正并转换成用于训练的掩模图像。然后研究了不同的分割模型,如 U-net 和 DeepLabV3,以执行分割任务。使用检测得分的概率来比较结果,我们得出结论:孔隙的检测严重依赖于真实数据,而不是模拟数据。

项目目标

该研究的目的是评估使用模拟 X 射线 CT 图像作为真实图像的可能补充的可行性,用于语义分割中的训练数据。

使用的软件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用的软件

TinkerCAD

TinkerCAD 是由欧特克公司开发的免费在线 3D 建模软件工具。它的特点是使用简单的形状和空心物体的创建,从而使其适合于创建孔状物体的模拟目的。

网格混合器

Meshmixer 是一款免费的 3D 计算机辅助设计(CAD)建模软件工具。它用于将复杂的孔隙 STL 文件组合在一起,作为单个对象导出到 aRTist 软件进行 ct 扫描模拟。

分析 RT 检测模拟工具(aRTist)

aRTist 是对射线检测(辐射源、辐射的衰减、x 光胶片和数字探测器、与 CAD 接口的交互式虚拟场景)进行定量描述的计算机模拟程序。

VGStudio MAX

Volume Graphics Studio MAX 是一款软件程序,旨在为用户提供处理和可视化体积数据的强大方法。它用于在使用 aRTist 执行模拟 ct 扫描后重建 3D 图像。

ImageJ(斐济)

ImageJ 是用 Java 编写的图像处理程序。它具有广泛的功能。这包括缩放、裁剪、降噪和以多种格式保存图像数据,例如。png,。jpeg,。Weka 可训练分割插件也用于这个项目中,以执行图像的半自动标记。

Google Colab Pro

为了训练模型,使用了谷歌 Colab Pro 特斯拉 P100-PC1E-16GB。Google Colab Pro Edition 还配备了速度更快的英特尔至强处理器(2.30GHz),而免费版的英特尔至强处理器(2.20GHz)

权重和偏差

Weights and bias是一款开发者工具,用于跟踪、比较和可视化机器学习实验。本项目中进行的所有实验都记录了重量和偏差。

概观

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为产生结果而采取的步骤

在这个项目中,第一步是从头开始创建一个模拟数据集,并对数据进行预处理。然后使用来自斐济的可训练 weka 分割插件 ImageJ 对数据进行标记。然后,在建模阶段测试了几个模型,这需要在数据标记过程中改进像素误差,并在实施过程中调试度量和误差。然后记录并评估结果,其中执行额外的预处理步骤和超参数调整以改善最终结果。

数据集创建

在这项工作中,重点是创建与金属(特别是铝)3D 打印过程中生成的现有孔隙高度相似的孔隙。在 TinkerCAD 中创建 CAD 模型后,该模型被导出到 aRTist 中,在其中模拟 3D 对象以创建 X 射线 ct 图像。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模拟 CT 图像的输出(图像来自 ARTC

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模拟图像和真实图像的放大对比(图像来自 ARTC )

图像处理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图像处理方法

执行了几种图像处理方法,以确保在训练模型之前图像是准备好的。使用 VGStudio MAX 和 Fiji-Image 软件对这些图像进行预处理。

数据标记

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自 Weka 可训练分割插件

可训练的 Weka Segmentation 是一个斐济插件,它将一组机器学习算法与一组选定的图像特征相结合,以产生基于像素的分割。上图显示了使用插件创建一个带标签的样本,该样本与其他几个带标签的样本一起用来注释数据集。这三个类是孔隙、对象和背景。

系统模型化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

U-Net 架构[1]

U-net 是为生物医学图像的分割而设计的,它在 CT 图像的制作中得到了应用。在这个项目中,我们使用 Keras 定义了一个 U-net 模型,Keras 是一个开源软件库,充当 Tensorflow 库的高级 API。除了 U-Net 模型之外,还在模型的末尾添加了批量标准化和漏失层。

使用的指标

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

TPR =召回率=灵敏度=检测概率

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Jaccard 距离损失指标

项目中使用了 2 个指标。第一个指标是检测概率,或者通常称为真阳性率、召回率或灵敏度。由于背景像素覆盖了像素总数的大部分,使得难以评估模型的性能,所以没有使用交集/并集和 Dice 分数。

第二个指标是 Jaccard 距离损耗,它改编自was name。这是一个用于评估不平衡数据集的有用的度量,并且已经进行了移动,以使其收敛到 0 并进行平滑,从而避免爆发梯度。

数据集分割

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模拟数据和真实数据的比率

数据集分为 6 个不同的比率,混合了模拟数据和真实数据。所有数据集都使用一部分真实数据作为测试数据。

超参数调谐

为了提高模型的性能,进行了超参数调整。为了获得最佳参数,总共进行了 4 次扫描。每次扫描由一系列超参数组成,这些超参数将使用权重和偏差按顺序运行。

在扫描之前定义了几个规则:

  1. 使用合理的参数值
  2. 采用“由粗到细”的方法消除非最佳超参数
  3. 假设运行中的超参数相互独立
  4. 使用数据集 1 和数据集 6 选择超参数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

优化器扫描

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

学习率扫描 1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

学习率扫描 2

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

批量扫描

结果评估

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集 1 至 6 的测试集结果

该模型被训练以在总共 20 个时期内收敛。从上图中,我们可以观察到,当只使用模拟数据时(D1 比较),性能明显更差。当使用更多真实数据时,数据集 2 至 6 的检测概率表现得越来越好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

度量结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(原始图像来自|()带注释的遮罩| ( )预测遮罩

基于所获得的结果,我们可以推断孔隙的检测严重依赖于现有数据,而不是模拟数据,因为只需要真实数据的 20% (304 个图像)来将数据集 2 中的检测概率驱动到 0.9583。这也证实了来自训练集的大多数图像与测试集高度相似,这解释了其高检测概率。

结论

在这个项目中,我们探索了使用 U-Net 神经网络结构来检测 ct 图像中的孔隙。在 TinkerCAD 中创建了一个由真实毛孔组成的 3D 模型,并上传到 aRTist,在那里进行模拟 CT 扫描以生成 CT 图像。然后,在 VGStudio MAX 和 ImageJ 中对图像进行预处理,随后,使用可训练的 weka 分割插件,对每个图像进行半自动标记。然后手动校正这些图像,并将其转换成用于训练的掩模图像。从真实数据和模拟数据的各种比率获得的结果表明,孔隙的检测严重依赖于真实数据,而不是模拟数据。

[1]O. Ronneberger,P. Fischer 和 T. Brox,“U-Net:卷积网络用于生物医学图像分割”,2015 年。

链接

NTU 博士的完整报告

数据科学中的深度学习

原文:https://towardsdatascience.com/deep-learning-in-data-science-f34b4b124580?source=collection_archive---------10-----------------------

它是什么,为什么使用它?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Solen Feyissa 在 Unsplash 上拍摄的照片

在我的上一篇文章中,我提到了想要重新研究机器学习。最初,我第一次尝试是在一个 24 小时的黑客马拉松上。我的团队使用监督机器学习模型。起初,尝试另一种监督模式听起来是个好主意,但有了一个项目,灵感就来了。如果你没有阅读我的上一篇文章,随着十月的临近,该项目将使用机器学习来生成简短的恐怖故事。但这意味着分类或预测不会发生。代代做。所以,我们需要使用深度学习模型,而不是监督/非监督/强化学习模型。

在我的《数据科学常用词》一文中,我们简要描述了什么是深度学习。我们也提到了神经网络的使用,但仅仅简单的定义并不总是能清楚地描述它们是什么以及它们是如何工作的。因此,在本文中,我们将更多地了解什么是深度学习,它是如何工作的,什么是神经网络,以及深度学习的目标/结果。

什么是深度学习?

深度学习是一种更接近人脑决策方式的机器学习训练模型。我说的大脑是指创建的算法更深入。不是只有一个层,而是多个复杂的层被用于处理。神经网络是一个允许层间通信的系统。这个过程更接近于无监督学习,因为它也是自动化的。

因为这种类型的学习充当了一个强大的大脑,所以需要大量的数据进行训练。需要如此多的数据,以至于在大数据和云计算出现之前,数据量和处理能力都不容易获得。但是仅仅因为需要大量的数据,并不意味着数据必须是结构化的。深度学习可以处理无标签和非结构化数据。这种学习方法还会创建更复杂的统计模型。随着每一个新数据的出现,模型变得更加复杂,但也变得更加准确。

深度学习模型

深度学习的一种方法是迁移学习。与其他训练模型相比,它需要更少的计算时间。它也不需要那么多的数据。迁移学习从一个预先存在的网络开始。这个网络还必须有一个接口。然后,该网络被输入新的数据,这些数据带有它尚未面对的场景,以获得反应并从数据中学习。随着时间的推移,可以进行调整以适应新数据和旧数据。然后,新的任务可以根据网络所学到的东西来执行,甚至可以利用其新发现的适应性获得更具体的分类能力。本质上,它采用现有的接口,为其提供新的场景,这些新的条件使网络在接受数据方面更加广泛,但在分类方面更加精确和具体。

深度学习的另一种方法是辍学法。特别是在监督学习中,可以创建类别来容纳不需要制作的数据。简单地说,过度匹配是指类别过于具体,以至于钻得太深。为了对抗过拟合,dropout 方法选择神经网络中的随机节点/单元来“退出”。通过去除那些随机节点,它努力消除钻得太深的分类。这发生在训练期间。

我们接下来要看的深度学习方法是从零开始训练。这种方法听起来一模一样,因为用户从零开始创建和训练网络。网络体系结构是根据需要构建的,需要一个带标签的数据集来配置该网络。与其他方法相比,这种方法有点像保姆,如果数据没有被标记,那么它就不能包含在训练集中,至少在训练的早期阶段是这样。为了捕捉所有场景或至少大部分场景,需要大量数据进行测试。它也比许多其他方法需要更长的时间,所以它不是一种常见的方法。

我们今天要讨论的最后一种深度学习方法是学习率衰减法,也称为自适应学习率法。一旦测量了误差率,学习率决定了发生多少变化。通过监控学习率,您可以调整模型以提高性能并减少训练时间。随着时间的推移,目标是降低学习率,以便在通过模型发送数据时不需要做太多的更改。如果速率太高,那么网络中的变化太多,并且在训练期间可能不稳定。但是,如果速率太小,那么性能可能会受到影响,甚至数据可能会在训练期间停滞不前。通过学习来平衡学习速率,可以提高准确性,并且可以显著提高训练性能。

什么是神经网络?

神经网络之所以重要,是因为通信源是节点,节点包含算法层,可以评估原始数据,并找到隐藏的模式。像无监督学习一样,深度学习会随着时间的推移而改变并适应数据,这使得它可以随着时间的推移而改进。神经网络也用于更复杂的问题,甚至解决现实生活中的场景。

但是节点到底应该是什么呢?一个节点应该代表必须做出决定的输入,然后连接到隐藏层。这些隐藏层是决策网络的一部分。一旦做出决定,它将连接到输出层,显示该决定的结果。就像大脑中的神经元一样,输入可以在隐藏的网络层周围反弹,像神经元触发大脑中的反应一样触发节点。这有助于做出更准确、更具描述性的决策。

深度学习的目标

深度学习的第一个也是主要的目标是随着每一个新的数据而改进。这包括能够调整其底层结构以准确评估数据。一旦使用测试数据完全构建了网络,就可以使用客户分析实现更大的个性化。就像一个流媒体服务建议你接下来应该看什么,你看什么节目/电影的数据被处理,并做出决定建议你可能也喜欢什么。

深度学习模型试图专注于认知计算,并模仿类似人类的思维结构。正因为如此,深度学习在 AI(人工智能)中被大量使用。无论是你最喜欢的游戏中不可玩的敌人角色学习如何更好地攻击,还是聊天机器人回答你的问题,深度学习都允许人工智能以表达认知能力的方式思考,这与我们以前创造的任何东西都不同。这个 AI 和深度学习以后只能越来越准,越来越快。

结论

今天,我们深入探讨了深度学习。作为机器学习的一个子集,深度学习与神经网络合作,模仿大脑如何对输入做出反应以及如何做出决定。神经网络具有从输入连接到隐藏网络层,然后连接到输出的节点。模型运行的时间越长,深度学习试图改善决策过程,并随着模型的运行变得更加准确和更具描述性。随着时间的推移,AI 已经采用深度学习来改善其决策过程。因此,随着突破性进展,人工智能可以在准确性和速度方面变得更加智能。随着深度学习驱动我们的未来,大数据使得使用这种模式变得更加容易。请随意对您如何创建深度学习模型发表评论。下次见,干杯!

用我的 每周简讯 免费阅读我的所有文章,谢谢!

想阅读介质上的所有文章?成为中等 成员 今天!

看看我最近的一些文章:

https://python.plainenglish.io/web-scraping-with-beautiful-soup-1d524e8ef32 https://python.plainenglish.io/something-i-learned-this-week-paramikos-remote-file-management-f13af69baf4 https://python.plainenglish.io/i-suck-at-coding-cb9bc7ef6c06 https://python.plainenglish.io/arrays-vs-list-vs-dictionaries-47058fa19d4e

参考资料:

https://www.sas.com/en_us/insights/analytics/deep-learning.html https://www.sas.com/en_us/insights/analytics/neural-networks.html https://searchenterpriseai.techtarget.com/definition/deep-learning-deep-neural-network

用简单的话深度学习

原文:https://towardsdatascience.com/deep-learning-in-simple-words-448e2c7f6ebe?source=collection_archive---------22-----------------------

人工智能笔记

它从哪里开始?这是什么?为什么有效?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

金莎·麦金农Unsplash 上拍摄的照片

在这里,我想用简单的话来解释深度学习,这是人工智能领域最常见的陈词滥调之一。这可能会帮助你找到诸如“什么是深度学习?深度学习为什么有效?“我试图分享我对深度学习的理解,这样你就可以理解全局。一旦你理解并认识到大局,你脑海中的许多问题将有望得到解决。

故事从哪里开始?

传统的机器学习流水线主要有两个步骤:(1) 提取特征和(2) 建立模型(要么分类,要么聚类)。特征提取的目标是在数值空间(也称为特征空间)中表示数据。建模的目标是设计一个计算机化的引擎,它可以确定每个数据点所属的组。

如果您可以设计一个模型来(根据需要)对特征空间中的数据进行分类,这意味着特征提取和分类以预期的方式协同工作。然而,正如你可能会怀疑的那样,故事并不总是那么简单。

—特征提取总是具有挑战性。

很长一段时间,人工智能专家必须与领域专家合作,为每个特定问题提取特征。他们必须在一定程度上具有创造性,并通过合作来实现这一目标。**这一过程错综复杂,不可跨项目转移。**此外,由于所处理问题的复杂性,手工特征提取在某些应用中几乎是不可能的。

例如,在人脸识别中,光照变化、遮挡和变形等挑战无法通过手工特征提取逐一处理。因此,希望找到一种方法,用可以由机器以自动化方式进行的数据驱动方法来代替手工特征提取。

—棘手的问题需要更复杂的模型。

首先,请允许我定义一个机器学习模型。

机器学习模型是一种数学函数,它获取数据,例如,得出一个结果,显示数据点所属的组或目标变量的估计值。这个数学函数有一个未知参数列表,必须对这些参数进行估计或训练,以确保其输出能够确定每个数据点的成员组。

模型中参数的数量代表模型的复杂度。理论上,一个有无数参数的模型比一个只有几个参数的模型更强大,因此更受欢迎,但是只有在你可以通过成功使用经典方法来调整它的参数的情况下。然而,当参数数量增加时,其他挑战随之而来。

一个有许多参数的模型比一个只有几个参数的模型更强大,因此更受欢迎,但前提是您可以通过成功地使用经典方法来调整它的参数。

*分类器的性能可以提高到饱和的程度。*性能饱和本身根植于模型的复杂性和培训过程的质量。这就是为什么,随着训练数据的增加,你不能期望一个简单的线性回归超过其性能限制。为了解决难题,模型复杂度和训练数据量必须有一个合理的平衡。

很少会增加传统模型的复杂性,然后仅通过输入大量数据来训练它。在这个大数据时代,在训练过程的早期,会遇到许多模型性能饱和的情况。因此,继续进行研究,以找到一种机器学习模型,该模型可以使用大量数据系统地训练,同时保留以最小的复杂性增加其复杂性的能力。

简单来说,什么是深度学习?

深度学习是一系列基于特殊形式的神经网络的机器学习方法,可以统一进行特征提取和分类,只需很少的人力。他们的构建过程是以具有特殊架构的深度神经网络(基本上是具有许多隐藏层的神经网络)为中心的。深度神经网络不能被认为是深度学习,除非它们有特殊的架构。它们比简单完全连接的层高级得多。在这篇文章中,我解释了为什么特殊的架构改变了游戏,有利于深度学习。

深度学习是一系列基于特殊形式的神经网络的机器学习方法,可以统一进行特征提取和分类,只需很少的人力。

为什么深度学习效果很好?

—特殊的模块化架构打开了许多大门。

传统神经网络的一个主要缺点是缺乏专门的构建模块(构建模块是一组进行大量内部计算然后输出压缩结果的神经元)。

使用其输出代表数据属性的专门构建块是深度学习方法的一个重要方面。专门化的构件使得分析和训练更适应新的训练模式以及新的设计过程。另一方面,传统神经网络中的构造块是网络层,并不总是产生有意义的结果。最后,使用专门的构建模块将帮助您设计更复杂和可训练的神经网络,然后可以用于成功地解决复杂的问题。

一组专门用于图像处理的深度学习方法被称为卷积神经网络(或 CNN)。在这些网络中,专门的构建模块旨在从图像中提取特征,包括边缘或形状。这些构造块也称为卷积层,与传统图像处理中的构造块相似,被称为滤波器,但两者有很大的区别。

在深度学习中,这些构建模块是通过使用训练数据的算法来设计和训练的,而在传统技术中,它们是由人设计的,通常是工程师。例如,用于图像处理的著名卷积神经网络架构 AlexNet 的成功开发解决了机器学习领域的研究人员一直在努力应对的挑战之一。

传统神经网络的主要缺点之一是缺乏有意义的构件。可解释性是他们的弱点之一。

—线性和非线性部分分离良好。

如果一个机器学习模型是非线性的,你可能很难处理它。非线性通常意味着训练模型和分析结果数据会更加困难。这就是为什么,传统 ML 模型中的赢家往往是那些由线性模型(准确地说,分段线性模型)组合而成的模型,如"随机森林和" XGBoost "

神经网络的一个重要部分是它们的计算单元,也称为神经元。简而言之,神经元是一个数学算子,它计算通过一个函数的输入数据的加权和,该函数也被称为激活函数。该函数可以是线性的、分段线性的和非线性的。

神经网络建立在大量神经元的基础上,这些神经元按照模型结构确定的方向相互传递信息。注意,神经网络是非线性函数;然而,它的基础是线性的。神经网络中的线性和非线性部分被很好地分开,因此可以很容易地管理。

—我们现在可以系统地训练一个复杂的模型。

[1]深度神经网络可能有数十亿个需要训练的参数。几年前,专家们对使用这种模型犹豫不决,但今天我们有能力有效地训练深度神经网络。与过去相比,现在每个人都可以以更低的成本获得计算能力。此外,研究人员已经能够引入新方法,这使得深度神经网络能够得到系统训练。

[2]其次,考虑到这是一项如此乏味的任务,你现在并不总是需要花时间从零开始训练一个深度神经网络。你通常可以从一个网络开始,这个网络已经被另一个研究小组或大公司在数百万个数据点上训练过。因此,您只需用自己的数据对网络进行微调。随后,您可以冻结部分网络,因为它将准备好执行基本操作,如图像处理中的边缘检测或自然语言处理中的单词矢量化。

[3]第三,如上所述,深度学习模型的非线性和线性部分是分离的。因此,如果非线性部分在训练中产生问题,您可以修改它们,而不会影响模型的其他部分。例如,如果您使用 sigmoid 作为深度神经网络中的激活函数,训练步骤将会失败。因此,无需太多努力,您就可以用分段线性函数(即校正线性函数)替换该非线性函数(即 sigmoid 函数)。

最后的话。

我们有时会投入实现复杂的算法和方法,而花费较少的时间和资源来学习它们的高级概念。例如,能够快速编写代码来计算文档相似性或提取文档主题,这确实很棒。然而,如果你不知道背后的细节,你可能会被误导。在这篇文章中,我试图阐明深度学习。我希望你已经发现它的信息。

感谢阅读!

如果你喜欢这个帖子,想支持我…

https://pedram-ataee.medium.com/membership

深度学习正在被过度使用

原文:https://towardsdatascience.com/deep-learning-is-becoming-overused-1e6b08bc709f?source=collection_archive---------38-----------------------

理解数据是第一步

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:图片来自 Pixabay

当以黑箱方式使用任何模型来分析数据时,总是存在危险,深度学习家族的模型也不例外。

不要误会我的意思——当然有像神经网络这样的模型可以胜过更简单的模型的情况——但有很多例子表明情况并非如此。

打个比方——假设你需要购买某种交通工具。如果你经常需要长距离运输大件物品,购买卡车是一项值得的投资。然而,如果你只是需要去当地的超市买些牛奶,这显然是浪费金钱。一辆汽车(或者甚至一辆自行车,如果你有气候意识的话)足以完成这个任务。

深度学习也开始以同样的方式使用。我们开始简单地向这些模型提供相关数据,假设性能将超过更简单的模型。此外,这通常是在没有正确理解相关数据的情况下完成的;即,认识到如果一个人对数据有直观的理解,深度学习就不是必要的。

时间序列分析

我最常做的是时间序列分析,所以让我们考虑一个这方面的例子。

假设一家酒店希望预测其向客户群收取的平均每日价格(或每日平均价格)。每个客户的平均日费率是按周计算的平均值。

LSTM 模型的配置如下:

model = tf.keras.Sequential()
model.add(LSTM(4, input_shape=(1, lookback)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
history=model.fit(X_train, Y_train, validation_split=0.2, epochs=100, batch_size=1, verbose=2)

以下是每周平均房价预测值与实际值的对比:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:Jupyter 笔记本输出

相对于平均值 160,RMSE 为 31。RMSE(均方根误差)的大小是平均 ADR 大小的 20%。虽然误差并不太高,但考虑到神经网络的目的是在最大化准确性方面胜过其他模型,这确实有点令人失望。

此外,这种特殊的 LSTM 模型是一步预测——这意味着在时间 t 之前没有所有数据可用的情况下,该模型无法做出长期预测。

也就是说,我们是否在将 LSTM 模型应用于数据方面走在了前面?

我们先把马牵回车前,先对数据有个整体的看法。

以下是 ADR 波动的 7 周移动平均值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:Jupyter 笔记本输出

当数据在 7 周移动平均线上平滑后,我们可以清楚地看到季节性模式的证据。

让我们仔细看看数据的自相关函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:Jupyter 笔记本输出

我们可以看到峰值相关性(在一系列负相关性之后)处于滞后 52 ,表明数据中存在年度季节性。

使用此信息,使用 pmdarima 配置 ARIMA 模型,以预测最近 15 周的 ADR 波动,自动选择 p、d、q 坐标以最小化 Akaike 信息标准。

>>> Arima_model=pm.auto_arima(train_df, start_p=0, start_q=0, max_p=10, max_q=10, start_P=0, start_Q=0, max_P=10, max_Q=10, m=52, stepwise=True, seasonal=True, information_criterion='aic', trace=True, d=1, D=1, error_action='warn', suppress_warnings=True, random_state = 20, n_fits=30)Performing stepwise search to minimize aic
 ARIMA(0,1,0)(0,1,0)[52]             : AIC=422.399, Time=0.27 sec
 ARIMA(1,1,0)(1,1,0)[52]             : AIC=inf, Time=16.12 sec
 ARIMA(0,1,1)(0,1,1)[52]             : AIC=inf, Time=19.08 sec
 ARIMA(0,1,0)(1,1,0)[52]             : AIC=inf, Time=14.55 sec
 ARIMA(0,1,0)(0,1,1)[52]             : AIC=inf, Time=11.94 sec
 ARIMA(0,1,0)(1,1,1)[52]             : AIC=inf, Time=16.47 sec
 ARIMA(1,1,0)(0,1,0)[52]             : AIC=414.708, Time=0.56 sec
 ARIMA(1,1,0)(0,1,1)[52]             : AIC=inf, Time=15.98 sec
 ARIMA(1,1,0)(1,1,1)[52]             : AIC=inf, Time=20.41 sec
 ARIMA(2,1,0)(0,1,0)[52]             : AIC=413.878, Time=1.01 sec
 ARIMA(2,1,0)(1,1,0)[52]             : AIC=inf, Time=22.19 sec
 ARIMA(2,1,0)(0,1,1)[52]             : AIC=inf, Time=25.80 sec
 ARIMA(2,1,0)(1,1,1)[52]             : AIC=inf, Time=28.23 sec
 ARIMA(3,1,0)(0,1,0)[52]             : AIC=414.514, Time=1.13 sec
 ARIMA(2,1,1)(0,1,0)[52]             : AIC=415.165, Time=2.18 sec
 ARIMA(1,1,1)(0,1,0)[52]             : AIC=413.365, Time=1.11 sec
 ARIMA(1,1,1)(1,1,0)[52]             : AIC=415.351, Time=24.93 sec
 ARIMA(1,1,1)(0,1,1)[52]             : AIC=inf, Time=21.92 sec
 ARIMA(1,1,1)(1,1,1)[52]             : AIC=inf, Time=30.36 sec
 ARIMA(0,1,1)(0,1,0)[52]             : AIC=411.433, Time=0.59 sec
 ARIMA(0,1,1)(1,1,0)[52]             : AIC=413.422, Time=11.57 sec
 ARIMA(0,1,1)(1,1,1)[52]             : AIC=inf, Time=23.39 sec
 ARIMA(0,1,2)(0,1,0)[52]             : AIC=413.343, Time=0.82 sec
 ARIMA(1,1,2)(0,1,0)[52]             : AIC=415.196, Time=1.63 sec
 ARIMA(0,1,1)(0,1,0)[52] intercept   : AIC=413.377, Time=1.04 sec

Best model:  ARIMA(0,1,1)(0,1,0)[52]          
Total fit time: 313.326 seconds

根据上面的输出,**【ARIMA(0,1,1)(0,1,0)【52】**是根据 AIC 最适合的模型的配置。

使用该模型,相对于 160 的平均 ADR,获得了 10 的 RMSE。

这比 LSTM 达到的 RMSE 低很多(这是一件好事),只占平均值的 6%多一点。

通过对数据的适当分析,人们会认识到数据中存在年度季节性成分使得时间序列更具可预测性——使用深度学习模型来试图预测这样的成分在很大程度上是多余的。

回归分析:预测客户 ADR 值

让我们对上述问题换个角度来看。

现在,让我们尝试预测每个客户的平均每周 ADR 值,而不是尝试预测平均每周 ADR。

为此,使用了两种基于回归的模型:

  • 线性 SVM(支持向量机)
  • 基于回归的神经网络

两个模型都使用了以下特征来预测每个客户的 ADR 值:

  • **已取消:**客户是否取消预订
  • **国家:**客户的原产国
  • **市场细分:**客户的市场细分
  • **押金类型:**客户是否已支付押金
  • **客户类型:**客户的类型
  • **垃圾收集站:**所需的停车位
  • 抵达日期星期号:抵达的星期

使用平均绝对误差作为性能度量,让我们比较获得的 MAE 相对于两个模型的平均值。

线性 SVM

ε为 0.5 的线性向量回归被定义并在训练数据中被训练:

svm_reg_05 = LinearSVR(epsilon=0.5)
svm_reg_05.fit(X_train, y_train)

现在使用测试集中的特征值进行预测:

>>> svm_reg_05.predict(atest)array([ 81.7431138 , 107.46098525, 107.46098525, ...,  94.50144931,
        94.202052  ,  94.50144931])

这是相对于平均值的平均绝对误差:

>>> mean_absolute_error(btest, bpred)
30.332614341027753>>> np.mean(btest)
105.30446539770578

MAE 是平均值的 28%。

让我们看看基于回归的神经网络是否能做得更好。

基于回归的神经网络

神经网络定义如下:

model = Sequential()
model.add(Dense(8, input_dim=8, kernel_initializer='normal', activation='elu'))
model.add(Dense(2670, activation='elu'))
model.add(Dense(1, activation='linear'))
model.summary()

然后,使用 150:

model.compile(loss='mse', optimizer='adam', metrics=['mse','mae'])
history=model.fit(xtrain_scale, ytrain_scale, epochs=30, batch_size=150, verbose=1, validation_split=0.2)
predictions = model.predict(xval_scale)

将测试集中的特征输入到模型中后,MAE 和平均值如下:

>>> mean_absolute_error(btest, bpred)
28.908454264679218>>> np.mean(btest)
105.30446539770578

我们看到平均大气透过率仅比使用 SVM 获得的略低。在这方面,当线性 SVM 模型表现出几乎相同的准确性时,很难证明使用神经网络来预测客户 ADR 是合理的。

无论如何,用来“解释”ADR 的特征选择等因素比模型本身更重要。俗话说“垃圾进,垃圾出”。如果特征选择很差,那么模型的输出也会很差。

在这种情况下,虽然两个回归模型都显示了一定程度的预测能力,但很有可能 1)选择数据集中的其他要素可以进一步提高准确性,或者 2)数据集中的要素可能会导致 ADR 出现太多变化。例如,数据集没有告诉我们关于每个客户的收入水平等因素的任何信息,而这些因素预计会显著影响他们每天的平均支出。

结论

在上面的两个例子中,我们已经看到,使用“更轻”的模型已经能够匹配(或超过)深度学习模型所达到的准确性。

虽然在有些情况下,数据可能非常复杂,需要算法“从零开始”学习数据中的模式,但这往往是例外而不是规则。

与任何数据科学问题一样,关键首先在于理解正在处理的数据。型号的选择是次要的。

非常感谢您的时间,任何问题或反馈都非常感谢!

上述例子的数据集和 Jupyter 笔记本可以在这里找到。

免责声明:本文是在“原样”的基础上编写的,没有担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。

参考

深度学习可能还不是所有 NLP 任务的银弹

原文:https://towardsdatascience.com/deep-learning-may-not-be-the-silver-bullet-for-all-nlp-tasks-just-yet-7e83405b8359?source=collection_archive---------38-----------------------

自然语言处理

为什么你仍然应该学习启发式和基于规则的方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

蒂莫西·戴克斯Unsplash 上拍摄

介绍

深度学习;解决人类问题的方法。在过去的几年里,深度学习以新颖的方式推进了人类。这些受益者之一是整个自然语言处理领域(NLP)。但在我们进入如何之前,让我们探索一下深度学习领域。

我很确定我们都见过维恩图,它说明了人工智能(AI)与机器学习(ML)和深度学习的关系。如果不是,它只是证明了深度学习是机器学习的一个子领域,而机器学习是人工智能的一个子领域。

深度学习与机器学习的不同之处在于,它涉及基于人脑的结构和功能开发的算法——这些结构和功能被称为人工神经网络

深度学习如何推进 NLP

软件行业的大部分正在转向机器智能或数据驱动的决策,但其他行业也注意到了它的影响,并对此感兴趣,如医疗保健行业。人工智能发展的一个很好的原因可以归结为机器学习和深度学习(当然还有其他使执行这些任务成为可能的因素),然而,近年来深度学习越来越受欢迎,因为它在准确性等指标方面占据优势,并且当我们有大量数据来支持我们的深度学习算法时。

例如,在文本分类任务中,基于递归神经网络(RNN)的模型已经超过了标准机器学习技术的性能水平,这些技术曾经由革命性的机器学习模型解决,如朴素贝叶斯分类器支持向量机。此外,LSTMs(它是 rnn 家族的一部分)在序列标记任务(如实体提取)中胜过条件随机场(CRF)模型。

最近,镇上有一个新的话题叫做变形金刚模型。Transformer 模型非常强大,已经成为大多数自然语言处理任务的最新模型。深入研究 transformer 模型的细节超出了本文的范围,但是如果您希望我在后面的教程中介绍它,请留下您的回复。

坠落

尽管深度学习取得了巨大的成功,但它仍然不是每个自然语言处理任务的灵丹妙药。因此,当面对 NLP 中的问题时,实践者不应该急于构建最大的 RNN 或转换器,原因如下:

过拟合

深度学习模型往往比传统的机器学习模型有更多的参数。因此,深度学习模型比传统模型具有更强的表达能力,这也是它们如此强大的原因。它如此强大的原因也是它最大弱点的来源。许多深度学习模型倾向于过度拟合小数据集,因此导致泛化能力差,这导致生产中的糟糕性能。

缺乏少投学习技巧

我通常不会比较,但在这种情况下,我们必须比较;看一看计算机视觉领域。深度学习在 CV 方面取得了很大的进步,因为一些技术,例如少量学习(例如,从很少的实例中学习),这导致了更广泛地采用深度学习来解决现实世界的问题。在 NLP 中,我们只是没有看到类似的深度学习技术以与计算机视觉相同的方式被成功采用。

域适配

当我们没有大量训练数据时,迁移学习对于提高深度学习模型的性能来说是革命性的。然而,利用在公共领域训练的深度学习模型,例如报纸文章,然后将其应用到更近的领域,如社交媒体帖子,可能会导致我们的深度学习模型的整体性能不佳。更简单但仍然非常有效的解决方案可能涉及传统的机器学习模型或特定领域的基于规则的模型。

可解释性

可解释性是近年来变得突出的东西——它是有意义的。你难道不想知道为什么你会被拒绝贷款吗?虽然有一些技术正在开发中,试图解释深度学习模型,但在很大程度上,它们像黑盒一样工作。在这种情况下,使用像朴素贝叶斯模型这样的技术可能更有用,这种技术可以很容易地解释为什么进行某种分类。

成本

成本很重要;用深度学习构建解决方案可能在时间和金钱方面都非常昂贵。与 Kaggle 不同,真实世界中的数据集不会被标记,并且不要忘记,我们需要一个大的数据集来保证我们的模型不会过度拟合。收集和标注大型数据集可能非常耗时,然后继续部署模型并在生产中维护它,在硬件要求和工作量方面可能非常昂贵。

最后的想法

这绝不是为什么深度学习可能还不是 NLP 任务的银弹的详尽列表,但它提供了现实世界项目中可能出现的场景类型的真实感觉。这些症状经常导致项目周期比它需要的要长得多,更不用说项目上线和交付后维护的更高成本了。此外,相对于传统的机器学习模型,性能的提高通常不是非常显著(即,如果有的话,准确性没有很大的提高)。

感谢您的阅读!在 LinkedIn 和 T2 Twitter 上与我保持联系,了解我关于数据科学、人工智能和自由职业的最新消息。

相关文章

</4-data-related-books-ill-be-reading-in-april-efd06b367e35> </5-ideas-for-your-next-nlp-project-c6bf5b86935c>

深度学习遇到高斯过程:深度核学习如何实现自主显微镜

原文:https://towardsdatascience.com/deep-learning-meets-gaussian-process-how-deep-kernel-learning-enables-autonomous-microscopy-58106574cfeb?source=collection_archive---------21-----------------------

马克西姆·齐亚丁诺夫&谢尔盖·加里宁

美国田纳西州橡树岭橡树岭国家实验室纳米材料科学和计算科学与工程中心

对于许多科学家和工程师来说,他们的职业之路是从显微镜开始的。在简单的光学显微镜或放大镜下,附近海滩的沙子开始看起来像一个山地国家,里面有硅藻和蜗牛的骨架以及彩色的矿物质。水坑中的水滴揭示了好奇的(有时令人不安的)微小生物。借助现代手机,谷歌眼镜可以帮助识别它们的类别和种类。干燥的盐溶液将显示彩虹色的晶体。在一个更专业的环境中,定制(也更昂贵)的电子和扫描探针显微镜揭示了材料的微米和纳米尺度结构,一直到可视化形成材料和分子表面的原子图案。下图显示了第二位作者拍摄的金色圆形蜘蛛和第一位作者拍摄的表面上的“布基球”分子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。(左)金球蜘蛛。(右)金表面的苏曼烯(“巴基球”)分子。作者提供的数据。

然而,现代显微镜不仅可以对材料及其表面进行成像,还可以对它们的性质进行更详细的研究。在扫描隧道显微镜(STM)中,操作者可以选择潜在感兴趣的区域并进行隧道光谱,即测量电流-电压曲线。在量子隧道的控制下,这条曲线将包含关于局域态密度、超导性、电荷密度波和表面上其他激发现象的信息[1–2]。在电子显微镜中,选择的技术是电子能量损失光谱[3]。在这里,测量穿过固体的电子的能量损失揭示了单个原子的化学结构,随着单色仪器的最新进展,允许探测固体中的准粒子,如电子和等离子体[4-5]。扫描探针显微镜中出现了特别广泛的可能光谱模式,允许研究人员探测局部机械性质、导电性和铁电极化转换[6–7]。

不幸的是,与成像相比,局部功能测量要花费很多时间。例如,获得一个简单的 STM 图像通常需要大约 5-10 分钟。在密集的空间网格点上获得密集的光谱曲线阵列需要几天时间,这就需要建造超稳定的显微镜,在这些时间内不会发生明显的漂移。同样的考虑也适用于电子显微镜,对于电子显微镜,还需要考虑电子束对样品的损伤。最后,许多测量是破坏性的,不能在密集网格上进行,例如纳米压痕。这些考虑严重限制了这些测量的能力以及它们对材料的结构和功能提供的洞察力。很像谚语中的琼恩·雪诺,如果我们不知道在哪里测量,我们就在任何地方测量,希望在非现场数据分析期间捕获感兴趣的行为,希望识别感兴趣的区域。机器学习能让我们做得更好吗?(提示:我们可以,否则这篇博文就写不出来了)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:现代显微镜,如左图所示的超高真空扫描隧道显微镜,可以在纳米尺度和原子尺度上探索材料的结构和功能。右边显示的是 2D 地形图,我们可以对 m x n 网格(未显示)进行光谱测量,并在两个网格点记录差分隧道电导光谱。作者图。

为了理解这一工作需要什么,我们首先考虑在基于高斯过程(GP)的实验中用于主动学习的聚合方法。在最一般的形式中,GP 指的是试图从一组稀疏测量值在特定(低维)参数空间上重建函数的一类算法。换句话说,给定一组观测数据点( x ᵢ, y ᵢ),并假设正态分布的观测噪声 ϵ,,GP 旨在重构函数 f ( x ),例如yᵢ=f(xᵢ)+ϵᵢ,其中f~ K ( x ᵢ, x ⱼ)).在实验之前选择核函数形式 K ,并且使用马尔可夫链蒙特卡罗方法或随机变分推断从观察值推断其超参数。你可以在这里阅读 GP 更严格的定义。另请参见我们之前在 GPs 上发布的中型帖子。我们小组已经将 GP 应用于多个成像问题,包括稀疏高光谱数据的重建铁电体中的磁滞回线工程晶格哈密顿量参数空间的高效探索,完整代码可通过 GPim 包获得。

GP 的独特之处在于,该函数连同相关的不确定性σ(x)一起被重构。这一方面允许将 GP 扩展到主动学习方法。假设我们想要通过顺序选择点来执行测量,以最有效的方式学习参数空间上的函数值。在这种情况下,具有最大不确定性的区域代表查询的最佳点。以这种方式,GP 驱动的自动化实验寻求以最迅速的方式减少关于功能的不确定性。

应该注意的是,GP 可以进一步扩展以针对特定行为。在这种情况下,如果我们预先知道我们正在寻找的函数值,我们可以在一个单一的采集函数中结合期望和不确定性。然后,采集函数的最大值(或最小值)用于参数空间的导航。这种结合了参数空间的探索和利用的方法通常被称为贝叶斯优化(BO)。

那么问题就变成了 GP/BO 是否可以用来实现显微镜的自动化实验。事实证明,在简单成像或光谱学的情况下,总增益相对较小。事实上,图像通常包含许多不同长度尺度的多个特征——从大到小。我们事先不知道这些特征是什么。相应地,试图基于单点测量导航图像空间并发现相关核函数的基于 GP 的算法会遇到困难。事实上,对于已知图像,核函数大致相当于相关函数,这不是表示图像的非常有效的方式。原则上,可以通过将标准多元分解(PCA,NMF)或自动编码器技术应用于图像补片来实现图像的简化表示。然而,不能保证这些简化的表示在物理上是有意义的,并且它们可能经常受到仪器因素的支配,例如漂移(在许多情况下,领域专家必须将物理变量与非物理变量分开,这违背了自动化实验的全部意义)。此外,分解需要补丁提前可用,这违背了发现的概念。

GP 产生的增益进一步降低,因为如果被迫沿着非常复杂的路径移动探针,显微镜的电子和机械装置会开始失效。最重要的是,GP 通常不能很好地预测复杂的模式。总之,它看起来像 GP 它不足以在显微镜下进行自动化实验。

进入深度内核学习。为了理解它是如何工作的,让我们回顾一下如果操作员看到图像他们会做什么。人眼会立即记录感兴趣的物体。例如,在图 2 中超导体的 STM 图像中,我们可以立即注意到有亮点的区域。一个合格的操作员会立即识别出这些区域可能是局域电子态的宿主,尽管它的性质可能依赖于周围的环境。类似地,人们可以注意到具有条纹对比度的多个区域,这可能是表面重建的指示。它们有很多,很明显它们应该有相似的行为。因此,对其中几个进行光谱测量,并假设观察到的行为具有代表性,也许就足够了。然而,也存在一些区域,其中小的凹陷和/或突起嵌入到条纹域中,并且这些区域可能包含关于该系统的物理的一些额外的有趣见解。接下来的问题是,我们是否可以利用结构图像中包含的信息,以自主的方式指导光谱测量。

深度内核学习(DKL),最初由 Andrew Gordon Wilson 引入,可以理解为经典深度神经网络(DNN)和 GP 的混合体,如图 3 所示。这里,DNN 部分充当特征提取器,允许将复杂的高维特征减少到标准 GP 内核操作的低维描述符。通过在边缘对数似然上执行梯度上升来联合优化 DNN 和 GP 核的参数。新输入的 DKL 输出是感兴趣的属性(或属性,如果我们对向量值函数感兴趣)的期望值和相关的不确定性。让我们看看如何利用 DKL 在电子或扫描探针显微镜上进行实验。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3。深度核学习:训练和预测步骤。训练输入是(结构)图像补片,目标是感兴趣的物理功能的标量值(通常从那些补片中测量的光谱曲线中导出)。在预测步骤,训练的 DKL 模型用于获得感兴趣的功能的期望值和新的一组结构图像补片的相应的不确定性(对于该新的一组结构图像补片,功能还没有被实验测量)。作者图。

我们将展示两个基本的例子,其中 DKL 被用于映射材料结构的部分,以最大化特定的物理功能。为此,DKL 必须了解系统中相关的结构-性质关系。在实现方面,DKL 训练输入是结构图像的小块,训练目标是与从块中心测量的光谱中导出的一些物理功能相关联的标量值(DKL 也可以与向量值目标一起工作,甚至可以预测整个光谱,但这些将在单独的帖子中讨论)。目标是使用易于获取的结构数据来指导通常更加繁琐的光谱测量。因此,基于 DKL 的自动化实验从收集结构图像开始,该结构图像被分割成一组小碎片(每个图像像素一个碎片),随后在图像的随机位置获取几个光谱曲线。这些稀疏观察用于训练 DKL 模型。然后,使用训练的 DKL 模型来预测没有测量光谱的结构图像的每个坐标中的感兴趣的特性(或者,更具体地,对于以该坐标为中心的每个图像片)。预测的平均特性值和相关的不确定性用于导出采集函数,以对下一个(多个)测量点进行采样。一旦执行了新的测量,就更新训练数据,并重复整个过程。

首先,让我们使用在等离子体纳米立方体上获得的公开可用的数据集。这里我们的结构数据来自扫描透射电子显微镜图像。感兴趣的功能源自在相同区域上测量的电子能量损失谱,并且在该特定示例中,仅仅是边缘等离子体峰的强度。我们运行 DKL 100 次迭代,这大约是总网格点的 3%。在每次迭代中,我们使用简单的 Thompson 采样器选择下一个测量点。因为我们已经知道了地面实况,我们可以用地面实况地图覆盖采样点。可以看到,我们能够通过测量网格的一小部分来识别结构图像中感兴趣的功能最大化的区域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4。基于 DKL 的纳米等离子体阵列区域的搜索。作者图。

现在,让我们来看看这种方法是如何在压电响应力显微镜中识别最大化迟滞回线面积的样品区域的。我们的 DKL 设置与之前的实验几乎相同,只是现在,在每一步,我们采样一批 4 个点,而不仅仅是一个点。同样,从下面的图 5 中可以看出,我们能够用非常少的测量值(整个网格的大约 5%)快速定位感兴趣的行为。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5。基于 DKL 搜索最大化磁滞回线面积的区域。作者图。

总的来说,这种方法通过主动学习系统中的结构-性质关系,使用结构信息来指导光谱(功能)测量。重要的是,我们可以使用几乎任何物理搜索标准,从这篇博文中使用的简单标准到复杂得多的标准。以这种方式,我们结合相关机器学习的能力来建立多维数据集中的关系,并导出相应的不确定性,以及在搜索标准的选择中编码的领域专业知识。

请查看我们的 AtomAI 软件包,将该工具和其他深度/机器学习工具应用于科学成像。如果你想了解更多关于扫描探针显微镜的知识,欢迎来到 M*N 频道:显微镜,机器学习,材料。最后,在科学界,我们感谢资助这项研究的赞助商。这项工作在橡树岭国家实验室纳米材料科学中心(CNMS)进行并得到支持,该中心是美国能源部科学用户设施办公室。您可以使用此链接进行虚拟漫游,如果您想了解更多,请告诉我们。

其中一个例子的可执行 Google Colab notebook 可以在这里找到。

参考文献:

1.鲁山,p;徐,j;帕克;Hor,Y. S 谢博士;钱博士;理查德拉,a。哈桑;R. J .卡瓦;手征自旋织构保护拓扑表面态免受反向散射。性质 2009、 460 (7259)、1106-U64。

2.潘;赫德森;郎;卫崎;内田,s;成像单个锌杂质原子对 bi 2 Sr 2 cacu 2 o 8+δ超导性的影响。性质 2000、 403 (6771)、746–750。

3.彭尼库克,S. J。瓦雷拉,男;卢皮尼;奥克斯利议员;齐索姆,M. F,《原子分辨率光谱成像:过去、现在和未来》。j .电子显微公司。 2009, 58 (3),87–97。

4.Kapetanakis,医学博士;周;奥克斯利议员;李,j;议员普朗格;彭尼库克,S. J。Idrobo,J. CPantelides,S. T,《低损失电子能量损失光谱学:光学光谱学的原子分辨率补充及其在石墨烯中的应用》。物理修订 B 2015、 92 (12)。

5.哈格,F. S。尼科尔斯;耶茨;麦卡洛克特区;洛夫乔伊;新泽西州德尔比;克里瓦内克;里夫森,k。纳米尺度动量分辨振动光谱学。 Sci。Adv. 2018, 4 (6),6。

6.加里宁公司;斯特尔科夫,e;别利亚尼诺夫。索姆纳特;瓦苏德万;林格费尔特;阿奇博尔德;陈;普罗克什河;新泽西州拉纳伊特;扫描探针显微镜中的大、深、智能数据。 ACS Nano 2016, 10 (10),9068–9086。

7.瓦苏德万;杰西;金,y;库马尔,a。压电响应力显微镜中的光谱成像:研究铁电体和多铁性中极化动力学的新机会。科曼夫人。 2012, 2 (3),61–73。

8.加里宁公司;瓦莱蒂,m;瓦苏德万;Ziatdinov,m,《通过基于高斯过程的探索-利用进行功能和结构发现的晶格哈密顿量探索》。 J. Appl. Phys. 2020, 128 (16),11。

9.加里宁公司;齐亚特迪诺夫,m;Vasudevan,R. K,《通过生成模型的贝叶斯优化引导搜索期望的功能响应:铁电体中的磁滞回线形状工程》。 J. Appl. Phys. 2020, 128 (2),8。

使用 SHAP 的深度学习模型解释

原文:https://towardsdatascience.com/deep-learning-model-interpretation-using-shap-a21786e91d16?source=collection_archive---------1-----------------------

图像和表格数据的 Python 实现

传统上,机器学习和深度学习的批评者说,即使他们获得了准确的预测,我们也在创建“黑盒”模型。但这是一种误解。机器学习和深度学习模型是可以解释的。模型解释在学术界和工业界的研究者中是一个非常活跃的领域。Christoph Molnar 在他的书“可解释的机器学习”中,将可解释性定义为人类能够理解决策原因的程度,或者人类能够持续预测 ML 模型结果的程度。

由于可解释性,今天越来越多的公司在决策过程中有效地使用机器学习和深度学习,或者计划将它们纳入未来的战略,即使是在医药和金融等高度监管的领域。

根据数据集的性质,一些数据科学家更喜欢经典的机器学习方法。有时深度学习在非表格领域表现出色,如计算机视觉、语言和语音识别。

当我们谈论模型可解释性时,理解全局方法和局部方法之间的区别是很重要的:

  • 全局方法是理解模型如何做出决策的整体结构。
  • 本地方法是理解模型如何为单个实例做出决策。

有许多方法旨在提高模型的可解释性。 SHAP 值是解释模型和理解数据特征与输出之间关系的最常用方法之一。这是一种源自联盟博弈理论的方法,它提供了一种在特性之间公平分配“支出”的方式。

SHAP 价值观的最大优势之一是它们提供了全局和局部的可解释性。本文重点介绍使用 SHAP 对表格数据和非结构化数据(本文图片)进行深度学习模型解释。

由 SHAP 深度讲解器讲解图像分类

图像分类任务可以通过预测图像上每个像素的分数来解释,该分数指示它对将该图像分类到特定类别的贡献程度。在本文中,我将:

  • CIFAR10 数据集上训练 CNN 模型
  • 计算 SHAP 值
  • 可视化预测结果和 SHAP 值

首先,让我们加载并转换 keras 内置数据集。

# load package
import shap
import numpy as np
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
from keras.models import Sequential
import ssl# load build-in dataset
ssl._create_default_https_context = ssl._create_unverified_context
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()# reshape and normalize data
x_train = x_train.reshape(50000, 32, 32, 3).astype("float32") / 255
x_test = x_test.reshape(10000, 32, 32, 3).astype("float32") / 255
y_train = y_train.reshape(50000,)
y_test = y_test.reshape(10000,)

现在让我们建立一个简单的神经网络,编译并拟合模型。

# define the model architecture
inputs = keras.Input(shape=(32, 32, 3))
x = keras.layers.Conv2D(32, (3, 3), activation='relu')(inputs)
x = keras.layers.MaxPooling2D((2, 2))(x)
x = keras.layers.Conv2D(128, (3, 3), activation='relu')(inputs)
x = keras.layers.MaxPooling2D((2, 2))(x)
x = keras.layers.Conv2D(64, (3, 3), activation='relu')(inputs)
x = keras.layers.MaxPooling2D((2, 2))(x)
x = keras.layers.Conv2D(32, (3, 3), activation='relu')(inputs)
x = keras.layers.MaxPooling2D((2, 2))(x)
x = keras.layers.Flatten()(x)
x = keras.layers.Dense(256, activation='relu')(x)
x = keras.layers.Dense(64, activation='relu')(x)
outputs = keras.layers.Dense(10, activation='softmax')(x)# inputs and outputs
model = keras.Model(inputs=inputs, outputs=outputs, name="test_for_shap")# compile the model
model.compile(
      loss=tf.keras.losses.SparseCategoricalCrossentropy(),
      optimizer=keras.optimizers.Adam(),
      metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]
  )model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs = 10)

接下来,让我们在测试集上进行预测(每个类一个图像)。

# class label list
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
               'dog', 'frog', 'horse', 'ship', 'truck']# example image for each class
images_dict = dict()
for i, l in enumerate(y_train):
  if len(images_dict)==10:
    break
  if l not in images_dict.keys():
    images_dict[l] = x_train[i].reshape((32, 32,3))
images_dict = dict(sorted(images_dict.items()))

# example image for each class for test set
x_test_dict = dict()
for i, l in enumerate(y_test):
  if len(x_test_dict)==10:
    break
  if l not in x_test_dict.keys():
    x_test_dict[l] = x_test[i]# order by class
x_test_each_class = [x_test_dict[i] for i in sorted(x_test_dict)]
x_test_each_class = np.asarray(x_test_each_class)# Compute predictions
predictions = model.predict(x_test_each_class)
predicted_class = np.argmax(predictions, axis=1)

然后,我们为实际类和预测类定义绘图函数。

# plot actual and predicted class
def plot_actual_predicted(images, pred_classes):
  fig, axes = plt.subplots(1, 11, figsize=(16, 15))
  axes = axes.flatten()

  # plot
  ax = axes[0]
  dummy_array = np.array([[[0, 0, 0, 0]]], dtype='uint8')
  ax.set_title("Base reference")
  ax.set_axis_off()
  ax.imshow(dummy_array, interpolation='nearest') # plot image
  for k,v in images.items():
    ax = axes[k+1]
    ax.imshow(v, cmap=plt.cm.binary)
    ax.set_title(f"True: %s \nPredict: %s" % (class_names[k], class_names[pred_classes[k]]))
    ax.set_axis_off() plt.tight_layout()
  plt.show()

现在,我们可以使用 SHAP 库来生成 SHAP 值:

# select backgroud for shap
background = x_train[np.random.choice(x_train.shape[0], 1000, replace=False)]# DeepExplainer to explain predictions of the model
explainer = shap.DeepExplainer(model, background)# compute shap values
shap_values = explainer.shap_values(x_test_each_class)

最后,我们可以看到 SHAP 的价值观。

# plot SHAP values
plot_actual_predicted(images_dict, predicted_class)
print()
shap.image_plot(shap_values, x_test_each_class * 255)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者

在这个可视化中:

  • 红色像素代表有助于将该图像分类为特定类别的正 SHAP 值。
  • 蓝色像素表示负 SHAP 值,这导致没有将该图像分类为该特定类别。

用 SHAP 深层解释器解释表格数据分类

大量的数据可以用表格的形式表示。下图是一个完全连接的神经网络,通过 SHAP 深度解释器,我们可以知道哪个输入特征实际上对模型输出和大小有贡献。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者

在本文中,我将使用开源的 Titanic 数据集进行演示:

  • 训练多层感知模型
  • 计算 SHAP 值
  • 视觉全局和局部图

首先,我加载包和泰坦尼克号数据。

# import package
import shap
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras import optimizers
import warnings 
warnings.filterwarnings('ignore')
%matplotlib inline
import os# load data
os.chdir('/titanic/')
train_data = pd.read_csv('./train.csv', index_col=0)
test_data = pd.read_csv('./test.csv', index_col=0)
train_data.head()

然后,我们通过删除不必要的列、处理丢失的数据、将分类特征转换为数字特征以及进行一次性编码来处理原始数据。

def data_preprocessing(df):
    df = df.drop(columns=['Name', 'Ticket', 'Cabin'])

    # fill na
    df[['Age']] = df[['Age']].fillna(value=df[['Age']].mean())
    df[['Embarked']] = df[['Embarked']].fillna(value=df['Embarked'].value_counts().idxmax())
    df[['Fare']] = df[['Fare']].fillna(value=df[['Fare']].mean())

    # categorical features into numeric
    df['Sex'] = df['Sex'].map( {'female': 1, 'male': 0} ).astype(int)

    # one-hot encoding
    embarked_one_hot = pd.get_dummies(df['Embarked'], prefix='Embarked')
    df = df.drop('Embarked', axis=1)
    df = df.join(embarked_one_hot)

    return df# train data processing
train_data = data_preprocessing(train_data)
train_data.isnull().sum()# create data for training
x_train = train_data.drop(['Survived'], axis=1).values# Check test data
test_data.isnull().sum()# scale
scale = StandardScaler()
x_train = scale.fit_transform(x_train)# prepare y_train
y_train = train_data['Survived'].valuestest_data = data_preprocessing(test_data)
x_test = test_data.values.astype(float)# scaling
x_test = scale.transform(x_test)# Check test data
test_data.isnull().sum()

接下来是定义、编译和拟合 keras 模型。

# build mlp
model = Sequential()
model.add(Dense(32, input_dim=x_train.shape[1], activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(8, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(2, activation='softmax'))# compile model
model.compile(loss='sparse_categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])# fit model
model.fit(x_train, y_train, epochs=10, batch_size=64)

然后我计算 SHAP 值。

# compute SHAP values
explainer = shap.DeepExplainer(model, x_train)
shap_values = explainer.shap_values(x_test)

SHAP 全球解读

汇总图显示了最重要的特征及其对模型的影响程度。这是全球的解释。

shap.summary_plot(shap_values[0], plot_type = 'bar', feature_names = test_data.columns)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者

SHAP 当地解读

在本文中,我将展示一个示例的三种可视化解释:

  • 力图
  • 决策图
  • 瀑布图

力图有助于了解“输出值”相对于“基础值”的位置。我们还可以看到哪些要素对预测有正面(红色)或负面(蓝色)影响,以及影响的大小。

shap.initjs()
shap.force_plot(explainer.expected_value[0].numpy(), shap_values[0][0], features = test_data.columns)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

决策图可以观察每个变化的幅度,由样本对显示的特征值进行处理。

shap.decision_plot(explainer.expected_value[0].numpy(), shap_values[0][0], features = test_data.iloc[0,:], feature_names = test_data.columns.tolist())

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者

瀑布图还允许我们看到某个特性影响的幅度和性质。它还允许查看特征的重要性顺序以及样本的每个特征所取的值。

shap.plots._waterfall.waterfall_legacy(explainer.expected_value[0].numpy(), shap_values[0][0], feature_names = test_data.columns)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者

结论和下一步措施

AI 算法在我们生活中占据的空间越来越大,被广泛应用于各个行业。对于数据科学家、决策者和监管者来说,模型可解释性是一个非常重要的话题。在这篇文章中,我主要讲述了使用 python 代码一步步对图像和表格数据进行深度学习模型解释。我将在未来的帖子中分享更多关于文本数据的深度学习模型解释,而不是指导实现。

参考

  1. https://christophm.github.io/interpretable-ml-book/
  2. https://cloud . Google . com/blog/products/ai-machine-learning/why-you-need-to-explain-machine-learning-models
  3. https://github.com/slundberg/shap
  4. 【https://www.kaggle.com/c/titanic/data
  5. https://www.openml.org/d/40945
  6. https://en . Wikipedia . org/wiki/explable _ artificial _ intelligence
  7. neuralnetworksanddeeplearning.com
  8. https://www . cs . Toronto . edu/~ kriz/learning-features-2009-tr . pdf
  9. https://www.cs.toronto.edu/~kriz/cifar.html

深度学习模型可视化

原文:https://towardsdatascience.com/deep-learning-model-visualization-6cf6290dc981?source=collection_archive---------30-----------------------

可视化神经网络如何在感知器级别学习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

艾莉娜·格鲁布尼亚克在 Unsplash 上的照片

你有没有想过一个深度学习模型是如何在后端学习的?每一层如何帮助传递信息到下一层,每一层学到了什么信息?如果你真的可以分析和想象模型是如何在每次迭代后找到图像中的模式,那不是很好吗?如果这一切让你兴奋,那么你来对地方了。

在本文中,我将向您展示如何可视化深度学习模型如何在每次迭代中学习,以及它们如何试图找到模式。

我们将探索一个名为“keras-vis”的库,它将解决上面给出的目的。它是一个开源的 python 库,有助于可视化深度学习神经网络模型。它是一个高级工具包,用于可视化和调试经过训练的 Keras 神经网络。让我们开始吧…

安装 keras-vis

为了安装 keras-vis,我们将使用下面给出的命令。对于本文,我们将使用 google collab。

!pip install git+https://github.com/raghakot/keras-vis.git

目前,该库支持 TensorFlow 版本 1.8 和 Keras 版本 2.2.0,下面给出的命令将安装所需的版本。

!pip uninstall tensorflow
!pip install tensorflow==1.8
!pip uninstall keras
!pip install keras==2.2.0

导入所需的库

为了创建模型和可视化,我们需要导入某些库,复制下面给出的代码来导入这些库。

**import** **numpy** **as** **np**
**import** **keras**
**from** **keras.datasets** **import** mnist
**from** **keras.models** **import** Sequential, Model
**from** **keras.layers** **import** Dense, Dropout, Flatten, Activation, Input
**from** **keras.layers** **import** Conv2D, MaxPooling2D
**from** **keras** **import** backend **as** 
**from** **vis.visualization** **import** visualize_activation
**from** **vis.utils** **import** utils
**from** **keras** **import** activations

**from** **matplotlib** **import** pyplot **as** plt
%matplotlib inline

为了创建模型,我们需要定义架构在本文中,我们不讨论如何创建模型架构您可以复制下面的命令来创建 MNIST 数据集的模型架构以及如何训练它。

batch_size = 32
num_classes = 10
epochs = 50

*# input image dimensions*
img_rows, img_cols = 28, 28

*# the data, shuffled and split between train and test sets*
(x_train, y_train), (x_test, y_test) = mnist.load_data()

**if** K.image_data_format() == 'channels_first':
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)
**else**:
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

*# convert class vectors to binary class matrices*
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax', name='preds'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adam(),
              metrics=['accuracy'])

model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test))

score = model.evaluate(x_test, y_test, verbose=0)

训练完这个模型后,现在让我们看看密集层可视化。

密集层可视化

*# Swap softmax with linear* layer_idx = utils.find_layer_idx(model, 'preds')
model.layers[layer_idx].activation = activations.linear
model = utils.apply_modifications(model)

*# This is the output node we want to maximize.*
fil_idx = 10
img = visualize_activation(model, layer_idx, filter_indices=fil_idx)
plt.imshow(img[..., 10])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

密集层可视化(来源:作者)

激活最大化

img = visualize_activation(model, layer_idx, filter_indices=filter_idx, input_range=(0., 1.))
plt.imshow(img[..., 0])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

激活最大化(来源:作者)

所以,在这幅图中,你可以清楚地看到,模型是如何知道这幅图是零的,但还是不清楚。接下来,我们将看到如何正则化权重,并使用激活最大化使其更加清晰。

img = visualize_activation(model, layer_idx, filter_indices=output_idx, input_range=(0., 1.))
plt.imshow(img[..., 0])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

权重调整(来源:作者)

现在让我们想象所有类的激活最大化。

**for** output_idx **in** np.arange(2,5):
    img = visualize_activation(model, layer_idx, filter_indices=output_idx, input_range=(0., 1.))
    plt.figure()
    plt.imshow(img[..., 0])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(来源作者)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(来源作者)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(来源作者)

这就是你如何使用 Keras Vis 可视化你的深度学习模型。试试这个,让我知道你在回复部分的经历。

本文与 皮尤什 合作。

在你走之前

感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。可以查看我的Github简介针对不同的数据科学项目和包教程。还有,随意探索 我的简介 ,阅读我写过的与数据科学相关的不同文章。

低资源语言语法错误处理的深度学习模型

原文:https://towardsdatascience.com/deep-learning-models-for-grammatical-error-handling-in-low-resource-languages-2ac2c5d154f5?source=collection_archive---------32-----------------------

卡纳达语语法错误纠正个案研究

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplash 上由 Nikhita S 拍摄的照片

  1. 介绍
  2. 商业问题
  3. 映射到 ML/DL 问题
  4. 理解数据
  5. 数据处理
  6. 先决条件
  7. 结构
  8. 韵律学
  9. 部署
  10. 结论和未来工作
  11. 轮廓
  12. 参考

1。简介

语法(语言学)

中的 语言学中的 ,语法(来源于 古希腊语γραμματικήgrammatikḗ)中的一种 自然语言 是其套 结构上的 约束说话者或写作者的 从句 这个术语也可以指对这样的约束条件的研究,一个领域包括诸如https://en.wikipedia.org/wiki/Phonology词法 句法 之类的领域,通常由 语音学补充【维基百科】

缺乏大型单语或平行语料库和手工制作的语言资源的语言被称为低资源语言。在 NLP 中,与流行语言相比,这些语言很多,比如英语,它们有相对成熟的人工智能框架和工具。在这个案例研究中,我们认为卡纳达语是一种低资源语言。

卡纳达语(卡纳达语语法)

卡纳达语是印度西南部卡纳塔克邦人主要使用的一种语言。

语法是正确使用和推广语言的指南。卡纳达语语法是基于 Keshiraja 的“ S habdamanidarpana”(公元 1260 年)。除此之外,在“ K avirajamarga”和 Nagavarma II 的“ K avyalocana”和“ K arnataka Bhasha Bhushan”中提到了卡纳达语语法。

卡纳达语字母表中有 49 个字母。主要部分是

  1. Swaras + Yogavahagalu(元音)
  2. Vyanjana(辅音)
  3. Nama pada(名词)
  4. 克里亚帕达(动词)
  5. Sarvanama(代词)
  6. 林加语(性别)
  7. Vibhakti 和 Pratyaya(客体,主体)
  8. Tatsama 和 Tadbhava(梵语和本地语)
  9. 变调(复调)
  10. Samasa(复利)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡纳达字母(作者图片)

2。商业问题

业务问题是,检测文本中至少 30%的语法错误,并在合理的周转时间和最佳的 CPU 利用率内纠正它们。在低资源设置中的 GEC 系统可以用作文字处理器、帖子编辑器以及作为语言学习者的学习辅助。

3。映射到机器学习问题

上述业务问题可以使用统计模型、基于规则的模型和神经机器翻译模型来解决。在这个案例研究中,我们实验了一种神经机器翻译方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

框图(图片由作者提供)

我们这里使用的损失函数是稀疏分类交叉熵,这是使用标签和预测的损失计算。

4。理解数据

我们从 IndicCorp 收集的数据集是最大的公开可用的印度语言语料库之一。

我们通过运行 curl wget 小部件来提取数据集。

我们检查了使用 head 命令提取的文本文件的前几行。

作者图片

5。数据预处理

在数据预处理中,我们需要为数据集中的每条记录构建真实的和屈折的句子对。为简单起见,我们将把来自数据集的输入文本视为原始的正确(真实)句子。由此,我们需要构建错误的句子。为了构造错误的句子,我们需要对整个数据集进行标记,并通过一个词性标注器单独解析每个句子,以获得每个标记的实体。

我们使用 IndicNLP[ indicnlp ]库来标记我们的文本。我们将结果文件传递到 POS Tagger[ postagger ]中。我们得到了生成的令牌以及它们的 pos 标签。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

使用 python 中的 regex 和 dictionary,我们根据词性生成了每个句子的词形变化,并将它们存储在单独的 pickle 文件中。

产生拐点的另一种方法

我们安装了 inltk[ inltk ]库,然后使用 joblib 库和并行处理生成了原始句子的 3 个变形。这就像图像处理中的数据扩充。使用这种方法生成的句子,其中一些有屈折变化,但其他的保持不变。这种方法没有涵盖语法错误变化的所有功能点。因此,这种方法不能产生拐点。在以后的章节中,我们将讨论我们如何使用这种方法训练模型,而模型却失败了。

6。先决条件

本文的读者应该熟悉 Python 编程、机器学习和深度学习、TensorFlow 和构建数据驱动的应用程序的基础知识。

7。架构

有许多架构,在 Google Colaboratory 上对 30k 数据集进行了实验,CPU 作为硬件加速器用于数据集收集和预处理步骤,GPU 作为硬件加速器用于模型训练和预测。对于那些体系结构,语法错误处理一点也不令人满意。

最后,我们选择了 Bahdanau 的附加注意力,在 TensorFlow 博客中详细介绍了机器翻译。

我们在编码器层使用 BPEmb 来获得子词嵌入。我们分别训练了 3 个模型

  • 模式 1:句子的字数<= 6. The default parameters left as it is for the Adam optimizer. Without any regularization, the model seemed to overfit.
  • Model2: The number of words in sentence <= 6. The learning rate of the Adam optimizer was chosen to be 5e-5. We used an l2 regularizer for the Encoder Dense layer. The predictions were average on the validation dataset
  • Model3: The number of words in sentence > 6。Adam 优化器的学习速率被选择为 5e-5。我们对编码器密集层使用 l2 正则化。验证数据集上的预测也很好。

模型 1

我们已经训练了该模型,并且在 50 个时期内,快速获取的单批输入减少到零。因此,这是一个过拟合模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们还对训练数据集中的少数记录进行了随机预测。错误被处理,但是那些从输入句子到输出没有变化的单词被随机预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

训练预测(图片由作者提供)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

验证预测(作者图片)

模型 2

我们已经训练了 500 个模型,并且很快地取得了不减少到零的单批输入。因此,该模型不是过拟合模型。然而,预测并不令人满意。这可能主要是由于输入数据集中的拐点数量较少,这是因为输入数据集中的拐点长度减少了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模型 2 单批次损失(图片由作者提供)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

验证数据集预测(图片由作者提供)

模型 3

我们已经训练了模型,整个批次的损失在 500 个时期内减少到零。因此,这是我们当前环境设置中的最佳模式。在翻译时,我们根据大部分句子长度将每个句子的最大长度限制为 10。但是该模型似乎忠实地纠正了它在给定时间点呈现的所有令牌,在较短的周转时间内实现了最佳的 CPU 利用率。

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

验证数据集的预测(图片由作者提供)

8。指标

我们选择使用 BLEU 评分和 ROUGE-L 评分作为所有模型的性能指标。以下是所有模型的得分对比。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

BLEU 分数比较(图片由作者提供)

以下是训练和验证数据集的所有三个模型的 rouge-l 分数。原始数据集的总大小为 30k。我们考虑在训练和验证集中随机抽取 100 个句子来计算 rouge-l 分数。下表总结了训练和验证数据集的 F1 分数。根据 f1 分数,我们可以得出结论,模型 3 在给定模型中表现最佳。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分数比较

9。部署

使用 TensorFlow API 将 translate 函数公开为 TensorFlow 中的服务。并且可以部署在 TensorFlow 服务器上。

以下链接加载了谷歌联合实验室中的预测演示。****

***https://drive.google.com/file/d/1YN-KYZkc-I9wM1-h8i7DABWX7ek9QczB/view?usp=sharing https://drive.google.com/file/d/1VOV9YmoZlH4JE8Sgm8LEG2jnXjK2dSTA/view?usp=sharing

10。结论和未来工作

我们可以得出结论,对于给定的设置,模型 3 在其余模型中表现最好。

我正在研究以下想法

  • 为错误变化生成更多的平行语料库和数据集
  • 超参数调谐更高级的语法概念,如短语和从句

11。轮廓

完整源代码可从 Githublink2 获得

如果您对以上任何方面有任何问题或建议,请通过 LinkedIn 与我联系

12。参考文献

用于头颈部器官分割的深度学习模型

原文:https://towardsdatascience.com/deep-learning-models-for-organ-segmentation-in-the-head-and-neck-region-35c0cac0657b?source=collection_archive---------52-----------------------

使用 MICCAI 2015 —头颈自动分割挑战赛的 CT 图像

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

克雷格·卡梅隆在 Unsplash 上的照片

放射治疗现在是治疗头颈部癌症的常用方法。为了确保健康的器官受到最小量的杀死肿瘤的辐射,需要将它们分段。由于在这个耗时的过程中存在注释者之间(即放射肿瘤学家之间的*)的变化,所以需要对这种器官进行自动分割。这种变化导致辐射剂量的差异,并且计划时间要求导致治疗的延迟。*

这篇文章将比较和评论不同的深度学习方法来自动分割这种处于危险中的器官(OAR)。我们将重点关注的模型开发领域如下

  • 数据预处理
  • 神经网络体系结构
  • 培训方法

资料组

Ref: Raudaschl 等人,“头颈部 ct 上分割方法的评估:2015 年自动分割挑战”。医学物理44.5(2017):2020–2036。

本次 MICCAI2015 —头颈部自动分割挑战赛由分为 4 类的 CT 扫描组成— 训练 (25 名患者)、训练 _ 附加 (8 名患者)、测试 _ 场外 (10 名患者)、测试 _ 现场 (5 名患者)。大多数方法将训练文件夹(25+8 = 33 名患者)与 test_offsite 文件夹上的测试相结合。这个数据集中有 9 个桨——1 个脑器官(脑干,3 个视觉器官(视交叉左&右视神经,1 个骨骼(下颌骨,4 个唾液腺(左&右腮腺,左&右颌下腺)。显示这些器官的形状和相对空间位置的视频可以在这里找到。该数据集的一些独特特征是

  • 下颌骨(下颌骨)非常容易分割(或用放射疗法术语),因为骨骼结构在 CT 图像中呈现出良好的对比度。
  • 视觉器官非常薄,仅出现在少数 CT 切片上。因此,由于它们的小 3D 结构,它们是最难自动注释的
  • 诸如脑干和唾液腺的其他器官也难以分割,因为 CT 图像具有较差的软组织对比度。人类甚至很难描绘它们,只有训练有素的专家(在其他形式的帮助下,如先生)才能这样做。
  • 图像似乎来自不同的扫描仪,因为它们在 x、y 和 z 轴上具有不同的体素分辨率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:MICCAI2015 数据集在 X、Y 和 Z 方向上的体素间距直方图

AnatomyNet

【参引:朱等,“AnatomyNet:深度学习实现头颈部解剖的快速全自动全体积分割”。2019 年医学物理学

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:解剖网络的神经架构(来自医学物理学

数据

与之前将大量医学体积(例如 CT 或 MR)作为 3D 补片或 2D 切片子集进行处理的方法不同,这项工作将裁剪后的 CT 体积( ~178 x 302 x 225 )输入到神经网络中。正常化 Hounsfield 单位也是惯例,但是没有提供这种预处理的指示。

神经架构

像大多数医学图像分割方法一样,本文也扩展了 3D UNet 神经结构。标准 3D UNet 的显著例外是编码器路径中的下采样块数。这是由于较小的视觉器官的存在,其在较低分辨率下会丢失空间信息。另一个修改是使用“剩余压缩和激励块,而不是标准卷积块。除了一般的“学习有效特性之外,不提供这些块的使用的具体说明。

损失函数

这项工作采用了 Dice 和病灶损失相结合的方法,其中单个器官的损失如果在特定患者数据中存在或不存在,则被掩盖。单个器官损失也基于它们在特定 3D 体积中的体素计数而被反向加权。

培训详情

训练使用批量大小 1,并且在训练之间从 RMSProp 优化器切换到随机梯度优化器。这些选择看起来很奇怪,因为通常情况下设置的最小批量至少为 2。由于该神经网络接受裁剪的 3D 体积,GPU 内存限制可能会阻止更高的批量大小。没有提供优化器变化的解释。对于数据扩充,作者使用仿射变换和弹性变形,尽管他们没有提供这一步的细节。这项工作使用了一个提供 24GB GPU 内存的 Nvidia Tesla P40。

评论

在我看来,这项工作很好地从经验上证明了额外的缩减像素采样图层对 MICCAI2015 数据集没有用。他们的消融研究将普通 3D UNet 及其变体与最终提出的网络进行了比较,为修改的贡献提供了见解。

然而,还有其他细节没有讨论,例如体素尺寸调整。在下载数据集时,我注意到体素间距在 x、y 和 z 维度上有很大的范围。标准做法是让它们达到一个共同的分辨率(以毫米为单位),然后对它们进行学习。在培训环境中,优化器在培训期间的变化是一个不寻常的设计选择,其好处尚未讨论。此外,由于 GPU 内存限制,使用的批处理大小为 1。我的观点是,作者应该在反向传播之前探索多个样本的梯度平均。

虽然论文没有提到官方代码库,但作者的 github 包含了一个用于 AnatomyNet 的库。

焦点网

参考:Kaul 等,“Focusnet:一种基于注意力的全卷积网络用于医学图像分割”。 2019 IEEE 第 16 届国际生物医学影像研讨会(ISBI 2019) 。IEEE 2019

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:FocusNet 的神经架构(来自 Springer )

数据

模型的输入是 3D CT 体积(如文本和相关图所理解的),但是没有提供关于体积尺寸或体积大小调整的信息。没有给出 Hounsfield 单位标准化的指示。作者还在私有数据集上独立训练他们的模型。

神经架构

这项工作采用了一种独特的方法,通过为较小的视觉器官引入一个专用分支来改进分割度量。具体来说,这个架构有三个主要组件——SNet(主分割网络)、SOLNet ( 小物体定位网络)和 SOSNet ( 小器官分割分支)。SNet 分割大器官,SOLNet 为较小器官的中点提供关键点(类似于基于深度学习的人类姿势估计),最后 SOSNet 使用 SNet 的 ROI 汇集特征(由 SOLNet 的输出引导)来分割较小器官。

与 AnatomyNet 类似,SNet 仅采用单个下采样操作,之后是挤压和激励模块(用于通道式注意力)。该架构的核心是复杂的卷积运算(denseapp【1】),有助于获得足够的感受野大小。SOLNet 是一个简单的网络,带有两个挤压和激励模块*【2】*,用于输出以较小光学器官中点为中心的 3D 高斯图。SOSNet 使用类似的架构来输出分割图。请注意,SOSNet 通过简单地裁剪掉大量背景来帮助管理前景和背景体素计数之间的不平衡。这里一个重要的设计选择是 SOSNet 的输出大小是三个小视觉器官的平均直径的因子(=3)。

损失函数

类似于 AnatomyNet,该工作也使用骰子和焦点损失的组合,不同之处在于仅焦点损失被加权,并且两种损失的贡献相等。在这里,重量与每个器官的平均大小成反比。骰子损失既不加权也不掩盖。

培训详情

没有提供关于训练批次大小、优化器、学习率计划和训练时期的信息。读者也不知道所使用的 GPU。

评论

这项工作通过为较小的视觉器官引入级联结构来改进 AnatomyNet。DenseASPP 模块总体上并没有改进 FocusNet 的架构(论文中的表 3),所以它的优势并不明显。错过的改善指标的机会可能是没有使用加权和屏蔽的骰子损失。该白皮书还遗漏了重要的实施细节,如卷大小调整、卷大小和培训细节。

没有提供官方代码库。

分层网络

参考:郭等,“利用分层学习和神经结构搜索进行头颈癌高危器官分割”。IEEE/CVF 计算机视觉和模式识别会议论文集。2020.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:分层网络的神经架构(来自 CVF

数据

为了训练,作者使用(128,128,64)的子体积,并应用[-500,1000] Hounsfield 单位的窗口。为了从整个 ct 体积中提取子体积,要么使用以器官为中心的子体积,要么使用来自 CT 其余部分的随机样本。他们通过在 0.8 到 1.2 的比率之间随机缩放来执行缩放增强。为了测试,以(96,96,32)的步幅提取类似大小的子体积,并在相交区域对概率图进行平均。没有提供有关卷大小调整的信息。

所提出的方法也用于私有数据集中 42 个桨的自动分割。

神经架构

由于 CT 图像具有较差的软组织对比度,临床医生在解剖标志的基础上定义轮廓指引[4]。这项工作从临床实践中获得灵感,在预定义分类的基础上一步一步预测器官轮廓。这是从整体分割(解剖网或检测分割(聚焦网)的彻底转变。因此,首先预测下颌骨、脑干和眼睛等器官,这样它们可以作为预测中级或小而硬(S & H)类别中其他器官的锚。这些锚定器官在所有器官中具有最好的对比度,因此容易预测。对于 S & H 器官,他们使用与 FocusNet 检测中心位置相似的策略。执行这种分类的主要原因是为了在由 42 个桨组成的私有数据集上实现简单的神经网络优化(或学习)。3D P-HNN [3]网络被用作所有三个类别的基础。

在这种分类之上,这种神经架构还利用神经架构搜索(NAS)来为每个类别寻找 3D P-HNN 中卷积块的最佳组合。

*这个神经架构的名字是本帖作者给的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:便于预测的桨的分类(来自 CVF

损失函数

仅使用骰子损失来训练前述分割模型,并且使用 L2 损失来训练检测分支。

培训详情

整流 Adam 优化器的动量为 0.9 ( 默认值)。在 NAS 输出固定架构后,使用 12(NVIDIA Quadro RTX 8000 = 48GB GPU 内存)的批量和 0.01(锚和中级分支)和 0.0005 (S & H 分支)的初始学习速率。最初,只训练锚分支。然后它被冻结,中级和 S & H 分支被训练相同数量的时期。最后对整个模型进行微调。这篇文章不会深入探讨 NAS 的细节。

评论

就方法而言,本文作者似乎采用了一种合理的方法,解释了分层方法和 NAS 方法的贡献。在算法中复制临床实践肯定有益于最终结果,因此是一个值得称赞的想法。

这种方法的一个缺点是,他们没有报告甚至没有讨论不同随机种子的结果,这可能导致他们附录中不同的初始化。此外,批量大小为 12 以及神经架构的多个模块意味着他们利用了大量内存的 GPU 进行训练。推理也可能对 GPU 提出很高的要求,尽管在放射治疗等高级医疗选择中,这可能不是临床实践中实现的瓶颈。

没有提供官方代码库。

DeepMindNet

参考:斯坦尼斯拉夫斯基等人。“深度学习以实现用于放射治疗的头颈部解剖结构的临床可应用的分割.” arXiv 预印本 arXiv:1809.04430 (2018)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:DeepMindNet 的神经架构(来自 Arxiv )

数据

这项工作将具有全平面尺寸(H,W)的体积和相邻轴向切片的子集(相同尺寸输出的 d

Neural Architecture

Unlike the works studied above, this method choses to downsample the inputs, though they do not include the optic chiasm in their private dataset. Each downsampling block is a combination of a series of 2D convolutions ()以及 3D 深度方向可分离卷积作为输入。这些卷积的输出以残差块的方式与输入相加。上采样块仅包含一系列 2D 卷积。在下采样分支(即编码器和上采样分支(即解码器)之间,存在具有残差类型子块的全连接层。

*这个神经架构的名字是由本帖作者而非原作者给出的。

损失函数

打破常规,这种方法使用交叉熵损失,它只惩罚每个 OAR 遮罩的前 k%的损失值,并惩罚那些像素。作者声称,这导致了更快的训练,并有助于减轻班级不平衡的问题——例如视觉器官。

培训详情

Adam 优化器在初始学习率为 0.0001 的范围内使用,然后不断缩小。一批 32 个(好!)跨 32 个 GPU 使用(OMG!!)并用同步 SGD 对模型进行训练。

评论

这项工作更侧重于强调医学图像分割基准中使用的标准 DICE 度量如何不准确,而是提出了一种表面 DICE 度量。作者没有关注他们的神经架构背后的理由,读者只能假设他们为什么做出某些架构选择。

与其他工作相比,使用这项工作的结果较低,因为它是在使用不同 OAR 轮廓绘制方法的私有数据集上训练的。

*这项工作也没有考虑视交叉,因为它需要与 MR 图像进行图像配准以获得可接受的轮廓。

韵律学

除了报告其他人所做的标准骰子分数之外,这项工作建议使用表面骰子。该度量考虑两个 2D 表面的重叠,而不是 3D 体积。这具有临床应用,因为调整轮廓的表面(由有经验的放射治疗师/肿瘤学家)是应用人类专业知识的地方。引用文件:—

例如,两个不准确的分割可能具有相似的体积 DSC 分数,如果一个在许多地方偏离正确的表面边界很小的量,而另一个在单个点具有大的偏离。纠正前者可能需要相当长的时间,因为它需要重新绘制几乎所有的边界,而后者可以更快地纠正,可能只需一次编辑操作。

概观

MICCAI 2015 —测试结果

MICCAI2015 数据集的 10 幅测试图像的骰子得分

方法比较

建模选择的比较

文学中的空白

上面讨论的研究通常以下列之一作为输入:-

  • 具有全平面和轴向背景的裁剪 CT 体积,即存在所有器官(例如 AnatomyNet、FocusNet)
  • 具有预定义轴向背景但全平面背景的裁剪 CT 体积(例如 DeepMindNet)
  • 或者具有减少的轴向和面内背景,但是附加的锚定器官背景(例如,分层网)的裁剪的 CT 子体积

这两部作品都没有讨论获得临床上可接受的指标所需的环境的影响。因此,需要深入研究如何在内存受限的 GPU 上更容易地进行神经网络训练。这将转化为在数据集(如 MICCAI2015)上使用不同子体积大小的实验,甚至是使用额外 oar 的私有数据集。

一个重要的贡献也将是引入额外的基准数据集,如在 StructSeg,2019 中引入的数据集。

结论

这篇文章分析了在人体头颈部放射治疗环境中对有风险的器官进行自动分割的不同方法。miccai 2015-头颈分割挑战用作基准数据集,以了解上述方法的性能差异。带回家的信息是:-

  1. 尽管 UNets 建议在编码器分支中进行下采样,但这种方法可能会对骰子分数产生负面影响。
  2. 检测分割已经广泛用于分割较小的器官。
  3. 理解放射治疗的临床工作流程对于创建新的神经架构和有用的度量是有用的。

最后,本文讨论了文献中的一些不足之处,希望能引发这一领域未来的思考。

参考

[1]杨等.【Denseaspp】用于街道场景中的语义分割。《IEEE 计算机视觉和模式识别会议论文集》。2018.

[2]胡等.【挤激网络】。IEEE CVPR,2018。

[3] Adam 等.“用于从 CT 图像中进行病理性肺部分割的渐进和多路径整体嵌套神经网络”医学图像计算和计算机辅助介入国际会议。施普林格,查姆,2017。

[4]Brouwer et al .“对放疗中有风险的头颈部器官进行深度学习轮廓绘制后,在临床实践中执行的手动调整的评估”放射肿瘤学中的物理学和成像 16(2020):54–60。

预算上的深度学习:这家初创公司的表现优于谷歌 Colab 吗?

原文:https://towardsdatascience.com/deep-learning-on-a-budget-does-this-startup-outperform-google-colab-22b102827b55?source=collection_archive---------6-----------------------

Google Colab 在提供免费协作笔记本电脑方面占据了统治地位,但也有竞争对手准备弥合这一差距

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡斯帕·卡米尔·鲁宾在 Unsplash 上的照片

Paperspace 是一家成立于 2014 年的创业公司,于 2018 年推出了 ML 笔记本平台 Gradient,自那以来,它已经成为一个定期更新的大型平台。它拥有面向所有人的免费 GPU,其免费实例拥有 8 个 CPU 的 30 GB CPU RAM 和 8 GB RAM 的 NVIDIA Quadro M4000。为了使其与消费级 GPU 保持一致,它的性能大约相当于 GTX 1050Ti,RAM 是大型 ML 应用的两倍。他们还有一个 8 美元/月的个人计划,免费提供一台英伟达夸德罗 RTX 4000 (大约是英伟达 RTX 2060)。理论上,与 Google Colab 提供的相比,这一点非常好!

我之前写过这篇文章,深入探讨了 Google Colab 与标准消费级 GPU 的比较,概括来说,Colab 将分配一个 NVIDIA Tesla P100、T4 或 K80,与 NVIDIA RTX 2080、GTX 1070 或 GTX 960 进行比较,所有这些都具有超过 12 GB 的 RAM。乍一看,平均来说,这似乎是更强的计算能力。然而,你使用的资源越多,你越有可能只被分配到一个 K80。在我广泛使用计算资源的 15 次试验中,我只有 33%的时间被分配到比 K80 更好的 GPU。

为了测试这些平台,我使用了 AI 基准,这是一个 python 库,它利用 Tensorflow 在 19 个域中运行 42 个独特的 ML 任务,为 GPU 的性能提供了一个很好的广义 AI 分数。分数越高,意味着 GPU 执行任务的速度越快。结果分为训练分数、推理(测试)分数以及被认为是人工智能分数的组合。

因为 Gradient 每次都给出相同的 GPU,所以我运行了 5 次 AI Benchmark,在每次运行之间重新启动实例。使用 Google Colab,我运行了 15 次 AI 基准测试,以正确捕捉所提供的 GPU 中的差异。结果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最终得分

这对于梯度来说看起来不太好,但是结果并没有看起来那么糟糕。是的,Google Colab 在平均分数上比 Gradient 高(10773 比 6861),但 Gradient 有显著的优势,包括性能的标准偏差低得多(只有 333 比 1637),这表明您可以期待相同的程序以一致的运行时和规格运行。然而,如果您使用它进行开发,并且只关心 Jupyter 笔记本的速度,那么在大多数情况下,Colab 显然会胜出。

其他平台差异

当然,速度不是一切,在选择平台时,您的开发环境也很重要。Gradient 比 Colab 更有优势,例如能够选择超时时间,并且拥有一个围绕部署 Jupyter 笔记本电脑即服务的生态系统(更高级的选项)。这些都不在 Colab 的范围内,谷歌将把你送到他们的 GCP 高级解决方案, Vertex AI Workbench 以获得类似的可定制性和现成的渐变。

但是,还有很多缺点是我用 Colab 没有体验过的。第一个限制是一次只能运行 1 台笔记本电脑(免费版),平台上总共只能运行 5 台。这对于从事各种项目的人来说并不理想。这是我个人的看法,但我没有发现他们的 Jupyter 编辑器直观。当一个单元格被点击进入时,Gradient 会自动将该单元格移动到页面的顶部,这在几乎所有情况下都会导致我失去对我试图查看的内容的跟踪,没有办法禁用该功能。幸运的是,它们包括一个在标准托管 Jupyter 实例中打开笔记本的选项,这个特性我非常欣赏!最后,有许多随机错误,从身份验证错误到实例不能按需提供。在大多数情况下,刷新我的登录可以解决这个问题,而且这些问题将不可避免地得到解决,但是我不能说它们没有降低用户体验。

结论

就目前而言,Colab 在大多数领域都独占鳌头。只要工作是实验性的(比如家庭项目),还没有准备好部署,Colab 几乎在每个领域都胜过 Gradient。然而,Gradient 是一个正在崛起的竞争对手,它为谷歌的对手提供了一个很好的环境。这也让人感觉 Gradient 试图与 Vertex AI WorkbenchAWS Sagemaker 竞争,同时仍然试图通过易于设置的笔记本实例吸引 Colab 观众。出于这个原因,我将坚持使用 Colab 来完成我的大部分工作,但会关注 Gradient 的进展!

如果你喜欢这篇文章,请随时订阅,查看我的推荐页面,查看这篇文章,在那里我升级了我的旧笔记本电脑以处理现代的 ML 工作负载,或者捐赠以便我可以测试一些新的 ML 设备!

人类微生物组的深度学习

原文:https://towardsdatascience.com/deep-learning-on-human-microbiome-7854fba815fc?source=collection_archive---------20-----------------------

生命科学的深度学习

从 DNA 序列推断样品的微生物组成

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来源:人类微生物组项目门户

这是我的专栏 生命科学的深度学习 的第九篇文章,我试图展示将人工神经网络应用于计算生物学和生命科学的真实世界项目的具体例子。之前,我们介绍了深度学习在古代 DNA单细胞生物学数据整合临床诊断显微成像中的一些应用,以及一些从自然语言处理(NLP)中推断现代人类基因组中尼安德特人渗入区域的技术(此处为和此处为)。在本文中,我们将了解为什么人类微生物组代表生物学中的大数据****,以及如何训练一个卷积神经网络(CNN)** 分类器 用于 预测一个 宏基因组学 样本 起始于 中的微生物组成**

宏基因组学作为大数据

不幸的是并不直接开始为生物生物医学应用开发机器学习模型,在我看来是因为缺乏数据**。我在之前的帖子中讨论了一些挑战,我们在生命科学中有大数据吗?。在那里,我提到了生命科学中的三个方向,它们似乎对人工智能和机器学习很有前景,因为它们似乎有足够的数据量,它们是:**

  1. 单细胞组学
  2. 显微成像
  3. 将序列视为统计观察的基因组数据

后来在评论中 Mikael Huss 建议将宏基因组学微生物组数据作为第四大数据资源。事实上,人们可以找到大量公开可用的宏基因组学数据,例如,使用伟大的 EMBL-EBI 资源管理公司

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来源:EMBL-EBI 微生物组数据资源管理中心

宏基因组学之所以能被称为大数据,是因为相对便宜的 鸟枪测序 ,因此成千上万的样本被测序,以及宏基因组学数据相对低维的性质**。事实上,将测序的 DNA 片段映射到已知的微生物生物体通常会导致 500–1000 个可靠地检测到微生物,例如,与具有数百万维的遗传变异甲基化数据相比,这并不是真正的高维数据。**

使用 SourceTracker 的微生物组成

记住宏基因组学开发机器和深度学习算法提供了大量数据**,在这篇文章中,我将尝试训练一个卷积神经网络(CNN),它可以估计给定样本中微生物群落的来源。例如,从我办公室的桌子上取一份拭子样本,我期望在那里找到哪种微生物?它们会不会像我的皮肤 微生物群,或者可能是我嘴里的口腔微生物?这个可以用一个叫source tracker的奇妙软件来估算。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

骑士T21【Nat 方法】8、761–763(2011)

简而言之, SourceTracker 是一种贝叶斯版本的 高斯混合模型(GMM) 聚类算法(看起来类似于 狄氏多项混合 ),它是在称为的参考数据集上训练的,即不同类别,例如土壤或人类口腔或人类肠道微生物群落等,并且可以估计每个源在称为的测试样本中的比例/贡献因此,SourceTracker 算法明确地将接收器样本建模为源的混合**。算法的贝叶斯味道来自于在拟合模型时使用 Direchlet 先验。**

最初,SourceTracker 是针对 16S 数据开发的,即仅使用 16S 核糖体 RNA 基因 。相比之下,这里我们将尝试使用https://en.wikipedia.org/wiki/Shotgun_sequencing****宏基因组学 数据来训练一个分类器。此外,SourceTracker 并非设计用于原始宏基因组序列**,而是需要以某种方式量化的微生物丰度( OTU 丰度),例如通过qime管道、meta plan 2Kraken2 。相比之下,我们将在这里训练的 CNN 分类器的目标是 fastq 文件 预测宏基因组样本的微生物组成,而不量化微生物丰度。******

人类微生物组项目(HMP)数据

为了训练 CNN 分类器,我们将利用巨大的 人类微生物组项目(HMP) 数据资源。HMP 提供了用meta plan 2量化的宏基因组分类丰度,可以从这里下载。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

人类微生物组项目(HMP)门户

4 人类 组织 (微生物群落): 口腔、肠道、皮肤和阴道计算宏基因组学概况。下面,我们将使用微生物丰度矩阵来选择组织特异性细菌 ,即仅在四种组织中的一种中丰富的菌群,因此可以作为人体组织的微生物制造者。稍后,我们将使用组织特异性细菌属的参考基因组来训练 CNN 分类器 fastq 文件 中的原始序列中识别微生物群落(口腔、肠道、皮肤、阴道)。我们将从读取微生物丰度矩阵开始,并通过降维图( PCAtSNE )可视化来自 4 个人体组织的样本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在 PCA 和 tSNE 图中,我们可以看到,就微生物丰度而言,样品可以通过原始组织清楚地分开。这意味着训练 CNN 分类器应该是非常简单的,它可以通过检查样品中的微生物 DNA 序列来预测给定样品的来源组织。然而,为了制作 PCA 和 tSNE 图,我们使用了微生物丰度而不是测序数据本身,因此我们必须首先提取能够最好地分离肠道、口腔、皮肤和阴道样品的微生物。来自最具鉴别能力的微生物的参考基因组将在稍后用于为 CNN 分类器创建序列的训练数据集。

选择组织特异性微生物

为了选择能够最好地分离肠道、口腔、皮肤阴道样本的微生物,我们可以训练例如随机森林分类器,并查看特征重要性及其作用方向。然而,这里看起来有大量的组织特异性微生物,即在一个组织中丰度很高但在所有其他组织中几乎为零的微生物。例如,如果我们观察副溶血性嗜血杆菌在微生物丰度数据框架中的指数为 1950,那么看起来非常具有口腔特异性**😗*****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

下面,为了简单起见,我们将只集中在 细菌微生物 上,即古菌病毒将被忽略,只有在 HMP 数据集中分类在 属级 上的细菌生物将被保留用于进一步分析。我们将建立组织特异性细菌属的列表,并将它们的名称用于、来自ref seq NCBI数据库的“grepping”细菌参考基因组。因此,这里我们将微生物丰度的总矩阵细分为细菌属丰度,我们可以看到在 HMP 项目中有 227 个细菌属。接下来,我们将检查所有 HMP 细菌属,并按照简单标准建立口腔-、 皮肤-、 阴道-肠道特异性属的列表:如果一个细菌属在一个组织中的比所有其他组织多 10 倍,则该属被认为是组织特异性的。****

组织特异性的简单标准为我们提供了 61 种口腔特异性、53 种肠道特异性、49 种皮肤特异性和 16 种阴道特异性细菌属。让我们从 4 种组织中选择一些组织特异性属,并观察其丰度:****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

上面,我们可以清楚地看到,我们设法挑选了非常强的组织特异性细菌属标记。阴道的最少,为 16 个组织特异性属。然而,仔细观察,可以发现其中包括伯克霍尔德菌属、罗尔斯顿菌属、博德特氏菌属等可疑且极有可能是 PCR 试剂污染物 。因此,我们仔细检查了 16 个阴道特异性细菌属的列表,由于不同的原因,我们可以确信其中只有 12 个具有阴道特异性。因此,为了在用于分类分析的组织之间保持平衡,我们将为 4 种组织中的每一种选择 12 种最具组织特异性的标记,这里是我们挑选的细菌属:****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

经过一番思考,我决定将** 链球菌 排除在口腔特有属列表之外。尽管链球菌属似乎是口腔特有的,但它也包括在其他组织如肠道中大量存在的种类。这可能会混淆 CNN 分类器,因为如果我们 grep 链球菌的参考基因组,我们将会得到太多来自肠道特异性链球菌物种的“污染”序列,然而如果假设链球菌是口腔特异性属,则会得到错误的口腔标签。请在本文的完整笔记本中查看更多详细信息。**

我们可以检查选择的微生物属可以相当好地分离口腔、肠道、皮肤和阴道样品。为此,让我们基于样品之间的【Spearman】相关性距离并使用 48 个选定的微生物属(4 个组织中的每一个 12 个)来运行快速聚类。****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们清楚地观察到对应于来自 HMP 项目的口腔、肠道、皮肤和阴道样品的 4 个集群。最大的聚类是口腔样本,而第二大聚类对应于肠道 HMP 样本。

准备数据和训练 CNN 分类器

现在我们将使用所选的 48 个组织特异性细菌属的名称,从 RefSeq NCBI 数据库中提取所有相应的物种和菌株参考基因组 id。下面的片段演示了如何下载和提取与 48 个挑选的组织特异性属相对应的组织特异性物种和菌株的参考基因组 id。为此,我们将使用一个名称-引用-id 匹配文件 MapBactName2ID.txt ,可以从 my github 下载。该文件是通过提取参考基因组的标题并将它们的文件名(GCF-id)与标题匹配而构建的。

现在,当我们有了对应于组织特异性属的参考基因组(fasta-files)id时,我们可以切片参考基因组并创建 4 组序列(例如 80 nt 长的),每组对应于口腔、肠道、皮肤和阴道微生物属的标签为 0、1、2 和 3。在下面的循环中,我们首先为 4 个组织中的每一个读取带有**fasta id的文件,然后为每个 fasta id 读取 fasta 文件并选择长度为 80 nt 的随机 3000 序列。在运行过程中,我们还将删除包含 N、H、M 和其他非规范核苷酸的序列,并将我们自己限制为仅包含 A、C、T 和 G 的序列。******

一旦我们创建了一个标记序列的数据集,其中每个序列都有一个对应于口腔、肠道、皮肤和阴道的标签 0、1、2 或 3,我们就必须将这些序列转换为 one-hot-encoded tensor (3 维 numpy array) ,它可以被深度学习算法(如 1D CNN)读取。接下来,我们还将把一个热编码的序列分成训练和 测试 子集。

最后,让我们写下一个简单的 1D CNN 架构,并开始训练分类器识别对应于口腔、肠道、皮肤和阴道微生物群落的 4 个类别的序列模式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

检查网络是否已经学会对序列进行分类的最佳方式是在新的测试集上评估其性能,该测试集由它在训练期间根本没有观察到的数据组成。这里,我们评估测试集上的模型,并将结果绘制为混淆矩阵**。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

混淆矩阵的图形表示是蓝色的热图,展示了一种块状 结构,暗示我们的 1D CNN 分类器能够相当好地区分 4 种微生物类别。60% 的总体平均评估准确度乍一看似乎很低,因为我们的思维集中在一个二进制分类问题上,其中一个随机分类器可以给出 50%的基本准确度。因此,我们 60%的结果可能比随机分类器好一点点。但是,请记住我们在这里处理的是**的** ,因此一个随机分类器应该给我们 25%** (可以通过模拟来确认,此处未显示)的平均准确度,根据样本大小的不同,的标准偏差约为 5-10%。因此, 60%的准确度明显高于随机分类器预期的基础 25%** 。此外,下面我们将使用经过训练的分类器,通过从数以千计的 DNA 序列中对预测 进行平均,获得微生物群落对宏基因组样本贡献的粗略估计。假设分类器的 60%的准确性允许对大多数序列进行正确的预测,即使不是所有的序列都会被正确分类,这仍然会给我们一个很好的直觉关于样品来自什么微生物群落(口腔、肠道、皮肤或阴道)。********

预测微生物的组成

在这里,我们将检查经过训练的 CNN 分类器是否可以用于推断随机宏基因组样本的微生物组成。为此,我们将挑选随机宏基因组 fastq 文件(来自 HMP、 MGnifyDIABIMMUNE 数据库),对每个宏基因组序列进行预测,并呈现分配给四个类别(口腔、肠道、皮肤和阴道)的序列的部分,这将大致对应于每个样品中存在的微生物群落的部分(微生物组成)。让我们从 HMP 项目的几个样本开始。我知道我们使用 HMP 丰度来选择组织特异性微生物标记(我们没有使用原始测序数据,尽管),使用 HMP fastq 文件来推断它们的微生物组成可能会有偏差。然而,这是一个好的开始,至少如果 CNN 分类器在 HMP 样本上失败,很难期望它在独立样本上表现良好。稍后,我们将使用来自 HMP 项目以外的真正独立的宏基因组样本来重复这一推论。在下面的循环中,我读取了 HMP fastq-files (我从口腔、肠道(粪便)、皮肤和阴道拭子中随机选取了 2 个样本, one-hot-encode 它们的序列,并使用训练过的 CNN 分类器运行预测。接下来,我选择最可靠的预测,其中一个微生物群落有至少 80%的概率。最后,我绘制了分类器分配给每个微生物群落的序列片段。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们可以看到,对于每个随机 HMP 样本,我们都得到了相当好的预测**,即前两个看起来很像口腔样本,因为口腔微生物(蓝条)构成了大多数微生物群落,而后两个看起来像肠道样本等。标签“口服 _”、“肠道 _”等。对于上图底部的每个样本,指出在 HMP 项目中收集样本的真实组织。**

总之,我们使用 HMP 项目中不同组织中丰富的微生物参考基因组序列训练了一个 CNN 分类器。之后,我们继续在几个随机的 HMP 样本上评估模型。你大概可以在这里看到一个可能的问题。一方面,当训练 CNN 分类器时,我们没有使用来自 HMP 样本的原始序列,而是使用 HMP 数据中最丰富的属的参考基因组。另一方面,仍然有一个信息泄露**,因为我们仍然使用相同的项目(尽管不同类型的数据)进行训练和测试。因此,评估可能仍然有偏见,看起来好得不真实。为了进行更好的评估,我们将从宏基因组学项目中随机挑选 8 个与 HMP 无关的口腔、肠道、皮肤和阴道样本。**

现在,我们将对一些与 HMP 样品不同的宏基因组样品进行微生物组成推断。粪便/肠道样本可以从 糖尿病 e 项目中获取,这里是文件口腔宏基因组样本从 WGS 口腔微生物组 项目下载,这里有文件出版物皮肤样本从 MGnify 资源下载,该资源由 EBI 提供,来自项目“农村和城市环境中儿童和青少年的皮肤微生物群模式不同”,文件可从此处获得。阴道拭子样本在 MOMS-PI 项目中排序,可以从这里检索。

我们将对非 HMP 样本应用与上述 HMP 样本相同的循环,只有一处不同。我们需要始终控制在应用概率截止值(这里是 90%)后,我们仍然得到足够的序列来计算微生物群落的比例。这里我要求,如果我们没有至少 500 个序列(这对于一些随机的非 HMP 样本是真实的,因为它们的测序深度低),概率阈值将从 0.9 降低到 0.6。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在这里,我们再次看到对 8 个非 HMP 样本中的微生物组成的预测与样本所来自的真实口腔、肠道、皮肤和阴道微生物群落相当一致。干得好!我们训练过的 CNN 分类器可能可以对任何给定样品的微生物组成提供有意义的估计。

摘要

在本文中,我们了解到宏基因组学代表了一种适用于机器和深度学习分析的大数据。我们利用了来自人类微生物组项目(HMP) 的宏基因组学数据,并开发了一个 1D CNN 分类器,该分类器可以从标准 fastq 数据格式的原始序列开始,成功预测不同微生物群落(口腔、肠道、皮肤或阴道)对给定样本的贡献,而无需对微生物丰度进行量化。与使用 SourceTracker 的标准微生物组成推断相比,该方法可能具有优势。

像往常一样,让我在评论中知道你最喜欢的生命科学领域,你希望在深度学习框架内解决这个问题。在 Medium 关注我,在 Twitter @NikolayOskolkov 关注我,在 Linkedin 关注我。完整的 Jupyter 笔记本可以在我的 github 上找到。我计划写下一篇关于如何用深度学习及时预测人口规模的帖子,敬请关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值