TowardsDataScience 博客中文翻译 2019(四百三十八)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

自我评估神经网络

原文:https://towardsdatascience.com/self-assessing-neural-networks-e703b5fd4958?source=collection_archive---------30-----------------------

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

A diagram of a Self-Assessment layer

我发明了一种新型的神经网络层,我希望得到反馈。

新的层使网络能够评估其自身特征的可靠性。这使得它可以根据问题改变每个特征的权重。

问题

当正常的神经网络解决回归问题时,它只提供原始输出。它不提供对输出正确性的确定程度的度量。

如果网络不知道输出实际上应该是什么,这就是一个问题。它不会告诉你它的输出只不过是瞎猜。

这两种不确定性是有区别的:

  1. “我已经检查了我能找到的所有数据源,答案是 0.3”
  2. “我甚至不知道从哪里开始,但平均值是 0.3,所以我们就这样吧”

当代的神经网络没有捕捉到它们之间的差异,因为它们都给出相同的输出。

对我来说,这一信息显然应该是有用的。

解决办法

我介绍自我评估层:

自我评估层是神经网络的一种新型层。它由平行训练的两部分组成:

1.主组件,其行为类似于普通层。

2.自我评估部分,学习预测主要部分的有用性。

有许多不同的方法来实现细节。在我尝试的例子中,它是这样实现的:

主要成分是线性层。

自我评估组件像正向传递中的正常线性层一样工作。在向后传递时,它忽略它接收到的梯度并替换它。自我评估部分的新梯度来自最小二乘损失函数。该损失的目标是由主分量接收的梯度的平均绝对值。

因此,自我评估组件学习预测主组件梯度的平均绝对值。

每当主成分做出一个完美的预测,自评成分应该预测为零。每当主成分做出差的预测时,自我评估成分应该预测高的值。

自我评估部分最终成为在计算了其他特征之后剩下的不确定性的度量。

了解网络的可靠性对您在设计网络架构时做出决策非常有用。此外,这些信息还可以帮助您提高网络的准确性:

将网络层分成许多平行的层,并对每一层进行自我评估。网络应该从中获得有价值的信息以改进其自身的性能。原因如下:将一个层的特征想象为人们给下一层的人提供建议。增加一个自我评估层可以让你知道哪些顾问实际上对他们的建议有信心,哪些没有。

用例

自我评估层至少有两种不同的用途:

  1. 来评估你的网络预测的可靠性。
  2. 通过使网络能够对其自身的每项功能进行评级来提高网络的整体性能。这使得网络能够对其自身特征的不确定性进行建模,从而提高性能。

PyTorch 中的实现

我已经在 PyTorch 中实现了自我评估层。

查看我的 Github 代码:https://github.com/FlorianDietz/selfAssessment

背景和更多信息

这项发明是我私人研究项目的副产品。

在一次小规模试验中,使用该图层可使 MNIST 数据集略有改善。然而,这种改进太小了,无法确定它是否有用。

这个项目与我的主要研究方向不同。这就是为什么我不打算继续追查下去。然而,它似乎很有前途,完全忽视它是一种浪费。

也许这更符合其他人的研究兴趣,或者也许它只是帮助激发某人有一个相关的想法。

有关我已经进行的实验、未来可能的改进以及自我评估层的其他潜在使用案例的更多信息,请查看这篇更详细的文章:

【https://floriandietz.me/neural_networks_self_assessment/ 号

原载于https://floriandietz . me

自我关注和变形金刚

原文:https://towardsdatascience.com/self-attention-and-transformers-882e9de5edda?source=collection_archive---------11-----------------------

从关注到自我关注到变形金刚

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

这实际上是早先关于“ 注意力 介绍”的帖子的延续,在那里我们看到了注意力架构所解决的一些关键挑战(并在下面的图 1 中提到)。

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

Fig 1: From “Introduction to Attention”, based on paper by Bahdanau et al.

一个单独的上下文向量(编码器 RNN 中的最终隐藏状态,保存整个句子/输入序列的含义)的挑战通过用为每个解码器步骤生成的基于注意力的上下文向量来替换来解决,如 图 1 所示。

但是它引入了为解码器的每一步计算单独的上下文向量的增加的计算复杂性的挑战。这超出了现有的与并行化相关的挑战。即 RNNs 中所需的处理的顺序性质——假设需要隐藏状态 h1 来计算下一个隐藏状态 h2,则这些操作不能并行进行。 这两种挑战都由图 1 左半部分的红色虚线 (在图 3 中也称为 )表示。

说到顺序处理,你可能还会想,假设我们用为每个输出步骤生成的上下文向量来替换最后一个隐藏状态,我们还需要“h”状态吗?毕竟,注意力对齐应该定义给定的输出步骤应该关注输入的哪一部分,而“h”只是“x”的间接表示。它表示所有输入步骤的上下文,直到“x ”,而不仅仅是“x”。直接用“x”不是更有意义吗?

事实证明确实如此。

苏赫巴托尔等人提出的中介绍的端到端存储网络。粘贴在 图 2 只是建议模型的单层版本。所提出的模型具有代表所有输入的“输入记忆”或“关键”向量、模型需要响应的“查询”向量(像最后的解码器隐藏状态)和“值”或“输出记忆”向量——同样是输入的表示。“查询”和“关键字”之间的内积给出了“匹配”(类似于注意力)的概率。通过概率加权的“值”向量的总和给出了最终的响应。虽然产生了良好的结果,但这消除了输入的顺序处理,代之以“内存查询”范例。

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

Fig 2: End to End Memory Networks by Sukhbaatar et al

将此与我们之前看到的基本注意力模型进行比较,就会发现“相似之处”。虽然两者之间存在差异,但“端到端记忆网络”提出了跨句子和多次“跳跃”的记忆来生成输出,我们可以借用“键”、“查询”和“值”的概念来获得我们基本模型的概括视图。 图 3 将这些概念应用于基础模型。

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

Fig 3: Challenges in the attention model from “Introduction to Attention” based on paper by Bahdanau et al to Transformers

图 3 还强调了我们想要解决的两个挑战。对于挑战#1,我们也许可以直接用输入(x)代替隐藏状态(h)作为密钥。但是如果我们直接使用单词嵌入,这就不是丰富的表示了。端到端的记忆网络对输入和输出记忆表示使用不同的嵌入矩阵,这更好,但它们仍然是单词的独立表示。将其与隐藏状态(h)进行比较,隐藏状态(h)不仅代表单词,还代表给定句子上下文中的单词。

有没有一种方法可以消除生成隐藏状态的顺序性,但仍然产生更丰富的上下文表示向量?

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

Fig 4: Sequence to Sequence with self attention — Moving from being “RNN based” to “attention only”

图 4 说明了这样做的一种可能方式。如果我们不使用注意力来连接编码器和解码器,而是分别在编码器和解码器内部使用注意力,会怎么样?毕竟,注意力是一种丰富的表示——因为它考虑了所有的键和值。因此,我们可以使用基于注意力的替换,而不是使用 RNN 来导出隐藏状态,其中输入(x)被用作“键”和“值”。(如下面的 图 5 所示,用“x”代替“h”)。

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

Fig 5: Self Attention

在编码器端,我们可以使用自我关注来生成给定输入步长 xi 相对于输入 x1,x2…xn 中所有其他项的更丰富的表示。与基于 RNN 的编码器中的隐藏状态生成不同,这可以对所有输入步骤并行完成。我们基本上是将 图 4 左半部分的十字交叉线向下移动,如右半部分所示,从而消除代表向量之间的红色虚线。

在解码器方面,我们可以做一些类似的事情。我们将基于 RNN 的解码器替换为基于注意力的解码器。即不再有隐藏状态,并且不再为每个解码器步骤计算单独的上下文向量。相反,我们对迄今为止生成的所有输出进行自我关注,并随之消耗整个编码器输出。换句话说,我们正在将注意力应用到目前为止我们所知道的任何事物上。(注意,变压器中绝对不会出现这种情况,变压器中对生成输出和编码器输出的关注是在两个独立的层中一个接一个地完成的)。

瓦斯瓦尼等人在论文“注意力是你所需要的全部”中介绍的“变形金刚”模型,见下面的 图 6 ,做了我们上面讨论的事情。

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

Fig 6: From “Attention Is All You Need” by Vaswani et al.

Transformer 模型使用“缩放点积”注意机制。它在图 6 的右侧以及图 7 中示出。比较图 7 和图 1,感受一下这两种模型在计算注意力的“方式”上的差异。(注意:“在哪里”也不同,我们将在下一步讨论)。transformer 模型还使用了所谓的“多头注意力”(Multi-Head Attention),而不是为给定的“xi”只计算一个“ai”(注意力),而是使用不同的 Ws 集计算多个注意力分数“ai”。这允许模型在不同的位置关注不同的“表示子空间”,类似于使用不同的过滤器在 CNN 的单个层中创建不同的特征地图。

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

Fig 7: Scaled Dot Product used in “Attention Is All You Need” by Vaswani et al.

编码器

所提出的变压器模型中的编码器具有多个“编码器自关注”层。每一层的构造如下:

  1. 输入将是第一层的单词嵌入。对于后续层,它将是前一层的输出。
  2. 在每一层中,首先使用该层的输入作为键、查询和值来计算多头自我关注。
  3. #2 的输出被发送到前馈网络层。这里,每个位置(即每个单词表示)都通过相同的前馈来馈送,该前馈包含两个线性变换,后跟一个 ReLU(输入向量->线性变换的隐藏 1->线性变换的隐藏 2 ->ReLU 输出)。

解码器

解码器也将具有多层。每一层的构造如下:

  1. 输入将是到目前为止为第一层生成的单词嵌入。对于后续层,它将是前一层的输出。
  2. 在每一层内,首先使用该层的输入作为关键字、查询和值(即,到目前为止生成的解码器输出,为其余位置填充)来计算多头自我关注。
  3. #2 的输出被发送到“多头-编码器-解码器-注意”层。这里,使用#2 输出作为查询,使用编码器输出作为键和值,来计算另一个注意。
  4. #3 的输出被发送到类似编码器中的位置式前馈网络层。

虽然摆脱顺序性在很多方面都有帮助,但它有一个关键的优势——知道单词在输入序列中的顺序。如果没有它,出现在同一个句子中不同位置的同一个单词可能会以相同的输出表示结束(因为它将具有相同的键、值等)。因此,该模型使用“位置编码”——基本上是一个表示位置的向量,它被添加到编码器和解码器堆栈底部的输入嵌入中。Shaw 等人的另一篇论文在这里提出了一种基于相对位置的替代方案,它比原始 Transformer 模型论文中建议的绝对位置编码实现了更好的结果——如果您能花时间在位置嵌入上,我建议您研究一下。

希望这在某些方面有所帮助。

计算机视觉中的自我注意

原文:https://towardsdatascience.com/self-attention-in-computer-vision-2782727021f6?source=collection_archive---------1-----------------------

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

自从引入 Transformer networks,深度学习中的注意力机制在机器翻译和 NLP 社区中非常受欢迎。然而,在计算机视觉中,卷积神经网络(CNN)仍然是标准,自我关注刚刚开始慢慢进入研究的主体,要么补充现有的 CNN 架构,要么完全取代它们。在这篇文章中,我将试图阐明视觉自我关注的最新发展,并强调其可能的好处。对于这项任务,我将提交三篇不同的论文(包括一篇被即将举行的 NeurIPS 2019 会议接受的论文),在我看来,这些论文很好地说明了计算机视觉中自我关注的最新水平。

我将提交的第一篇论文由 Guan 等人1撰写,来自医学图像分析社区,这是我的家。与自然图像(照片)不同,医学图像通常在外观上非常相似。它们是使用相似的采集参数从标准化位置采集的。对于放射科医生来说,阅读图像的经验主要来自于知道准确地在哪里寻找,以便找到某种病理。因此,毫不奇怪,注意力在医学图像分析中扮演着重要的角色,甚至比其他研究领域更重要。

该论文试图提高胸部 X 射线图像上自动胸部疾病分类的性能。以前,已经提出了仅通过查看全局图像来检测和分类胸部 X 射线上的病理的网络。因此,通过使用二进制交叉熵** (BCE)作为损失函数或一些其他标记机制(例如,编码器-解码器框架使用 LSTM 作为解码器来捕获标签之间的相互依赖性2)来执行多标签分类。使用整个 X 射线图像进行分类的问题在于,在医学图像中,与整个图像相比,病变区域可能非常小,甚至可能位于沿着边界的某处,导致分类器的大量噪声并降低检测精度。此外,胸部 X 射线图像经常会出现错位(例如图 1 第二行中的例子)。这种未对准导致图像周围的边界不规则,并且还可能对分类产生负面影响。**

在论文中,作者使用递归硬注意(即硬自我注意)来提高检测精度,方法是裁剪掉图像的有区别部分,并将全局图像和裁剪部分分类在一起(左侧的整个图像和右侧的裁剪部分见图 1)。

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

Figure 1: Two training images from 1 including heatmaps extracted from a specific convolutional layer in the network in as well as the resulting cropped image. Both the global and the cropped image are used for classification.

该网络由三个分支组成:

  • 全局分支处理整个图像并确定裁剪 ROI,
  • 局部分支展现注意机制,处理裁剪后的图像,
  • 融合分支连接全局和局部分支的汇集输出,并使用密集层执行最终分类。

所有分支都是分类网络,最终执行多类分类(如图 2 所示)以预测病理的存在。除了分类之外,全局分支还用于生成确定裁剪区域的热图。热图是通过对某个高级层上通道的最大值进行计数而生成的。则生成与热图大小相同的遮罩。如果在某个位置 (x,y) 的每通道最大化热图的值大于某个阈值,则在该位置掩码被分配为 1。否则,掩码的值将为 0。然后,确定裁剪区域,使得所有掩码值为 1 的点都在裁剪区域内。然后,图像的裁剪部分通过局部分支运行。此外,两个分支的输出在融合分支中融合,以执行附加分类。

网络分三步训练:

  • ImageNet 预训练的全局分支的微调。
  • 屏蔽推断以获得裁剪的图像并执行局部分支的微调。因此,全局分支中的权重是固定的。
  • 连接全局和局部分支输出以及微调融合分支,同时冻结其他分支的权重。

融合分支用于产生模型的最终分类结果,因为它比其他两个分支执行得更好,正如预期的那样。

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

Figure 2: Architecture of the AG-CNN presented in 1 with a ResNet-50 backbone as an example. The local lesion patch is cropped from the global image using the heatmap (attention) layer. BCE represents binary cross-entropy loss.

为了从注意力的角度理解这个模型在做什么,我们必须首先知道软注意力和硬注意力之间的区别。本质上,注意力根据一些外部或内部(自我注意)提供的权重对网络的某些特征进行重新加权。因此,软注意允许这些权重是连续的,而硬注意要求它们是二进制的,即 0 或 1。这个模型是硬注意的一个例子,因为它裁剪了图像的某个部分,因此本质上是重新加权原始图像,使得裁剪部分的权重为 1,其余部分的权重为 0。

hard attention 的主要缺点是不可微,不能端到端训练。相反,作者使用某一层的激活来确定 ROI,并在复杂的多阶段过程中训练网络。为了训练注意门,我们必须使用软注意(例如使用 sigmoid 或 softmax)。接下来我们将看看一些软注意模型。

压缩和激励网络

胡等人3没有使用硬注意,而是根据特征图的裁剪来重新校准权重,而是通过使用软自注意来模拟卷积特征的通道之间的相互依赖性,对 CNN 的某一层中的通道式响应进行重新加权。为此,作者引入了挤压和激励模块(见图 3)。

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

Figure 3: Squeeze-And-Excitation block presented in 3.

挤压和激励块工作如下:对于从 XU (例如卷积)的特征 F_tr 的任何变换,存在聚集跨空间范围的全局特征响应的变换F _ sq(HW )。这是挤压操作。挤压操作之后是激励操作 F_ex ,这是一种自门控操作,可构建通道权重响应。 F_tr 的输出随后按通道乘以激励结果(这在图 3 中表示为 F_scale )。挤压操作的数学描述是

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

因此 u_c 是运算 F_tr 的输出。挤压操作通过使用全局平均池创建全局嵌入。也可以使用全局最大池,尽管作者指出平均池会略微提高整体性能。另一方面,激励模块描述如下

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

因此,激励将挤压块的输出乘以学习到的权重 *W1,*将输出通过 ReLU 函数 δ ,将输出乘以另一组权重 W2 ,并在最后使用 sigmoid 函数以确保得到的通道权重为正。据此, W1 通过因子 r (可视为超参数)降低维度,而 W2 再次将其增加到原始通道数。最后,F_tr 的信道特征响应乘以从激励块获得的权重。这可以被视为使用全局信息的通道上的自我关注功能。

挤压和激励模块背后的主要思想是在网络的决策过程中包含全局信息;卷积只查看某个半径内的局部空间信息,而挤压和激发模块聚集来自整个感受野的信息。作者的一个有趣的观察是,在网络的早期阶段,不同类别的激励权重相对相似,在后期阶段变得更加具体。这与通常的假设相关,即较低层学习输入的更多一般特征,而较高层的辨别能力越来越强。此外,挤压-激励模块在网络的最后一级没有太大意义,因为大多数激励变为 1。这可以通过以下事实来解释,即网络的最后一级已经包含了大部分全局信息,并且没有通过挤压和激励操作引入新的信息内容。

挤压和激励方法的主要优势是它非常灵活:作者提到了在广泛使用的架构中的集成,如 ResNet(见图 4)、Inception 或 ResNeXt。在实践中,该块可以被添加到网络的每一级,或者只是在特定的级。此外,在可学习参数的数量方面,它只引入了一点点开销。例如,与已包含 2500 万个参数的原始 ResNet 相比,使用挤压和激励模块的 SE-ResNet-50 仅使用了约 250 万个附加参数。因此,这仅增加了 10%的复杂性。**

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

Figure 4: The original ResNet block (left) and the Squeeze-And-Excitation ResNet block (right) as presented in 3.

在该论文中,作者给出了通过挤压和激励块增强的训练结构的大量例子。特别是,他们能够在 ILSVRC 2017 挑战赛中实现最先进的分类性能,前 5 名的误差仅为 2.251%。

独立的自我关注

我将提交的最后一篇文章是 NeurIPS 2019 提交的文章,它通过使用独立的自我关注模块*,而不是仅仅通过自我关注来增强卷积层**,将 CNN 中的自我关注概念进一步发展。事实上,作者提出了一个自我注意层,它可以用来代替卷积,同时减少参数的数量。*

让我们回顾一下卷积运算来激励替换。卷积运算包括在位置 (i,j) 将一定大小(例如 3×3)的权重矩阵与每个邻域相乘,并在空间上对结果求和。这使得不同空间位置之间的重量分担成为可能。此外,权重的数量与输入大小无关。

与卷积类似,论文提出的自我注意层也作用于 (i,j) 周围的一个小邻域,称为记忆块。对于每个内存块,单头注意力计算如下:

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

因此, q_ij=W_q x_ij 是查询, k_ab=W_k x_ab 是关键字, v_ab=W_v x_ab 是从位置 (i,j) 及其邻域处的特征作为线性变换计算的值。矩阵 W 是学习转换。从公式中可以看出,变换后的中心像素 x_ij 用作查询,在邻域内对键和值求和。softmax 函数也应用于 logits,以获得权重,然后乘以这些值。如果你不知道查询、键和值是什么,那就看看这篇文章。作者在本文中使用了多头注意力,简单地说就是将像素特征沿深度方向分成大小相同的 N 组,用不同的矩阵 W 分别计算每组的注意力,并将结果连接起来。图 6 提供了视觉自我注意块的图形描述。

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

Figure 6: Local attention layer with spatial extent k=3 in [4].

使用上述方法的一个问题是,在关注块中没有编码位置信息,因此该公式对于各个像素的排列是不变的。位置信息对于视觉任务很重要:例如,如果你想检测人脸,你需要知道哪里可以找到嘴、鼻子、耳朵等等。在最初的 transformer 论文[5]中,作者使用位置的正弦嵌入作为附加输入。然而,在[4]中,相对 2D 位置嵌入被使用,因为它们对于计算机视觉任务具有更好的准确性。这些相对嵌入通过计算位置 (i,j) 到每个邻域像素 (a,b) 的相对距离来获得。这些距离分为行和列距离 r_a-ir_b-j 。这些嵌入被连接成矩阵形式,并乘以查询 q_ij ,如下所示:

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

这确保了由 softmax 函数计算的权重受到键和查询的距离和内容的调制。

从上面的描述我们可以看出,视觉自我注意是局部注意的一种形式。注意层只关注内存块而不是整个特征图。这种方法的优点是参数的数量大大减少,并且不同空间位置之间的权重是共享的。作者提到,他们的自我注意网络在训练和推理方面仍然比他们的 CNN 同行慢,但是他们将此归因于高度优化的卷积核以及注意力层缺乏优化的硬件。

作者还介绍了他们在 ImageNet 上通过用他们的自我注意块代替 ResNet 中的 3×3 卷积而获得的一些结果。请注意,它们保留了 1x1 卷积(基本上是按像素计算的全连接层)和卷积干(网络中的前几个卷积层)不变。有了这些变化,它们在所有测试架构(ResNet-26、ResNet-38 和 ResNet-50)中的表现都优于基准(标准 ResNet ),同时使用的触发器和参数减少了 12%和 29%。

参考

1关,庆吉,等.“像放射科医生一样诊断:注意力引导卷积神经网络在胸部疾病分类中的应用” arXiv 预印本 arXiv:1801.09927 (2018)。

2姚,李等,“利用标签间的依赖关系从零开始学习诊断” arXiv 预印本 arXiv:1710.10501 (2017)。

3胡、杰、、。"挤压和激励网络."IEEE 计算机视觉和模式识别会议论文集。2018.

[4] Ramachandran,Prajit 等,“视觉模型中的独立自我注意” arXiv 预印本 arXiv:1906.05909 (2019)。

[5]瓦斯瓦尼、阿希什等人,“你所需要的只是关注。”神经信息处理系统的进展。2017.

自动驾驶汽车—本地化

原文:https://towardsdatascience.com/self-driving-car-localization-5323c7bc6703?source=collection_archive---------22-----------------------

自动驾驶汽车如何知道自己在任何给定时间的位置?

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

Image by Pixabay

一直让我着迷的人工智能项目之一就是自动驾驶汽车。这是我学习更多深度学习和人工智能的主要动机。

自动驾驶汽车要实现其他功能,最重要的事情之一就是本地化。不仅是自动驾驶汽车,移动机器人也要先预测它在哪里。自动驾驶汽车的所有其他功能都取决于它的真实位置。在本文中,我们将尝试找出如何使用蒙特卡洛定位来预测汽车的位置。

知道物体或汽车位置的一种方法是使用 GPS。通过打开智能手机中的 GPS 服务,我们可以在卫星的帮助下轻松地看到我们在世界上的位置。但是使用 GPS 作为定位工具有一个问题。GPS 的不确定性接近 10 米。如果一辆自动驾驶汽车有这么大的误差,它很可能会撞上路边的一座建筑,认为它是道路的一部分。因此,自动驾驶汽车使用摄像头、激光、红外传感器来识别其在已知路线图上的位置

为了便于理解,让我们考虑一辆只做 1D 运动的汽车,它的世界由红色和绿色方块组成。

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

Figure 1: World consists of blocks of the green and red color [image by author]

一开始,当汽车没有用传感器从环境中获取任何数据时,它不知道自己在哪里。所以不确定性的程度是最高的,它不知道它在哪里。如果我们试着画出它所在位置的概率分布,它会是这样的:

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

Figure 2: Probability of the car to be in block i (1,2,…,6) [image by author]

在这里,我们可以看到每个位置都有 0.167 的概率。这意味着汽车可以在 6 个街区中的任何一个。

现在让我们假设传感器已经进行了一次测量,它以 80%的把握感知到了绿色(由于传感器误差,测量有时可能是错误的)。那么你现在会相信你的车在那些绿色街区的前面。因此,我们将 0.8(确定性)乘以与我们的测量相匹配的块的先验概率。在块颜色与测量颜色不匹配的情况下,我们将先验乘以 0.2。归一化后,概率分布如下所示:

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

Figure 3:Probability of the car to be in block i (1,2,…,6) [image by author]

测量后,你的信念改变了,现在你相信你在绿色方块前的概率(0.2672)比在红色方块前的概率高。红色块仍有一些剩余概率(0.0668)。这是因为你的传感器不是 100%准确。所以有很小的可能是你的传感器出错了,而你实际上是在一个红色方块的前面。这些小概率用图表表示。如果传感器是 100%准确的,你将绝对肯定你是在一个绿色块的前面,红色块的概率将是 0。

上述计算基于贝叶斯法则。

在感知颜色之前,我们有一个先验概率分布 P(Xi) →图表中表示的每个块的概率。在我们进行测量后,我们有把握地感觉到了颜色。P(Z | Xi)=0.8 →如果我们在块 Xi 中,感知正确颜色的概率是 0.8,这对于所有具有与测量颜色匹配的颜色的块是恒定的。对于具有不同颜色的块,其值为 0.2(对于不同的传感器可能不同)。因此,进行测量后的后验概率是 P(Xi | Z)=进行测量 Z(感知颜色)后处于位置 Xi 的概率→ P(Xi)* P(Z | Xi)

我们正是这么做的。我们随后将这些值标准化,使总概率等于 1。

现在考虑运动。我们假设这是一个循环的世界。如果一辆车从第六个街区向右移动,它会停在第一个街区。汽车是借助运动的机械部件运动的,这也有不确定性。让我们假设汽车一次移动一个街区,它的移动确定性为 0.9。这意味着,如果它试图移动一个街区,有 90%的可能性它实际上移动了期望的一个街区,有 10%的可能性它从未移动并停留在当前位置。

如果运动是 100%准确的,向特定方向移动将意味着概率分布也将向该方向移动一个街区。

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

Figure 4: Probability of the car to be in block i (1,2,…,6) [image by author]

这里我们假设世界是圆形的。所以当我们绝对确定地移动时,我们的概率分布向那个方向移动。原因是,如果目前很可能在第四街区发现汽车,那么在向右移动一定距离后,很可能在第五街区发现汽车。所以概率分布随着运动而变化。

但是如果我们没有 100%确定的运动,那么我们就必须使用全概率来预测运动后的最终概率分布。在运动之后,一个块的概率分布可能来自它的前一个块,确定性为 0.9,如果汽车根本没有运动,当前的分布也可能不变,确定性为 0.1。所以新的概率分布是这两个的加权和。

P(Xi)= P(Xi-1)P(动议)+P(Xi) P(暂停)

因此,如果我们以 0.9 的概率移动,那么概率分布应该是:

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

Figure 5: Probability of the car to be in block i (1,2,…,6) [image by author]

这里我们可以看到,现在的分布更为分散。我们可以很容易地注意到,在每次测量后,不确定性水平下降,但在运动后,不确定性水平增加或保持不变。

现在让我们进行多次测量,并测量我们是否能在这种方法中实际确定我们的位置。

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

Figure 6: 1D world comprising green and red blocks [image by author]

让我们从自动驾驶汽车的角度来思考。

动作:

1.它感觉到一个绿色的障碍物

2.它向右移动一个街区

3.它感觉到红色

4.它移动了一个街区

5.它感觉到红色

6.它不动

7.它感觉到红色

8.它向右移动一个街区

9.它感觉绿色

10.它移动了一个街区

现在告诉我,根据先前的行动,这辆车现在可能在哪里?

是的,现在应该在第五街区。让我们看看计算显示了什么。

根据动作,测量向量=['绿色,‘红色’,‘红色’,'红色,‘绿色’]

运动矢量=[1,1,0,1,1]

我写了一个代码(下面给出了链接),如果你把这些向量,它会给你概率分布。

代码链接:https://github . com/ishtiakm/self _ driving _ car/blob/master/senseandmov1d . py

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

Figure 7: The probability of the car being in each of these blocks

概率分布在第 5 块最大。

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

Figure 8: Probability of the car to be in block i (1,2,…,6) [image by author]

经过多次测量后,赛车对自己的位置非常确定,我们可以看到它的预测与我们的相符。

上述方法实际上是自动驾驶汽车在现实世界中识别其位置的核心算法。在现实中,世界不仅是绿色或红色的,运动也不是一维的。真实世界引入了更多的噪音和更不利的情况,如雨、雪等。但是我们在这里学到的算法保持不变。汽车已经从谷歌地球上知道了它的“世界”列表(见代码)。它的相机拍摄图像,并将其用作测量。在匹配这两个之后,它更新它的概率分布,并了解它在哪里以及它是否在车道的右侧。

这个逻辑也可以在具有绿色和红色块的 2D 世界中实现。尝试通过为 1D 编辑给定代码的 1D 函数来实现它。下面也给出了 2D 世界代码的链接。但是试着自己实现,自己摆弄。我向你保证这是相当惊人的。

代码链接:https://github . com/ishtiakm/self _ driving _ car/blob/master/senseandmov1d . py

印度道路上的自动驾驶汽车

原文:https://towardsdatascience.com/self-driving-car-on-indian-roads-4e305cb04198?source=collection_archive---------5-----------------------

计算机视觉引导的深度学习网络&机器学习技术打造全功能自动驾驶汽车。

“如果你认识到自动驾驶汽车可以预防事故,人工智能将有助于减少世界上主要的死亡原因之一。” —马克·扎克伯格

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

Cartoon Courtesy: http://www.cartoonistgroup.com/store/add.php?iid=169867

如果像优步& Ola 这样的按需乘车服务已经在运输理念上进行了一场革命,那么自动驾驶汽车将是下一个撼动整个运输行业的复兴。这个新想法正在成为价值数万亿美元的生意,比亚马逊和沃尔玛加起来还要大。据世界经济论坛称,汽车行业的这一巨大飞跃将通过减少车祸数量、减少紧急服务需求、节省工时、降低汽车拥有成本&每年带来 3.1 万亿美元的收入,同时还能通过缩短通勤距离和减少碳排放间接节省成本。

最重要的是,一旦你不再需要方向盘和司机,就有无限的设计可能性。汽车可以是小巧的蛋形或箱形的活动房屋,它们提供的不仅仅是移动性。截然不同的汽车设计意味着截然不同的道路。道路本身可以建议一条更快、更安全的路线,嵌入车辆和基础设施中的智能设备可以即时通信以适应交通。

自动驾驶汽车比赛中值得注意的参赛者是:

  • 特斯拉
  • Waymo
  • 巡航
  • Mobileye
  • 福特、通用等。

特斯拉的 Autopilot 和英特尔的 Mobileye **的一些版本使用高度可信的视觉,基于摄像头的自动驾驶技术,**与激光雷达(LIDAR)技术相反。

视觉技术,

  • 能在环境下工作,激光雷达不行。恶劣的天气
  • 比激光雷达便宜多了
  • 车辆设计不那么突兀。

但是为了让它工作,视觉技术需要巨大的计算能力来处理所有的视觉数据。这就是人工智能算法发挥作用的地方。在这个项目中,我使用了以下人工智能子领域来解决汽车的单个功能,以建立一个功能齐全的汽车。

来预测,

  • **转向角度:**采用深度学习
  • **加速和刹车:**计算机视觉&深度学习
  • **齿轮和离合器:**使用机器学习

Self Driving System in Action. All Controls are driven by ML/ DL Prediction.

这个项目的源代码可以在 这里找到

我的 Kaggle 源下载印度驾驶视频资料。

数据收集

有几个公开可用的驾驶数据集,但是每个数据集都有这样或那样的缺点,如下所示:

a) Sully Chen 的驾驶数据 (25 分钟)

  • 仅包含转向角作为参数
  • 需要更多的参数,来建造一辆功能齐全的汽车

b) Comma.ai 研究数据 (7 小时)

  • 包含转向、加速和制动。没有“齿轮”数据。图像质量较差
  • 他们的大部分驾驶数据都是在车道分离的高速公路上,那里弯道很少,车辆也少,这与印度的道路相反。

c)百度的appolo 开放平台(巨大)

  • 包含所有复杂的激光雷达和 3D 数据
  • 庞大的数据库:庞大得不合理要在 PC 上处理

所有可用的开放数据集都记录在西方设置中,那里的车道很宽,标志&分隔线也很清晰。但是**对于人工智能算法来说,印度的道路比西方的道路更难,因为没有足够的印度路况数据。**因此,在西方数据集上训练的算法在印度条件下可能表现不佳。

上述数据集都不适合在个人电脑上制造一辆功能齐全的汽车。此外,我很好奇人工智能算法如何在印度环境中工作。因此,我决定录制自己的视频。首先,我把一部 iPhone 挂在车外的挡风玻璃上,沿着印度狭窄弯曲的道路行驶。为了录制视频,我试图使用 Nexar AI dashcam 应用程序,但我的尝试失败了,因为它会自动检测并只存储碰撞帧。然后,我使用 iPhone 内置的录像机,沿着多条线路行驶了大约 1-1.5 小时。

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

External mounted dash-cam to record driver view video

但是录制的视频不足以训练一个自动驾驶系统。为了制造一辆功能齐全的汽车,汽车驾驶员在驾驶时提供的所有基本输入,即必须预测转向角、加速度、制动、离合器和档位。因此,训练数据也需要具有所有这些参数。

汽车控制台界面

为了记录驾驶时的转向角,我们可以使用汽车的车载诊断系统,以每毫秒一次的速度找到转向角。同样,我们可以破解汽车的机械和电子设备,以获得其他参数,如加速度,制动,离合器和齿轮等。作为一个生成训练数据的黑客,在不篡改汽车 OBD 的情况下,我用 Python 编写了一个汽车控制接口,记录来自键盘的扫描码。这个界面是用来模拟驾驶的,就像你用键盘玩电子游戏一样。

录制的视频和控制台界面是并排运行的,所以我可以使用箭头键来模拟在录制的视频中看到的驾驶。在驾驶模拟过程中,使用了七个关键控件来计算参数:

向上和向下箭头:加速&刹车
左右箭头:方向/转向角度
‘a’:升档
‘z’:降档【T8’‘g’:空挡

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

Car Console Interface & Recorded Video running side-by-side. Input from keyboard is driving all the console controls (Left) based on the turns and traffic in recorded video (Right)

接口程序将视频中每一帧的转向角、加速度、制动和档位值写入输出文件。如果视频以 30 fps 的速度录制,则必须每隔 1000/30 = 33 ms 循环写入参数值。要获得这种准确性有点困难,因为它取决于写入输出的“while”循环的执行时间。您可能需要每 30–33 毫秒写一次,才能与以 30 fps 录制的视频正确同步。将“写入频率”视为超参数,因为它取决于机器速度。您可以通过进行 1 分钟的驾驶模拟来调整写入频率,并检查它离 60x30 = 1800 帧有多远。在下面的代码中,您可以以纳秒级的精度调整“writeFrequency”参数。

Car Console Interface in Python

数据预处理

自我录制的驾驶视频需要一些预处理步骤,然后才能传送到网络。按顺序使用以下软件:

a) 无损剪切 —无损剪切相关视频。

b) 随时视频转换器 —调整视频大小以减少数据。

c) 视频到 JPG 转换器 —从视频中提取帧。

使用汽车控制台界面生成的提取视频帧和相应驾驶控制参数的印度驾驶数据集上传到 Kaggle提取的帧与相应的参数值(由模拟器生成)一起输入卷积神经网络进行训练。

如果你想使用一个开放的数据集,你必须写一个程序来解析给定的文件格式。下面的解析器代码读取. h5 文件,以及来自 comma.ai 数据集的参数值。上述预处理步骤,例如“帧尺寸调整”可以在下面的解析器代码本身中实现。

Parser code for .h5 files in comma.ai

模型构建

到目前为止,我们已经有了包含帧图像和相应参数值的训练数据集,即转向角、加速度、制动和档位。

为了从图像中预测转向角度我们可以使用深度学习(CNN)或计算机视觉技术。这两种方法的可行性将在后面的章节中进行分析。但是即使是人,也不能从单个帧中预测刹车或加速。因此,这种帧反馈 CNN 模型不足以预测加速度或制动参数,因为我们遗漏了一个重要信息,即帧的“序列”。

为了解决“序列”问题,我们可以使用

  • 复杂的 CNN-RNN 架构
  • 计算机视觉辅助技术。

我们选择了 CV 技术来量化“序列”信息,因为它可以很容易地从记录的视频中计算出来。这种量化值用于辅助加速和制动预测。可以根据所有剩余参数预测档位,即转向、加速、制动&序列信息。因此,使用了机器学习技术。离合器可以很容易地根据档位计算出来。

a)转向角预测

为了预测转向角度,CNN 网络有大量的信息可以学习,例如车道线的角度、道路的曲率、标志牌、其他车辆和行人的转向角度、道路中间分隔带的曲率等。此外,还有计算机视觉技术来寻找道路上车道线的角度,这反过来有助于决定转向角度。下面我们介绍两种方法来分析更好的西装。

# 使用霍夫变换

为了估计所需的转向角度,**可以对提取的帧应用霍夫变换,以使用 OpenCV 找到“车道线”**的系数& theta(由 Github 项目提供)

图像处理步骤的顺序如下所示:

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

1. Input image 2. Greyscale 3. Gaussian Blur, 4. Canny Edge Detection 5. Mask 6. Hough lines 7. Lane Lines

霍夫变换可以帮助从图像中的点扩散估计线条。

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

Hough Transformation Implementation for Polygons

边缘检测后断开的车道线也可以通过分析累加器阵列的蝶形宽度来检测,如下所示:

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

霍夫空间中正弦波的交点将给出待估计的线的参数 对于每一帧,估计车道线的角度将有助于确定转向角度。在下面的可视化中,对应于 3 条线的三个点扩散云生成 3 个正弦波,在右侧霍夫空间中有 3 个交点。

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

Matlab Implementation: Multiple Lane Line Detection from Edge Detected Point Spreads

但是,上述计算机视觉技术不适合制造我们的自动驾驶汽车,**因为我们想在印度道路上自动驾驶,那里可能没有车道线或分隔线这样一致的信息。**因此,我们使用鞋底深度学习来预测转向角度。

# 使用深度学习模型

我们需要预测每个单独帧的转向角度。我们可以采用一组转向角和相应的帧图像来馈送 CNN 模型,并尝试最小化 MSE 训练损失。经过多次迭代和历元训练的模型,可以用来预测转向角,即使是在不平坦的印度环境中。为此,使用了英伟达用于自动驾驶汽车的端到端 CNN 架构。1

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

Nvidia’s CNN architecture: contains 27 million connections & 250 thousand parameters

**模型可解释性:**理解深度学习模型内部正在发生的事情是很重要的。对于 CNN 模型,我们可以将隐藏层可视化,以了解单个过滤器拾取的特征。

CNN Visualization Code

输入图像帧和隐藏层可视化输出如下所示:

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

Input Image Frame

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

CNN Hidden Layer Visualization for different filters

三个驾驶控制参数,即转向角、加速度和制动在不同的车型上进行训练,并在运行时同时执行**以驱动汽车。**训练一个控制参数的代码如下。

To Train the ‘Acceleration’ control variable. Similar training is done for Steer & Brake.

b)加速和制动预测

由于加速和刹车固有地依赖于视频中的帧序列,我们借助计算机视觉来预测这两个参数。

光流表示由观察者和场景之间的相对运动引起的场景中物体和边缘的明显运动。在录制的视频中,我们可以分析强角点的光流,通过先前的帧来估计未来的帧流。

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

Visualization of Sparse Optical Flow along narrow Indian roads

假设在第(n-1)和第(n-2)帧中有“k”个强角,其中“n”是当前帧。比方说在拐角处,c 从一帧移到下一帧。光流可以通过对先前帧中所有角点的距离偏移求和来量化。

但是,已经发现该和将与检测到的角点数量成比例地平方增加。此外,和将沿着曲线急剧增加,因为帧中的像素将从左向右或从右向左移动。

基于上述逻辑,下面的等式已经根据经验计算出来,以量化来自光流的加速度。

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

Steering Angle is in Degrees

下面的 python 程序分析记录的视频&计算视频中每个相邻帧的光流参数‘gamma’并输出到文件。

由于计算的光学参数值是无界的,应用 sigmoid 函数或双曲线正切函数来挤压这些值。由于 tanh 将所有正值限制在 0 & 1 之间,而 sigmoid 的范围是 0.5 比 1,所以 tanh 成为我们的自然选择。挤压量可通过“alpha”参数进行调整,如下图所示。

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

Image Courtesy

基于“伽马”值的分布,我们可以决定“阿尔法”值以匹配记录的加速度值的分布,然后乘以最大加速度值,以从 0 到 1 进行缩放。在这种情况下,我们计算出 alpha = 0.18 以避免在双曲正切曲线的渐近端出现任何 gamma 值。

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

Here, alpha is denoted by delta symbol

结合这两个值来预测加速度和制动值。

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

当汽车行驶时,计算来自仪表板摄像头视频的光流值,并且上述计算是在运行中完成的,以预测加速度和制动。上述公式的实现在下面的并发执行部分。

为了计算上述等式中的“DL 预测”,使用了受著名的 LeNet 架构启发的 3**-卷积层模型。因此,对于 steer 来说,NVidia 端到端 CNN 架构以及对于 Accel 和 Brake LeNet 来说,受启发的架构与光流参数特征相结合。**

不同模型的原型制作在 Keras 中完成,如下所示。

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

LeNet Architecture

LeNet-inspired 3-Convolution Layer Architecture in Keras

c)齿轮和离合器预测

档位不依赖于单个帧图像,而是所有参数的组合,即转向角、加速度、制动&也是序列信息。因此,我们可以使用机器学习算法,使用上述参数作为输入特征来预测因变量“齿轮”。

我们知道基于树的最大似然算法在特征较少时表现更好,就像在这种情况下。在尝试了逻辑回归、朴素贝叶斯、GBDT 等多种算法后,**发现 RandomForest 给出了最大的准确性。自动驾驶汽车只有在最后“n”帧的档位预测相同时才会换档,而不是依赖于单个帧的档位预测,。**换档时离合器可以轻松计算。

RandomForest Algorithm to predict gear of last ’n’ frames.

并发模型执行

转向、加速、制动和档位模型在不同的会话中同时执行,并带有相应的计算图表,以预测每一帧的所有驾驶控制值。

Concurrent Execution of all models at Run-time

预测输出

下面的汽车正在根据 dash-cam 视频输入进行自动驾驶。它可以很好地处理新曲目,在训练网络时看不到。

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

All the controls are guided by prediction

该项目的源代码可以在 这里 找到

结束语

想象我们的世界拥有自动驾驶汽车的所有优势,这似乎不亚于一部科幻电影,其中无人驾驶的摆渡物体(UFO)正在我们的道路上蜿蜒前行。对普通大众来说,可能是《爱丽丝梦游仙境》。

但是今天的仙境可以在未来变成令人惊叹的现实,那时人类驾驶汽车将会是一个故事,由老奶奶们讲给他们的孙子们听。但要实现这一点,它必须通过所有的障碍,即伦理,技术和后勤,成为一个现实世界的乌托邦。例如,基础设施需要彻底检修,技术应该处理所有极端情况,特别是在崎岖的印度道路上,以防止类似优步的事件发生。

西北大学教授 Jeremy P Birnholtz 说,“人的变化很慢,技术的变化很快”。人类和自动驾驶汽车相互适应的效率如何,最好留给时间来检验。

人类驾驶汽车的能力如此之差,以至于计算机不必好到比人类好太多~马克·安德森

参考

1马留什 b,达维德 D,丹尼尔 D 等。艾尔。、(2016) 自动驾驶汽车端到端学习。检索自 Arxiv: 1604.07316v1 [cs。简历]

2菲利普·f·阿列克谢·d·等人艾尔。,(2015) **FlowNet:用卷积网络学习光流。**检索自 Arxiv:1504.06852 v2【cs。简历]

3 Abdoulaye S .,Eric A .,(2013) **扩展标准霍夫变换用于分析线识别。**检索自 IJACSA)国际高级计算机科学与应用杂志,2013 年第 4 卷第 3 期。

[## sully Chen/自动驾驶仪-张量流

这份英伟达论文的 TensorFlow 实现:有一些变化的 https://arxiv.org/pdf/1604.07316.pdf…

github.com](https://github.com/SullyChen/Autopilot-TensorFlow) [## 自动驾驶汽车将如何重塑我们的世界

自动驾驶汽车只是拼图的一部分。前纽约市交通专员塞缪尔·施瓦茨(又名…

www.wsj.com](https://www.wsj.com/articles/how-autonomous-vehicles-will-reshape-our-world-1539871201) [## 应用课程

应用机器学习课程研讨会案例研究

www.appliedaicourse.com](https://www.appliedaicourse.com/)

自动驾驶汽车:更大的道路安全,更少的隐私

原文:https://towardsdatascience.com/self-driving-cars-bigger-road-safety-less-privacy-78dfa2ad0251?source=collection_archive---------11-----------------------

他们应该减少道路伤亡,但他们还需要什么?

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

汽车是当今最普遍的交通工具。他们提供舒适,自由,可用性,各种各样的费用和一个微小的,但不是微不足道的被卷入事故的可能性。

伤亡人数正在减少,然而汽车仍然是最致命的交通系统之一,仅次于摩托车。根据世界卫生组织的数据,它们也是一个难以承受的经济负担,占每个国家 GDP 的 1%到 3%。

政府和汽车制造商正在共同努力,努力大幅降低这一比率:例如,欧洲联盟委员会制定了若干战略,其中包括合作智能交通系统,重点是减少人为错误和创造环境友好型解决方案。

根据 2017 年道路安全初步统计数据,2017 年的死亡人数比 2010 年减少了 20%,比 2016 年减少了 2%。委员会发布了 2010 年至 2020 年道路交通死亡人数减半的目标,设定了一些目标2,但不幸的是,这些目标并没有实现,这意味着实现这一目标将具有挑战性。

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

Photo by Denys Nevozhai on Unsplash

我们如何提高道路安全?

大量的努力和资源对于提高道路安全至关重要,行业已经提出了大数据和自动驾驶汽车等解决方案。既然大多数车祸都是由于人为因素而不是太多技术故障,那么用软件代替人为因素听起来就顺理成章了。

可能的解决方案:无人驾驶汽车

第一个挑战是建立一个能够比最好的人类司机更好地感知道路的自动驾驶系统,这不会很快发生。目前的地图也不够精确。但是自动驾驶是什么意思呢?

简而言之,汽车自治有 5 个级别:

  • 0 级车没有自动化功能,
  • 第三级意味着人类和机器之间的交换,根据研究,这是最致命的级别3
  • 在 5 级[4]的所有条件下,车辆完全自动驾驶。
  • 截至 2018 年,市场上最先进的汽车都在 2 级的中途。

当前的自动驾驶汽车配备了内部和外部传感器、激光雷达单元、摄像头和强大的软件,包括驾驶员的语音和手势识别、语言翻译和强化学习算法[5]。汽车通过捕捉附近物体的大小和速度的数据并预测可能的变化,不断渲染封闭的环境。该算法的主要任务可以分为目标检测、识别、定位和运动预测。

强化学习算法中,奖励被分配给某些结果,推动算法学习相应的行为。数据越多,算法更新其参数以实现奖励的精度就越高。

因果关系是这样的:自动驾驶汽车收集的数据越多,算法就越强大,适应性越强,事故就越少。

然而仅仅收集数据是不够的;道路、环境和人类司机的行为可能会有很大的不同,这取决于该地区是城市还是农村、特定国家的习俗和非书面法律。

因此,用尽可能多的不同数据来训练这些汽车是必不可少的。下面的困境出现了:需要多少数据?自动驾驶汽车什么时候可以被允许上路?

在开发和测试的哪个阶段,我们可以允许汽车上路?

兰德研究所的高级研究人员认为[6],在制造商能够确认它们在统计上与人类驾驶员一样安全之前,自动驾驶汽车需要行驶很长的距离。

他们提出了这样一个问题:“对人们来说什么是重要的,他们希望他们比人类司机更安全吗?这个答案会随着时间而改变吗?”。制造商需要的数据量取决于公司对风险的厌恶程度,以及对公众的信任程度。

最佳切入点是一个有争议的话题[7]:

比起机器犯的错误,人们更能接受其他人犯的错误,即使机器总体表现比人好[8][9]。

在寻求减少死亡事故的过程中,自动驾驶汽车必须面对创建和维护地图、掌握复杂的社会互动、应对恶劣天气条件以及应对网络攻击的挑战[10]。

数据保密

考虑到汽车和私人公司将知道司机最常去的地方,并可能(并将)建立客户偏好和习惯的档案,隐私和数据保护问题不容忽视。

如今,理论上没有人知道汽车在哪里。如果乘客随身携带他们的手机并激活定位服务,操作系统可以跟踪他们的位置,知道他们移动的速度以及他们何时/何地停下来。但其他的就不多了。

在涉及更多软件和互联网连接的汽车中,用户可以发出语音命令,已经有一些软件公司在处理语音命令。当然,这些公司非常重视隐私,但已经存在数据泄露的风险,即使这种风险很小。亚马逊 Echo 设备已经出现了一些数据隐私问题。

在自动驾驶汽车中,用户将他们的生活和隐私交给了一家软件公司,这是对已经存在几十年的传统汽车制造商的一大飞跃。例如,优步只有 10 岁。也许明智的做法是警惕我们信任谁来驾驶我们。

自动驾驶汽车背后的技术监管等其他问题存在争议,但超出了本文的范围。

哪些公司领先?

当进入竞争激烈的自动驾驶汽车行业时,有三家公司处于前列,即谷歌、特斯拉,最近还有优步

谷歌每周收集 15000 英里的自动驾驶里程,迄今为止在美国已经积累了 170 万英里的自动驾驶里程[11],与欧洲不同,美国的死亡事故正在增加[12]。美国人在致命事故发生前行驶了 1 亿英里;因此,按照目前的速度,谷歌需要数年才能行驶同样的距离。

特斯拉,另一方面,有一个不同的方法。通过使用他们的“自动驾驶模式”,特斯拉已经行驶了 13 亿英里[13],其中汽车由人类在自动驾驶模式下驾驶。尽管如此,将顾客作为试驾者也有缺点,正如少数有争议的致命车祸所显示的那样。

优步最初是一家拼车公司,现在已经迅速转向送餐和自行车共享,以及他们自己的无人驾驶汽车,甚至有一段时间还有无人驾驶卡车。在一系列事故之后,优步继续在匹兹堡[15][16]和多伦多[17]测试他们的赛车(低速)。关于他们收集的数据的性质和数量,没有多少公开信息。他们的汽车扩展到其他城市也没有截止日期[18]。

结论

总之,自动驾驶汽车正在逐渐加入道路,这一过程可能会因公众的不情愿而推迟,但不会停止。

许多公司正在投资开发和增强他们的自动驾驶算法,在美国,主要城市的道路已经成为他们的游乐场。

随着司机习惯于驾驶自动驾驶汽车上路,后者的相关性必然会增加,完全自动驾驶和联网汽车网络的乌托邦可能并不遥远。

参考

**1: 世卫组织世界报道(2013)
【2】:欧盟自 2001 年以来的道路死亡人数
【3】:众包地图应该有助于无人驾驶汽车更安全地在我们的城市中导航(2019)
【4】:用 3D 绘制世界将让我们用增强现实绘制街道(2019)
【5】:未来自动驾驶汽车驾驶员研究
【6】:
汽车的自主水平
【7】:使用深度强化学习的自动驾驶汽车在闭塞的路口导航(2018)
【8】:驾驶到安全的地方:需要行驶多少英里才能证明自动驾驶汽车的可靠性(2016)
【9】:为什么等待完美的自动驾驶汽车可能会付出生命的代价 (2017)

【12】:自动驾驶汽车的挑战与障碍(2016)
【13】:way mo,在路上
【14】:美国道路安全法律滞后,而死亡事故攀升(2018)
【15】:[特斯拉、 自动驾驶数据](https://spectrum.ieee.org/cars-that-think/transportation/self-driving/tesla-reveals-its-crowdsourced-autopilot-data, https://electrek.co/2016/11/13/tesla-autopilot-billion-miles-data-self-driving-program/)(2016)
【16】:我们的自动驾驶车辆之路(2017)
【17】:优步的自动驾驶汽车自致命车祸以来首次重返公共道路(2018)
【18】:优步刚刚被批准恢复在匹兹堡和该州其他地方的自动驾驶测试(2018)**

自我激励通常与生活的宗教方面有关

原文:https://towardsdatascience.com/self-motivation-is-usually-linked-to-the-religious-aspects-of-life-4b34c8b22d96?source=collection_archive---------50-----------------------

如何使用自然语言处理来检查体裁之间的相似性,从而洞察整本书的写作内容

我们都同意桔子更像柠檬,而不是菠萝。像大小、形状和水果种类这样的属性很快就会进入我们的脑海。检查对象之间的相似性可以洞察它们的属性和总体特征。

在我最近的项目中,我通过使用自然语言处理(NLP)分析不同流派的书籍的导语,对它们的写作方式有了深入的了解。这个简单的项目展示了 NLP 在实践中的应用,以及文本分析在数据科学中的重要性。关于这个项目的更多细节和完整代码,请查看这个 资源库。

什么是广告词?

简介是对一本书、一部电影或其他产品的简短描述,是为促销目的而写的。书的简介通常很短,大多数情况下超过 100 个单词。

一个 200 字的导语可以用来代表一本 58000 字左右的书。

我对这个项目的主要目标包括找出以下内容:

  • 导语是整本书的准确表达吗?
  • 导语可以用来区分书籍的类别吗?
  • 使用自然语言处理的不同类型的书籍/小说之间的相似性。

数据是从哪里得到的

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

我从非洲最受欢迎的电子书店 okadabooks 网上搜集数据,以用于此次分析。我选择这个网站的原因之一是它种类繁多,致力于出版非洲文学。查看 此处 了解更多关于网页抓取算法的细节。

规范化简介

为了进行正确的文本分析,最初的广告必须规范化。这包括删除标点符号、数字,并将所有大写字母改为小写。我用df['norm_blurb']= df.blurb创建了一个广告的副本,然后用df.norm_blurb= df.norm_blurb.astype(str)将其类型改为 strings。我使用 lambda 映射函数来帮助完成剩下的工作,如下所示。每行代码上的注释显示了每行代码在做什么。

标准化后的数据框如下所示:

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

sample of the data frame

选择要使用的类型

为了提高我的结果的准确性,我选择 norm_blurb 列中包含至少总共 100,000 个单词的流派。所有的广告词大约有 110 万字。这也有助于降低该项目的复杂性。

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

Breakdown of blurb words in all categories

我选择了上图中下划线标出的四种类型:自助类、小说类、浪漫类和宗教类。为四种类型创建了数据帧,另一个标记为random_df的长度为 2000 的数据帧通过使用df.sample(l=2000).函数使用四种类型的随机行创建。

消除停用词并创建每个词的频率字典

停用词 是语言中最常见的词。大多数句子需要包含停用词才能成为有意义的完整句子。它们是对语义关系没有影响/影响很小的词。通常,停用词会被删除,因为它们不重要,会扭曲词频分析。使用**from** **sklearn.feature_extraction** **import** stop_words导入库。stopwords.ENGLISH_STOP_WORDS将在功能中用来删除停用词。英语停用词的例子包括:

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

使用了一个函数来返回所需结果。这个函数创建一个字典,计算一个单词出现的次数,然后删除停用的单词。每一行都有一个注释解释它的作用。

导语是书籍的准确表达吗?/导语可以用来区分书籍的类别吗?

第一个问题有助于回答第二个问题。是的!在所选的类别中,10 个最常见的单词让我们对这些问题有了深入的了解。

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

当一个人寻找浪漫小说时,他/她是在寻找某种爱情故事。对于宗教类书籍,难免看不到教会之类的字眼。大多数励志书籍(自助)通常会讲述如何在一段时间内获得成功的秘诀。用最简单的术语来说,小说就是某种故事。

注意上面加粗的单词在它们各自的体裁中是 10 个最常见的单词。

可以从最常用的词中做出更多的推断:

  • 上帝、基督和耶稣是宗教范畴中最常见的 10 个词。这是意料之中的。这也暗示了很多宗教书籍都是关于 okadabooks.com 的基督教的
  • 自助书籍(也称为励志书籍)中多次提到成功,这些书籍倾向于宣扬激励/提供通往成功的秘诀。
  • 上帝是自助(励志)书籍中第十常见的词。这表明成功有时与生活的精神层面联系在一起。这个推论耐人寻味。
  • 爱情是言情小说中最常见的词。由此得出结论,言情类的导语是整本书的准确表达。

从这些频繁出现的词汇中,可以推断出很多关于 okadabooks.com 的书籍。虽然大多数导语确实是用于促销目的,但它们是整本书的伟大代表。

体裁之间的相似性

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

因为我们已经确定导语是书籍的一种很好的表现形式,相似性度量可以通过比较词频来计算。在这篇文章中,我将只集中在宗教书籍和其余选择的流派之间的相似性。哪个类别与宗教书籍最相似?哪个最不相似?

Jaccard 相似度 比较两个集合的成员,看哪些成员是共享的,哪些是不同的。简单地说,它是通过寻找集合的交集除以它的并集得到的。下面的函数用于获得所需的结果。

**def** jaccard_similarity(genre1, genre2):     
       intersection = len(set(genre1).intersection(set(genre2)))
       union = len(set(genre1).union(set(genre2)))     
       **return** intersection/union

该值的范围从 0 到 1,其中 1 表示两个数据集 100%相似。然后用环形图将相似性可视化。

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

除了自我相似性之外,宗教书籍与自助书籍最为相似,约占 34%。这又回到了我们最初的推断:

上帝是自助(励志)书籍中第十个最常见的词。这表明成功有时与生活的精神层面联系在一起。

为了更深入的了解,我研究了这两个类别中最常见的单词。结果很有趣。

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

广告样本

这两个类别的示例让我们对一些书面广告有所了解。这只限于自助和宗教类别。

宗教信仰类别:

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

简介上写着:

性格的力量是一个 31 天的奉献和姐妹部长的工作手册。这本书将教你如何建立你的祷告生活,成为一个更好的人,并改善你与上帝的关系。

自助类别:

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

这是一本激励个人发展和商业策略的书。它是为了平衡贫富差距而写的。每个青年都需要成为有用的青年,最大限度地发挥他们的潜力,并发现他们的目的。

结论

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

这个简短的项目研究了两个物体之间的相似性,并证实了两个物体之间的相似性度量可以洞察它们的属性和整体特征。在这种情况下,通过使用自然语言处理来比较几种体裁,这给出了对不同类别书籍的写作内容的理解。

我很想听听你对此的想法。感谢您的阅读!

如果你喜欢这篇文章,请关注并看看我的其他数据科学文章🙏🙏。

自组织地图

原文:https://towardsdatascience.com/self-organizing-maps-1b7d2a84e065?source=collection_archive---------6-----------------------

(科霍宁的地图)

简介

自组织映射或 Kohenin 映射是由 Teuvo Kohonen 在 20 世纪 80 年代推出的一种人工神经网络。(论文链接)

SOM 使用无监督学习来训练,它与其他人工神经网络略有不同,SOM 不是通过 SGD 的反向传播来学习,而是使用竞争学习来调整神经元中的权重。我们使用这种类型的人工神经网络进行降维,通过创建空间组织的表示来减少我们的数据,还帮助我们发现数据之间的相关性。

SOM 的架构:

自组织地图有两层,第一层是输入层,第二层是输出层或要素地图。

与其他神经网络类型不同,SOM 在神经元中没有激活函数,我们直接将权重传递给输出层,而不做任何事情。

SOM 中的每个神经元被分配一个与输入空间具有相同维数 d 的权重向量。

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

自组织地图训练

正如我们之前提到的,SOM 不使用 SGD 的反向传播来更新权重,这种类型的无监督人工神经网络使用竞争学习来更新其权重。

竞争学习基于三个过程:

  • 竞争
  • 合作
  • 适应

让我们解释一下那些过程。

1)竞争:

正如我们之前所说的,SOM 中的每个神经元都被分配了一个与输入空间维数相同的权重向量。

在下面的例子中,在输出层的每个神经元中,我们将有一个维数为 n 的向量。

我们计算每个神经元(来自输出层的神经元)与输入数据之间的距离,距离最小的神经元将成为竞争的赢家。

欧几里德度量通常用于测量距离。

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

2)公司:

我们将在最后的过程(适应)中更新获胜神经元的向量,但它不是唯一的一个,它的邻居也将被更新。

我们如何选择邻居?

为了选择邻居,我们使用邻域核函数,该函数取决于两个因素:时间(每次新输入数据增加的时间)和获胜神经元与另一个神经元之间的距离(该神经元离获胜神经元有多远)。

下图向我们展示了如何根据距离和时间因素选择获胜神经元(中间最绿的神经元)的邻居。

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

Time and distance factors

3)改编:

在选择胜出的神经元和它的邻居后,我们计算神经元更新。这些选择的神经元将被更新,但不是相同的更新,神经元和输入数据之间的距离越大,我们调整它,如下图所示:

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

neurons of the output layer update

将使用以下公式更新优胜神经元及其相邻神经元:

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

这个学习率表明了我们想要调整权重的程度。

在时间 t(正无穷大)之后,这个学习速率将收敛到零,因此我们将没有更新,即使对于神经元赢家也是如此。

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

邻域核取决于赢家神经元和另一个神经元之间的距离(它们成比例地相反:d 增加使 h(t)减少)和邻域大小,邻域大小本身取决于时间(随着时间增加而减少),这也使邻域核函数减少。

完整 SOM 算法:

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

例子:

现在让我们看一些例子

示例 1:

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

正如你在这个例子中所看到的,特征图采用了在二维空间中描述数据集的形状。

示例 2:

SOM with 3D feature map

自定进度多任务学习——综述

原文:https://towardsdatascience.com/self-paced-multitask-learning-76c26e9532d0?source=collection_archive---------4-----------------------

更新:

  • 2021 年 8 月 14 日:从 GUPNet (ICCV 2021)添加 HTL(分层任务学习)

多任务学习使用相同的模型来执行多重回归和分类任务。多任务通常被认为可以提高网络性能,因为多个相关的任务有助于相互调整,并且可以学习更健壮的表示。此外,将所有任务合并到同一个模型中也有助于减少计算,这是自动驾驶等实时应用的关键要求。

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

A typical network structure for multi-task learning

通常,同一个主干(编码器)用于从原始输入中提取常见的低级特征,多个特定于任务的头(解码器)连接到主干。每项任务都有一个或多个损失项,总损失通常是所有损失项的加权平均值。深度神经网络中的每个可学习参数通过优化方法根据基于该总损失计算的梯度来更新。

现代优化方法,如随机梯度下降法和我们最喜欢的替代方法 Adam,无情地将总损失项减少到局部最优值。优化方法本身并不知道每个单独的损失项和每个单独任务的进度。因此,基于深度学习的多任务学习的性能对分配给每个任务的相对权重非常敏感。在极端情况下,如果除了一个任务之外的所有任务的权重都被设置为零,那么只有那个特定的任务将被适当地优化。

我曾经听过这个笑话(可能来自吴恩达在 Coursera 上的深度学习专业,但我不确定),它是这样的:如果一个人工智能算法被告知根据整个人类的平均幸福来最大化一个目标,它会做什么?这个目标听起来很合理,但人工智能可能会消灭大多数人类,只最大化少数人的幸福,最大化人类的平均幸福。

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

Well this graph of local optima is definitely from Andrew Ng’s course

多任务学习中损失的一般公式是

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

其中λ是分配给特定于任务 t 的损失 L_t 的权重,现在的问题是,如何选择λ来平衡多个任务?

标准基线

最简单的做法是在所有任务中使用统一的权重。然而,来自不同任务的损失通常具有非常不同的尺度,并且均匀地平均它们淹没了来自小损失任务的梯度。

一种典型的方法是通过网格搜索手动调整权重。然而,搜索空间随着任务的数量呈指数增长。当任务的数量超过两个时,执行网格搜索通常会非常繁琐,并且在计算上非常困难,尤其是当您有其他超参数需要优化时。(稍微好一点的方法是随机搜索,它给出了搜索优化参数的固定预算,但仍然需要多次运行相同的实验来搜索优化的参数。)此外,在整个训练过程中,搜索到的权重是静态的,正如我们在下面看到的,这可能不是最优的。

自定进度学习

一种更有原则的方法是根据某种标准自动为每项任务分配权重。有两个相关的学习领域:课程学习自定进度学习

课程学习最初是为了提高多任务子集的训练。它指出从小处着手很重要,用简单的例子初始化培训过程,然后继续进行更具挑战性的。这通常会带来更好的性能(参见这篇博文中的示例)。它在强化学习社区的应用比在计算机视觉领域更广泛。听起来它为我们的多任务问题提供了一个解决方案——我们可以从简单的任务开始,然后从困难的任务开始。然而,如何确定每个任务的难度是一个公开的问题,并且任务的难度可能在训练过程中发生变化。显然,手工制作课程表很有挑战性(对于动态的课程表来说更是如此),所以我们需要一种自动化的方式来做这件事。另外,课程学习有一个很强的假设 所有任务都有一个恒定的底层分布

自定进度学习是一种自动化的课程学习方法,其中课程由模型的能力决定。基本思想是监控学习进度信号,并设计或学习调整任务相对权重的策略。这种方法将学习每个任务的动态权重。这实际上非常类似于人类学生的学习方式——学生根据他们在特定科目上的表现来决定在每个科目上投入多少精力。

在接下来的会议中,我将简要概述文献中关于自定进度多任务学习的三种流行方法。

使用不确定性衡量损失的多任务学习

这篇论文的作者(特别是 Alex Kendall)是深度学习中不确定性研究的先驱。这项工作是他们之前在不确定性方面的研究的一个特殊应用,例如我们在计算机视觉的贝叶斯深度学习中需要哪些不确定性? (NIPS 2017)和贝叶斯 SegNet:场景理解的深度卷积编码器-解码器架构中的模型不确定性 (BMVC 2017)。

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

The famous illustration of Aleatoric Uncertainty and Epistemic Uncertainty. This has become the de facto namecard for Bayesian Deep Learning.

深度学习中不确定性的一些背景知识:不确定性有两种,认知不确定性,和任意不确定性。认知不确定性是可以用更多数据解释的模型不确定性。任意不确定性是不能用更多的数据来解释的数据不确定性。随机不确定性可进一步分为两类,数据相关的异方差不确定性和任务相关的同方差不确定性。具体来说,作者建议使用同方差不确定性来衡量不同的任务。

嗯,这是一个相当复杂的问题,但这个想法是明确的。存在一种特定类型的不确定性,它不随输入数据而改变,并且是特定于任务的,作者正建议了解这种不确定性,并使用它来降低每个任务的权重。

本文推导了基于同方差不确定性下高斯似然最大化的多任务损失公式。这里就不赘述了,但是简化的形式是惊人的简单。

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

Modified weight based on task uncertainty

在上面的等式中,σ是与每个任务相关的不确定性(具体地说是同方差不确定性),不确定性越大,任务损失对总损失的贡献就越小。为了避免神经网络通过将所有任务的不确定性设置得非常高来学习琐碎的解决方案,第二项开始起作用并避免不确定性被设置得太高。第二项可以看作是一个正则化项,或“不确定性预算”。(这其实让我想起了另一篇论文:神经网络中用于分布外检测的学习置信度,其中也有神经网络跳过不确定性高的例子的“作弊预算”。你可以在这里找到我对这篇论文的笔记。

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

Task weight changes during training (uncertainty weighting)

这篇论文可能是最著名的,因为它简单明了。github 上有 Tensorflow 实现Keras 实现pyTorch 实现

GradNorm:深度多任务网络中自适应损耗平衡的梯度归一化

GradNorm 用学习率代替不确定性作为学习进度信号。他们认为,任务不平衡阻碍了适当的训练,因为它们表现为反向传播梯度之间的不平衡。

训练率可以通过损失率或训练率的倒数 r(t)= 1(t)/1(0)来估计,即损失减少的速度有多快。这在所有任务中都是正常的。

然后,我们计算特定层(通常是主干最后一层的特征图)的每个任务的平均梯度范数。G(t) = ||∇wL(t)||_2.这在所有任务中也是正常的。

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

Without GradNorm and With GradNorm

使用来自以下损失的梯度来动态更新权重。

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

GradNorm loss for dynamically updating weights

等式中有一个超参数α,用于调整不同任务的平衡强度。α越高,不同任务之间的损失越不对称。如果α=0,则任务的权重相等。作者发现网络性能对(0,3)中的α相对不敏感。看起来α=1 可能是一个很好的默认值。

此外,GradNorm 总是确保权重被重新归一化为 1,这有助于更平滑的训练。

作者还发现,时间平均加权因子非常接近通过网格搜索选择的最优加权因子。这意味着 GradNorm 也可以用于找到最佳的静态权重,但只需运行一次实验(不像网格搜索所需的指数增长的实验数量)。

我在 github 上只找到了 pyTorch 的一个实现。

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

Task weight changes during training (GradNorm)

DTP:多任务学习的动态任务优先级

动态任务优先级不是用损失率作为学习进度信号,而是用 KPI κ(t)来代替,实际上更有意义。L(0)或初始损失中有太多的噪声,并且严重依赖于初始化方法。

DTP 借鉴了 Focal Loss(FAIR 的 RetinaNet 论文)的思想,将任务权重设置为 FL(κ)。γ是一个超参数,默认值为 1。

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

The formulation of Focal loss, an extension to Cross Entropy loss

这篇论文实际上也谈到了在网络体系结构中通过任务层次的实例级优先化和任务优先化,但是我个人认为那些新奇的东西不切实际。

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

Task weight changes during training (DTP)

HTL:分层任务学习

有时手头的多项任务并不相等,最好先训练一些不确定性低的任务,然后再开始训练不确定性高的任务。 GUPNet (用于单目 3D 物体检测的几何不确定性投影网络,ICCV 2021) 提出了一种分层任务学习(HTL)方法来解决单目图像深度预测的高度不适定问题。

HTL 受到这样一种动机的启发,即每项任务都应该在其前置任务训练好之后开始训练。HTL 确保只有当一项任务学得足够好时,才开始另一项任务的训练。

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

The 3 training stages of GUPNet and the evolution of loss curves and loss weights

具体地,在 GUPNet 的公式中,深度预测严重依赖于 2D 和 3D 尺寸的预测。HTL 解决了在初始训练阶段 2D/3D 尺寸的估计会有噪声,导致可怕的深度预测的问题。

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

通过比较最后 K 个时期和最初 K 个时期的学习趋势来定义任务是否已经被很好地学习的学习情况(ls)。一个任务只有当它所有的前置任务都学习好了才能开始训练。

外卖食品

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

Comparison of different self-paced learning method

这三种方法实际上都很容易实现,尤其是在 pyTorch 中。需要注意的是,流入和流出加权因子的梯度可能需要分离

没有强有力的证据表明一种方法比另一种好得多。当然,GradNorm 和 DTP 论文都说它们比不确定性加权要好,但是在实践中这种改进非常小。考虑到实现的容易程度,也许应该首先尝试不确定性加权。

**结束注释:**对于 DTP 或 GradNorm 来说,更好的方法可能是,分别训练每个任务,并大致了解目标损失 L(∞)或 KPI κ(∞),并使用与预训练网络的目标值的比率作为学习进度信号。

关于我

作为一名物理学家,我曾在 X 射线探测器设计(我的博士论文)、半导体设备异常检测、医疗人工智能和自动驾驶等领域工作。我目前在一家快速发展的初创公司工作,致力于感知(传统的相机感知和新兴的基于 DL 的雷达感知)。我们在圣地亚哥和硅谷都有办公室。如果你对深度学习充满热情,或者你是个硬核 DSP 算法工程师,或者只是想打个招呼,请在 patrickl@xsense.ai 给我留言。

自我监督的甘斯

原文:https://towardsdatascience.com/self-supervised-gans-2aec1eadaccd?source=collection_archive---------17-----------------------

甘斯

如果你不熟悉生成对抗网络(GANs),它们是一种非常流行的生成建模技术,由两个深度神经网络(一个生成器和一个鉴别器)相互对抗而形成。这种对抗性的损失引发了许多深度学习和人工智能研究人员的兴趣。然而,尽管 GAN 公式很美,最先进的架构也令人大开眼界,但 GAN 通常很难训练。使用 GANs 获得更好结果的最好方法之一是提供类别标签。这是有条件 GAN 模型的基础。本文将展示自我监督学习如何克服训练 GAN 对类别标签的需求,并与条件 GAN 模型的性能相媲美。

自我监督学习

在我们进入自我监督学习如何改进 GANs 之前,我们将介绍自我监督学习的概念。与监督和非监督学习的流行系列相比,自我监督学习与非监督学习最为相似。自我监督的任务包括图像着色、预测从图像中提取的补丁的相对位置,或者在这种情况下,预测图像的旋转角度。这些任务被称为“自我监督的”,因为这些数据有助于这些替代任务。在这个意义上,自监督任务采用(X,Y)对的形式,然而,X,Y 对是从数据集本身自动构建的,并且不需要人工标记。这篇文章中讨论的论文将自我监督学习总结为“一个人可以对给定的图像进行编辑,并要求网络预测编辑的部分”。这是自我监督学习背后的基本思想。

有条件和无条件的 GANs

现在,我们将把自我监督学习与训练 GANs 的相关问题联系起来。在其理想形式中,GANs 是一种无监督的生成建模形式,其中您可以只提供数据,并让模型从中创建合成数据。然而,最先进的 GANs 使用一种称为条件 GANs 的技术,该技术将生成建模任务转变为监督学习任务,需要标记数据。在 Conditional-GANs 中,类标签被嵌入到生成器和鉴别器中,以便于生成性建模过程。无条件 GANs 指的是 Goodfellow 最初的想法,即生成式建模不需要类标签。本文将向您展示自我监督的学习任务如何能够消除对带有 GANs 的标记数据的需求。

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

Conditional GANs require class labels to work, (pictured in green)

辅助旋转任务

本文将讨论在以下论文中提出的自监督学习 GAN 架构的细节:

[## 自我监督的生成对抗网络

条件甘处于自然图像合成的前沿。这种模型的主要缺点是需要…

arxiv.org](https://arxiv.org/abs/1811.11212)

从高层次来看,本文中的辅助的、自我监督的学习任务是容易理解的。(如下图)

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

GAN 的发生器部分完全不知道辅助旋转任务,除了它必须学会在旋转时产生与真实图像共享相似特征的图像。轮换任务对鉴别器网络有巨大的影响。鉴别器现在有两个任务。第一个是预测图像是来自原始训练集还是由生成器创建的,就像所有的 GANs 一样。第二个任务是这篇论文如此有趣的原因。这组真实和虚假图像被旋转成 0、90、180 和 270 度旋转的相等分区,并且鉴别器必须对这些图像的旋转角度进行分类。鉴别器的旋转误差仅在真实图像上的误差上受到惩罚,以阻止来自生成器的不健康的收敛。

鉴别器遗忘

作者提出,由于难以从非平稳分布中学习,无条件 gan 表现不佳。这是持续学习中重点研究的问题,本文讨论了许多方法,如连接持续学习和 GANs 的弹性权重分配。提出的一个有趣的观点是,在最优生成器的情况下,鉴别器不需要学习有用的特征。

为了展示自监督 GAN 如何减轻鉴别器遗忘,他们从鉴别器中提取特征,并使用它来训练逻辑回归模型,以在监督的鉴别任务中对数据进行分类。

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

上面的图表明,无条件 GAN 将无法学习用于辨别任务的有用特征,而自监督 GAN(具有辅助旋转分类任务)学习的特征在训练期间继续学习用于监督学习模型的有用特征。

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

关于图像输出的质量,上图显示了通常用于定量评估两种自监督 GAN 以及有条件和无条件 GAN 模型的图像质量的 FID 分数。这些图显示,具有自调制批量标准化(sBN)的 SS-GAN 在 ImageNet 和 CIFAR-10 上的性能与有条件 GAN 一样好,右上方的图显示了无条件 GAN 在 ImageNet 生成任务上的性能。

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

上面的图比较了使用鉴别器特征在其他流行的自我监督学习任务中训练分类模型的结果。有许多不同的方法来设置自我监督的学习任务,我发现看到这种比较非常有趣。

感谢您的阅读!这是一个非常有趣的结果,通过使用辅助的自我监督任务来探索完全无监督的生成建模,请查看论文以了解更多细节!

使用辅助旋转损耗的自监督 GANs

原文:https://towardsdatascience.com/self-supervised-gans-using-auxiliary-rotation-loss-60d8a929b556?source=collection_archive---------33-----------------------

TL;DR-自监督 GANs 结合了对抗学习和自监督学习,以弥补监督和无监督图像生成之间的差距,即有条件和无条件的 GANs。

你可以通过使用这篇准备训练 Pytorch 实现的论文来训练自己的 SS-GAN——【Github

首先,什么是甘?

GANs 是生成对抗网络的缩写,它是一个神经网络系统,其中两个神经网络(生成器或鉴别器)一起工作,玩一个极大极小游戏,以学习它们生成图像和分别尝试检测图像是真是假的任务。换句话说,鉴别器的目标是区分生成器生成的数据和我们试图建模的真实数据。Ian Goodfellow 在 2014 年提出的这种结合两种网络的方法被证明是图像生成的神奇答案。然而,训练甘是一个棘手的问题。正如在深度学习领域一直以来的那样,在训练 GAN 时添加标记数据是一种拯救,该系统现在被称为条件 GAN 或 cgan。然而,监督图像生成虽然方便,但需要大量数据。为了补救这个问题,我们可以使用半监督学习技术来自己创建一个标签。这样,我们可以在有条件的和无条件的图像生成之间架起一座桥梁。

鉴别器遗忘

接下来,我们讨论传统 GANs 中的一个问题,这篇论文的作者强调了这个问题,叫做鉴别器遗忘。下图中描述的两个场景证明了这一点:

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

左图显示,尽管任务相似,但 Cifar10 数据集上的普通 1 对 1 分类器倾向于显示大量遗忘。每次任务发生变化,准确率都会大幅下降。然而,当损失函数由自我监督辅助时,情况就不是这样了。这表明,在这样一个不断变化的环境中,该模型没有保留可概括的表示。

右图显示了 GAN 训练期间的类似效果。每 100k 次迭代,鉴别器被用于 IMAGENET 分类,并且这显示了相同的遗忘模式,这与自我监督的情况不同。

自监督 GAN

在详细介绍 SS-GAN 之前,我们先来快速了解一下什么是自我监督学习。这个想法是在一个可以定义的托词任务上训练一个模型,每个样本的标签可以根据活动来决定。该活动可以是输入中的任何变化,例如,预测输入的旋转或预测图像块的相对位置。现在讨论它的用途,作者已经将预测旋转角度的任务加入到鉴别器中。因此,随着假对真的对抗性预测,它还试图预测图像在一组{0,90,180 和 270}角度之间的倾斜。这是借鉴了文献1中提出的自我监督方法。这使得鉴别器有两个头,模型的整体功能如下图所示:

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

合作对抗训练

该模型中的生成者和鉴别者仍然在使用标准的对抗损失并辅以谱范数和梯度惩罚来对抗地进行极小极大博弈。然而,我们正试图模仿有条件的 GAN 从标签中获得的好处(换句话说就是信息)。标签帮助生成器决定生成哪种图像,而不是随机生成像素。类似的还有 SS-GAN 的努力。该生成器并不是完全有条件的,因为它总是生成“直立”的图像,这些图像被进一步旋转以供鉴别器预测。另一方面,正如作者所说

“鉴别器被训练成仅基于真实数据来检测旋转角度.”

这阻止了生成器生成易于预测旋转的图像。

总结一下,鉴别器有两个头。非旋转图像鉴别器的目标是预测真假。在旋转的实像上,预测 4 个旋转角度中的一个。

实验

他们将基于标准 resnet 的架构用于鉴别器和生成器,这些架构取自他们与 SS-GAN 进行比较的无条件 GAN。使用两个超参数来控制旋转损失的权重,一个用于真实图像,一个用于虚假图像。

为了比较样品质量,作者使用 FID。

此外,可以使用下图描述结果:

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

值得注意的重要一点是,自我监督比无条件监督提供了更好的绩效。

结论

在我看来,这项工作开辟了一条新的 gan 线,我们可以在不使用标记数据的情况下获得条件 gan 的稳定图像生成。用最先进的型号替换鉴别器有助于进一步改进。作者还提出了在半监督环境中使用少量标签进行进一步改进的想法。

参考

1 Spyros Gidaris,Praveer Singh 和 Nikos Komodakis。通过预测图像旋转的无监督表示学习。
参加 2018 年
(ICLR)国际学习代表大会。

自我监督学习的模式

原文:https://towardsdatascience.com/self-supervised-learning-78bdd989c88b?source=collection_archive---------5-----------------------

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

Photo by Kevin Gent on Unsplash

为了乐趣和利益探索自我

自我监督在空中(与会谈)。解释自我学习、无监督学习、弱监督学习、半监督学习、远程学习和完全监督学习(当然还有 RL)之间的区别变得更加困难。)尽管如此,我们还是要努力。

在上下文中,问题是将一个对象(一个单词、句子、图像、视频、音频……)编码成一个足够通用的表示(数字块),这对于解决多任务有用的(保留足够的对象特征),例如,找到一个句子的情感,将其翻译成另一种语言,在图像中定位事物,使其分辨率更高,检测正在说的文本,识别扬声器开关,等等。

鉴于图像、视频或语音的多样性,我们必须经常将与几个任务(甚至是一个任务)联系起来,如果我们遇到新的例子或新的任务,这些任务就会中断。从新的例子(标有预期输出的输入)中不断地重复学习是我们的首要策略(监督学习)。我们私下里(并且雄心勃勃地)希望这种令人厌倦的重复学习过程最终会消失,我们会学到这些物体的好的通用表示。 学一次,永远重用 。但是,所谓的无监督学习范式( only-input-no-labels) 并没有带来太多(像 GANs 和 learn-to-cluster 模型这样的轻微例外)。

进入自我监督:谢天谢地,散布在人工智能研究网络中的一种新的学习模式已经悄然出现,它有望更接近难以实现的目标。原理非常简单:为了给一个对象编码,你试着在它的部分或它(自我)的不同视图之间设置学习任务。

给定对象的一部分(输入),你能预测/生成另一部分(输出)吗?

这个原则有几种不同的味道。

  • 例如,给定一个句子上下文围绕一个单词,你能(学会)预测出遗漏的单词 (skip-grams,BERT)。
  • 或者,修改输入对象的视图 并预测发生了什么变化(旋转图像并预测旋转角度)。
  • 或者,修改输入视图,确保输出不改变

因为你只是简单地摆弄这个物体,所以这些是 免费午餐 任务——不需要外部标签

幸运的是,我们现在有了(大量)自动生成的输入输出示例,我们又回到了游戏中。继续使用你的监督学习工具包中的每一把锤子来学习一个伟大的(通用的?)表示这些例子中的对象。

通过尝试从自我输入中预测自我输出,您最终了解了对象的内在属性/语义,否则将需要大量的示例来学习。

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

自我监督损失现在已经成为沉默的英雄有一段时间了,跨多个领域的表征学习(如自动编码器单词嵌入器辅助损失、许多数据增强、… )。一个非常漂亮的滑梯在这里。现在,有了 NLP 的 ImageNet moment(ELMo,BERT 和其他人),我想他们自己已经成功了。监管光谱中缺失的空白,每个人(包括 AGI;)一直在等。

可以理解的是,围绕着更新的自我监督技巧,用更少的例子获得 SoTA,以及混合各种监督(你好 NeurIPS !).迄今为止,自监督方法大多试图将对象的组成部分联系起来,以一部分作为输入,预测另一部分。或者,通过数据增广改变对象的视图,预测相同的标签。

接下来,让我们看看这个社区在玩新锤子的时候变得多么有创造力。还有许多问题有待解决:例如,你如何比较多种不同的自我监督技巧——哪一个比其他人学得更好?你如何选择输出?例如, UDA 使用内在输出分布 D 作为标签,而不是使用显式标签作为输出——确保当输入 x 的视图改变时,D 变化最小。

另外,我很好奇谁声称他们是第一个做这件事的人:)

更新:一个有趣的 twitter 帖子讨论自我监督是否是无监督(或其他)的品牌重塑。

tldr : 自我监督学习是非监督学习的一个优雅子集,在这里你可以通过暴露对象的部分或对象的不同视图之间的关系,从数据对象中“内在地”生成输出标签。

**关于我:**我是一名独立的计算机科学研究员、工程师和演讲者,喜欢提炼复杂的技术并将其转化为可消费的产品。我在学术界、工业界和初创公司都工作过。我帮助公司理解和应对复杂、不断发展的人工智能空间,并构建基于深度学习的解决方案,以最大化投资回报。如果你喜欢这篇文章,请鼓掌并发表你的评论。你可以关注我,在这里阅读我的其他文章,在 linkedin 上找到我,或者直接给我发邮件。

PS: 如果你想找人‘监督’你(弱监督、完全监督、远程监督甚至共同监督)解决一些非常有趣的文字、视觉和言语问题,请联系 nishant@offnote.co 的我!

卖给我这个…分类器?

原文:https://towardsdatascience.com/sell-me-this-classifier-ce80f13d7e7e?source=collection_archive---------27-----------------------

您可能没有意识到,但在您的数据科学职业生涯中,您一直在不断地进行销售。当你不在你的黑色大风衣下兜售数据和算法时,你会反复尝试买入你的项目,并确立你工作的价值。

最近看了一本书,叫《向 出售的是人类 ,作者是 Daniel Pink。在这篇文章中,他发现 90%不直接参与销售的人花了大量时间做“非销售销售”。这种类型的行为包括说服或影响他人采取行动或进行交换。当我读到这里的时候,我的脑海里突然一亮。作为一名数据科学家,我在工作中的几乎每一次人际交往中都这样做。

虽然销售历来名声不好,但几乎所有与“非销售销售”相关的技能都可以帮助你改善人际关系,提高工作质量。我希望这篇文章和相关的销售技巧能够帮助您改善沟通,并促进您的数据科学事业。

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

为什么销售对数据科学家很重要?

我们甚至在获得数据科学头衔之前就开始销售。为了得到一份数据科学家的工作,你需要推销自己。你必须向未来的雇主推销你的个性、抱负、技能和背景。

随着我们在该领域的发展,我们需要销售我们创造的解决方案和我们使用的方法。我们必须得到老板、内部客户和同事的认可,才能真正对我们的工作产生影响。

如果您对管理层或总监级别的培训更感兴趣,您需要学会向您的组织推销数据科学这一概念。你必须推销你的团队正在做的项目,并解释为什么这比其他潜在的项目更能利用时间和资源。如果你试图建立你的团队,你必须向未来的员工推销你的组织和你所做的工作。

在数据科学层级的每个级别,销售技能都可以帮助我们在工作中产生更大的影响。如果我们能稍微提高我们的销售技巧,我们可能会有更多的工作机会,更酷的项目和更好的员工。

销售到底是什么?

当你提到销售时,大多数人会想到一个二手车推销员,他试图让你为一些旧车多付钱。在数据科学领域,我们的销售技能围绕倾听和展示我们创造的价值。了解我们的“客户”需要什么,并清楚地解释我们的工作将如何提供解决方案,这对我们来说非常重要。

虽然这听起来很简单,但由于数据科学的复杂性,有些人确实不理解我们提供的价值。我们必须能够为我们非常具体的目标受众将我们的工作浓缩成有用的金块。

如何提高自己的销售能力?

在对这个话题有了更多的了解后,我继续阅读其他各种销售书籍和资料。下面的清单是从这些书中摘录的:

  • 出售的是人类 由丹宁粉红
  • 大卫·霍夫菲尔德的《销售科学》
  • 柳文欢·克拉夫

如果你有兴趣深入了解这些概念,一定要读这些书。

虽然我不是销售专家,但我已经使用了这些最佳实践,并看到它们在现实世界中发挥作用。如果你想提高你的销售技巧,这里有一些小贴士可以帮助你:

倾听——虽然这可能是最明显的建议,但也是最重要的。大多数销售人员关注的是他们认为自己产品的价值。他们不一定关注客户试图解决的问题。如果你专注于理解客户的最终目标,专注于解决他们问题的产品属性,你的结果会直线上升。

让别人说出你提供的价值——当我们说了什么,我们就开始相信它。如果你在获得认同方面有困难,询问你的“客户”他们正在试图解决的问题。接下来问他们你的解决方案如何帮助解决这个问题。这个简单的模式让他们有效地推销自己。你还会学到很多关于他们如何思考和他们的价值观在哪里的知识。

我在面试新角色时成功地运用了这一技巧。到了你提问的时候,试着问问你的技能和背景如何能为团队创造价值;你可能会对你所听到的感到惊讶!

利用镜像——潜意识里,我们喜欢和自己相似的人。镜像是一种技巧,你巧妙地模仿你的“顾客”的手势和说话方式。研究表明,使用这种技巧可以促进销售,增加受欢迎程度。

重要的是,这个动作不要太明显,你不想让别人觉得你在嘲笑他们。我建议从模仿某人的姿势开始(如果他们向后靠在椅子上,也向后靠,等等)。)或者镜像几个手势和腿的位置。当你掌握它的窍门后,它将开始成为你的第二天性。我也建议采用他们用来描述他们的问题和产品的词语。除了具有镜像效应,这还表明你确实在听他们说话。

做出小承诺——大多数人认为交易是在谈话结束时达成的;这就是所谓的“关闭”。事实上,销售是在整个谈话或一系列谈话中逐步进行的。如果你想增加某人同意你的可能性,你应该从让他们做出小的承诺开始,随着时间的推移逐渐积累。这可以从让他们同意在项目的第一阶段给你反馈开始,或者让他们使用你更复杂的解决方案的一个部分。这种做法让你的“客户”对你的工作感到舒服,并让他们习惯于对你说“是”。

展示价值,珍惜你的时间 —人们希望使用需求量大的产品或服务。提醒人们你之前为他们创造的价值,或者你为他们的同事创造的价值,可以加强你当前请求的重要性。强调你过去的成功也减少了你显得贫穷的机会。需求扼杀了你的动力,并可能导致别人利用你。

另外一个减少贫困的方法是我们如何管理时间。为我们的会议设置硬性停止意味着我们的时间是宝贵的(确实如此),应该认真对待。

引发情绪反应——作为数据科学家,我们被训练根据数字做出决策。不幸的是,在我们的世界之外,大多数决定都是由情绪决定的。许多人并不真正理解数据,当有人缺乏理解时,他们通常会抵制。当与我们的“客户”交流时,也要吸引他们情感的一面,这一点很重要,因为他们天生就能理解。

我们引发情感反应的方式是通过讲故事。编织一个(真实的)叙事,讲述该项目如何帮助拯救患者生命或增加利润,同时丰富客户体验。这些概念是有形的,可以帮助你和那些对数据感到不舒服的人讲道理。

给多种选择 —当人们只有一种选择时,他们会感到被困住了。很多时候,他们会回到他们的基线,也就是什么都不做。当我们给某人多种选择时,他/她现在在这件事上有了一些实际的发言权,而不仅仅是“是”或“否”。你仍然对他们选择哪条路有很大的控制权,因为你可以让一个选项明显优于另一个。

拥有多种选择也有助于你从“我们应该这样做吗?”到“我们应该做哪个选择?”。你可以跳过可怕的是或否的问题,直接投入到承诺中。

有了这个,重要的是不要给太多的选项。人们可能会被太多的选择淹没,所以最好将你的选择保持在 2-5 之间。

在“关闭”中

虽然这些建议有助于提高听到“是”的几率,但重要的是要注意,其中一些可能会被认为是操纵。这些应该是半信半疑的,应该集中在提高清晰度上,而不是蒙人的眼睛。

作为数据科学家,我们的销售永远要有数据基础。我们的产品应该有利于我们的“客户”和我们的公司,而不是为了我们的个人利益(可能在采访之外)。

请善用这些新技能!

半结构化表格的带类型约束的神经语义分析

原文:https://towardsdatascience.com/semantic-parsing-with-type-constraints-542efb268a68?source=collection_archive---------18-----------------------

将这篇高水平的人工智能研究论文总结成字节大小的片段

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

Photo by Startaê Team on Unsplash

这是对

针对半结构化表格的具有类型约束的神经语义解析

贾扬特·克里希那穆提帕拉德普·达西格马特·加德纳在此发现:

http://ai2-website . S3 . Amazon AWS . com/publications/wikitables . pdf

两句外卖

不关注语言语义的自然语言处理(NLP ),只产生哪些单词更常用/不常用以及哪些单词可能与这些单词相关的基本统计数据;因此,如果没有类型约束,就无法实现真正的自然语言理解(NLU ),因为语言的结构(对理解意义至关重要)没有传达给模型。

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

Their technique checks all the boxes. Image from the authors’ slide deck on this paper.

为了克服这个障碍,作者实现了一种新的编码器-解码器解析器,使用约束来确保他们的 NLU 模型理解语言如何构造的逻辑,从而能够学习不同的实体如何相互关联,推动神经语义解析器的发展。

过去的方法

以前已经通过各种方法解决了这个问题,作者从这些方法中吸取了好的方面,同时避免了大部分的缺点。其中包括:

  • 形式主义,使用隐藏变量或机器翻译将数据转换成词汇化的语法形式(如 CCG )。然而,前一种方法很难训练,后一种方法不精确。
  • 实体链接将相关单词/概念连接在一起,但通常是通过固定规则或词典手动或粗略完成的。
  • 监督,涉及数据中的标记逻辑形式或被限制为问答对。贴标签证明是昂贵的/困难的;同时,问答配对的效用有限,但应用灵活。

他们的第一个新方法:类型约束解码

Krishnamurthy 等人的模型通过将编码器-解码器框架捆绑到他们的 LSTM 中来解决这些限制,以将输入单词向量转换成逻辑形式(类似于古老的 seq2seq 方法),但关键是他们还在语法上分配了类型约束。这种方法实现了前面提到的前一种方法的精度,自动对实体链接进行编码,同时还无需手动标记即可进行缩放。

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

Image from the authors’ slide deck on this paper.

他们工作的真正关键在于对解码后的语法实施类型约束:约束是参数的必要条件。使用自动分配的类型约束,他们能够仅使用以下 4 类规则来导出每个有效的逻辑形式:

Application“通过将从β到τ的函数应用于β类型的参数,重写τ类型的非终结符。我们也允许有多个参数的应用程序。

constant-“其中 constant const 的类型为τ。该规则生成与表无关的操作(如 argmax)和特定于表的实体(如 united_states),"

Lambda –"生成 lambda 表达式,其中参数的类型为α。x 代表一个新的变量名。这个规则的右边用 x 的绑定来扩展范围γ,然后生成τ类型的表达式。”

变量-“此规则在当前范围内的先前生成的 lambda 表达式中生成一个变量绑定。”

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

The parser starts off by predicting the logical form’s root type then decodes all the data into logical forms using the rules and constraints. Image from the authors’ slide deck on this paper.

基本上,最大的湖的名称是通过按照以 km 为单位的面积的类型约束从最大到最小对所有湖的列表进行排序来找到的,并且再次使用类型约束来返回名称而不是另一个数据点,例如面积。

一个更简单的例子可以是找到等式的结果:35 x 1.2 =这将通过应用以下类型约束来实现:

  • 整数类型约束将应用于 35,以使它只关注数字,而不是事实,如史密斯大厦的观景台在第 35 层。
  • 将应用乘法函数类型约束来进行数学运算,而不是使用字母“x”。
  • 浮点数类型约束将应用于 1.2,以防止数字向下舍入到整数 1。
  • 并且将所有这些放在一起将得到“35 * 1.2 = 42”的计算结果

他们的第二个贡献是:用语义解析器训练实体链接

除了训练他们的核心模型来解析问答对的语义之外,他们还训练了一个独立的 LSTM 模型来处理与主模型并行的实体链接。研究人员没有依赖于手动完成的每个单词嵌入(单词的数字表示)的冗长的实体链接,或者在手头任务的上下文之外创建的通用的、不可变的实体链接词典,而是创建了一个单独的模型来映射上下文感知的实体链接矩阵,该矩阵是随着他们的主要语义解析器学习更多而创建和更新的,从而在良性循环中加强语义解析器。

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

Image from the authors’ slide deck on this paper.

链接的创建部分基于单词的相似性,部分基于单词如何一起使用。因此,单词“Boatswain”与“Boathouse”的联系比“Cummerbund”更紧密,但如果解析描述“Cummerbund”可以存储在“boathouse”中的所有不同方式和数量的语料库,这两个单词将开始在此上下文中建立紧密的联系。这种学习术语在当前主题的上下文中如何相互关联的能力使得它们的语义解析器能够实现令人印象深刻的性能;它可以以类似于人类学习的方式建立利基领域的专业知识,不仅在当前“阅读”的内容中建立联系,还可以联系到它“阅读”的其他内容,这种影响随着“阅读”的增加而加剧。

第三:关于外延的动态规划(DPD)

将所有这些改进结合在一起,他们在每个表格/语料库/主题上使用 DPD,计算将导致答案的所有逻辑一致的约束组合。通常,如果可能的预测数量相对较少,则来自解析器的结果/进程相对容易评估,但是随着该数量的增加,以传统方式(通过网络架构处理它们)评估这些选项的难度/成本会呈指数级增加,对于复杂的主题来说很快变得不可行。

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

Image from the authors’ slide deck on this paper.

Krishnamurthy 等人通过将他们的评估限制在最可能的最佳预测的限度内来解决这个问题。以前的方法在选择它们的边际对数似然最佳预测时,要么需要使用非常高的限制。或者先前的尝试使用了强化学习技术,由于较差的信噪比,该技术不适合复杂的对象。这种新颖的方法在合理的限制范围内有效,因为他们首先使用 DPD 限制了可能的选项集,因此只有有效的选项是可能的。这使得他们能够以更低的成本获得更好的结果。

数据

由于其复杂性(深度)和广泛的信息范围(广度),研究人员选择在 WikiTableQuestions 数据集上测试他们的结果。这个数据集由维基百科上各种主题的数据表组成:具体来说是 2108 个表。此外,它包含 22033 个复杂程度不同的问题,需要语义解析器来真正理解数据以及数据之间的关系,以便更好地执行。此外,该数据集有一个基于新鲜表格的隐藏测试问题集,允许模型接受未知数据的挑战,以证明其归纳新主题的能力,并表明它不仅仅是记住问答对。

此处信息的巨大广度和深度为语义理解机器通过克服以下挑战展示能力提供了几个机会:

  • 图式映射——理解不同的词可能被用来指代相同的想法
  • 组合性——大短语通常由许多小短语组成,每个小短语都相对简单。
  • 各种操作——问题中的每一个小短语都可能是需要对数据进行的不同类型的操作,例如:过滤数据、精确定位数据、计算统计数据和比较数量

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

Complex questions like this are available to train on and to test the true capabilities of a semantic parsing model. Image from the authors’ slide deck on this paper.

以前对 QA 数据集的尝试倾向于要么强烈关注深度,而广度非常狭窄(例如"哪些州与德克萨斯州接壤,有一条主要河流?"但是只关注地理)或者他们覆盖了广泛的问题而没有深入到任何主题(例如“世界上有哪些国家说法语?”).

表演

使用类型约束解码,用语义解析器和 DPD 训练的实体链接,Krishnamurthy 等人能够在 WikiTableQuestions 数据集上超越现有技术水平,证明他们的方法除了理论之外也是实用的。由于这个数据集如此之深和庞大,这些不是简单的是/否问题;因此,45.9%是一个非常令人印象深刻的结果。

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

Comparison with the other cutting edge approaches. Image from the authors’ slide deck on this paper.

他们训练了使用单一模型和模型集合的语义解析器版本,以显示这些方法可以跨多种实现工作。总体基本上是一组不同的(有时非常不同,有时只是略有不同)模型,所有这些模型一起接受训练,每个模型做出一个预测,并比较它们的答案,以在大多数情况下得出一个更好的选择。想要更好的解释,请看这个:https://towards data science . com/two-is-better-one-ensembling-models-611 ee 4 fa 9 BD 8

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

Type constraint (left) and entity linking (right) experiments’ results. Images from the authors’ slide deck on this paper.

除了测试各种实现之外,他们还通过有选择地关闭特定模块来测试这 3 种贡献,以查看对整体性能的影响。

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

When the team dug into the reasons for the model’s errors, they seemed to be due to a variety of reasons, all with rather intuitive explanations. Image from the authors’ slide deck on this paper.

这些结果表明,所有这三种方法一起对语义分析和自然语言处理的整体技术水平产生了显著的进步。虽然还有改进的空间,但这些贡献解决了解析器在真实用例中实际实现所需的许多挑战。

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

Image from the authors’ slide deck on this paper.

Krishnamurthy 等人的代码:

[## allenai/allennlp

一个基于 PyTorch 的开源 NLP 研究库。- allenai/allennlp

github.com](https://github.com/allenai/allennlp/blob/master/allennlp/models/semantic_parsing/wikitables/wikitables_mml_semantic_parser.py)

帕拉德普·达西吉介绍他们的研究:

https://vimeo.com/238234920

演示本文结果的幻灯片:

https://nlp.stanford.edu/seminar/details/jkrishnamurthy.pdf

我期待着听到您对本文或讨论的主题的任何反馈或问题,无论是在这里还是在社交媒体上。随时联系我(只要告诉我你看到这篇文章了)→

twitter.com/theNathanielW

【linkedin.com/in/theNathanielWatkins 号

语义搜索

原文:https://towardsdatascience.com/semantic-search-73fa1177548f?source=collection_archive---------5-----------------------

关于语义、搜索和语义搜索的简短帖子

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

Photo by Kayla Farmer on Unsplash

⚠️在我的博客⚠️中读到了的原帖

语义学是语言学的一个分支,研究单词的含义、它们的符号用法,也包括它们的多重含义。

“一天早上,我射杀了一头穿着睡衣的大象。我永远也不会知道他是怎么穿上我的睡衣的。”格劳乔·马克斯

这句话在语义上是模棱两可的:不清楚作者是穿着睡衣射杀了一头大象,还是他射杀了一头大象,而大象恰好穿着睡衣。显然,在这个例子中,两者中只有一个有意义,但两种情况都是语法正确的。

“约翰和玛丽结婚了。”(对彼此?还是分开?)

约翰吻了他的妻子,萨姆也吻了。(山姆吻了约翰的妻子还是他自己?)

更多关于语言歧义的信息

词汇搜索引擎

起初,搜索引擎 (Google,Bing,DuckDuckGo,Yahoo 等。)是*词汇:*搜索引擎寻找查询词的字面匹配,而不理解查询的含义,并且仅返回包含精确查询的链接。

例如,如果用户寻找“cis lmu”,来自 lmu 大学的 cis 中心的主页匹配该查询,因为:

  • CIS 中心的主页包含这两个词
  • 主页的 url 包含这两个词
  • 该页面位于域的顶级
  • 以及由搜索引擎指定的许多其他原因

所有这些标准都很容易检查,它们本身就使这个页面成为这个查询的首选。不需要更深入地理解查询实际“意味着”什么或者主页实际“关于”什么。

语义搜索

语义搜索有意义的搜索。此“意为”可以指搜索过程的各个部分:

  • 理解查询,而不是简单地寻找文字匹配,
  • 或者以适合有意义检索的方式表示知识。

语义搜索超越了查询的“静态”字典含义,以理解搜索者在特定上下文中的意图。通过从过去的结果中学习并创建实体之间的链接,搜索引擎可以利用出现在可搜索数据库中的术语的上下文含义来生成更相关的结果。

它还允许用户提出自然语言问题,而不是让计算机理解我们的语言:“我如何开始数据科学的职业生涯?”vs .“数据科学职业步骤和技巧”。在第二种情况下,没有动词或不必要的单词,只有用户认为与搜索引擎相关的关键字。

语义搜索结果还要求将来自几个不同来源的信息汇集在一起,以令人满意地回答查询。

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

在这个例子中,主要结果是关于吉米·基梅尔和吉列尔莫关于 Maddie Zieger 的 YouTube 视频,Maddie zie ger 是“Sia 枝形吊灯音乐视频的明星”。

  • 谷歌“理解”查询“谁是 X”的结果必须是一个人的名字。
  • 请注意,“麦迪·齐格勒”和“吉列尔莫”都被突出显示,这是谷歌的一个不正确的结果。另一方面,“吉米”没有突出显示。可能是因为 Guillermo 比 Jimmy 更接近句子中的动词 dance。对于更高级的读者来说,你可能会注意到第三行中的代词“他”指的是吉米,两个男人属于同一类别,因此同样接近动词“舞蹈”,但成功地将“他”与“吉米”联系起来是另一个语言学问题,称为共指消解,在本例中没有得到很好的解决。(维基百科链接, 斯坦福 NLP 小组的实现)
  • “吊灯视频中的舞者”和“吊灯音乐视频中的明星…谁是一个非凡的舞者”没有字面上的匹配。这些词没有出现在彼此旁边,但搜索引擎将“音乐视频中的明星”和“舞者”联系起来。

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

在这个例子中,结果不仅正确显示,而且有一个用户友好的部分,有一张图片,以及其他类似的建筑和它们的高度。

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

显示的例子是谷歌的结果。即使近年来其他搜索引擎已经实现了语义搜索功能,谷歌是第一个这样做的,2013 年更新了蜂鸟,也是迄今为止最准确的一个。

奖金:怎么用?

谷歌在 2012 年包括了一个知识图,一个本体,以图形格式表示人、地点和事物之间的语义关系。这些关系可以是同义词、同音异义词等。随着 2013 年蜂鸟的更新,谷歌拥有了一个巨大的知识图表,其中收集了大约5.7 亿个概念和关系

当一个新的查询到达系统时,首先通过使用自然语言处理(NLP)算法,如词性标注检索、命名实体识别、纠错、转换为单词嵌入、搜索同义词等,将查询分解成根术语。

然后,将这些术语匹配到本体中,从庞大的图中获得最接近的术语。这些术语或链接与输入更相关。好的系统使本体独立于语言,这样西班牙语的查询可以匹配英语的本体术语。

其他链接

方法的综述和分类,](https://www.semanticscholar.org/paper/A-survey-and-classification-of-semantic-search-Mangold/344885b612ddbe5ede930571bd433f195245147d)斯图加特大学,2007

Github 工程,走向自然语言语义码搜索, 2018

Hamel Husain,如何用深度学习为任意对象创建自然语言语义搜索,2018

神经网络时代的语义分割

原文:https://towardsdatascience.com/semantic-segmentation-in-the-era-of-neural-networks-703bf93e5ee1?source=collection_archive---------19-----------------------

图像分割是计算机视觉和目标识别与检测的基本任务之一。在语义分割中,目标是将图像的每个像素分类到特定的类别。与图像分类的不同之处在于,我们不是将整个图像分类到一个类中,而是对每个单独的像素进行分类。因此,我们有一组预定义的类别,我们希望在图像的每个像素中分配一个标签。我们根据图像中不同物体的上下文来完成这项任务。

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

我们可以在上图中看到一个真实的例子。图像的每个像素都被分配了一个特定的标签,并用不同的颜色表示。红色代表人,蓝色代表车,绿色代表树等等。

值得一提的是,语义分段不同于实例分段,在实例分段中,我们为同一类的实例区分标签。在那种情况下,人们会有不同的肤色。

但是我们在乎吗?(对了,如果你不知道 frak 是什么意思,就去狂看《太空堡垒卡拉狄加》吧。太牛逼了)。为什么我们需要这种高细节的处理?

事实证明,语义分割有许多不同的应用。你可以从上图中猜出第一种。自动驾驶汽车。自动驾驶汽车需要知道自己看到了什么。他们需要知道一切。每个该死的像素。另一个普遍的应用当然是在机器人领域(工业或非工业)。我不能列举更多。地理传感,农业,医学图像诊断,面部分割,时尚。

如果你被说服了,让我们来看看如何完成这个任务。这并不难理解。

深度学习

深度神经网络彻底改变了计算机视觉,尤其是图像分类,这不是什么秘密。从 2012 年到今天,它大幅超越了它的前辈。计算机比人类更擅长图像分类,这是现在的事实。不可避免地,我们也使用相同的技术进行语义分割。他们成功了吗?

当然,他们做到了。卷积神经网络现在是这类问题的行业标准。我不会用这个领域中所有架构的历史倒叙来烦你。相反,我将向你展示 2019 年出现的最先进的技术。

但首先让我们更具体地定义我们的问题:

  • 图像的每个像素必须被分配到一个类别,并相应地着色
  • 输入和输出图像应该具有完全相同的大小
  • 输入中的每个像素必须与输出中完全相同位置的像素相对应
  • 我们需要像素级的精度来区分不同的类。

考虑到这些因素,我们来看一下架构:

全卷积网络(FCN)

全卷积网络只包括卷积层和汇集层,不需要完全连接。最初的方法是使用一堆相同大小的卷积层将输入图像映射到输出图像。

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

Stanford University School of Engineering

正如你可能想象的那样,它产生了相当好的结果,但是它的计算量非常大。问题是,他们不能使用任何缩减像素采样或合并图层,因为这将搞乱实例的位置。为了保持图像分辨率,他们需要添加许多层来学习低级和高级特征。因此,它最终变得非常低效。

为了解决这个问题,他们提出了一种编码器-解码器架构。编码器是一个典型的卷积网络,如 AlexNet 或 ResNet,解码器由去卷积(虽然我不喜欢这个术语)和上采样层组成。下采样步骤的目标是捕获语义/上下文信息,而上采样的目标是恢复空间信息

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

Stanford University School of Engineering

这样,他们设法大大降低了时间和空间的复杂性。而且,最终的结果。因为编码器降低了图像分辨率,所以分割缺少定义明确的边缘,这意味着图像之间的边界没有明确定义。

拯救:跳过连接。

跳过连接绕过层,将信息原封不动地传递给下一层。在我们的例子中,我们使用它们将信息从编码器的早期层传递到解码器,绕过下采样层。事实上,这有助于改善分割的细节,使形状和边缘更加精确。

优信网

基于全编解码和跳连接概念,全卷积网络的思想扩展到了 U-net 。U-net 通过增加解码器的大小来匹配编码器,从而在 FCN 中引入对称性,并使用级联来取代跳过连接中的求和操作。

由于对称性,我们可以将更多的信息从下采样层传输到上采样层(因为现在有更多的要素地图),从而提高最终输出的分辨率。

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

https://datascience.stackexchange.com

U-nets 最初是为生物医学图像分割而开发的,但它们也用于各种不同的应用中,如添加完全连接的层或残差块。

为了完全掌握 U-net 的思想,让我们写一些代码来实现它是多么简单。我们将使用 python 和 keras 框架来进一步简化事情。

你认为我在开玩笑吗?就是这样。堆叠在一起的一堆卷积层、池层和上采样层,以及实现跳过连接的一些连接。非常简单还是什么?

当然,我们仍然需要做大量的工作,比如预处理我们的输入数据,扩充它们,更重要的是找到它们。我的意思是,为我们的训练收集地面图像根本不是一件容易的事情。试想,对于每一幅输入图像,我们都希望它的分割能够找到它们之间的误差。我们如何构建地面真实分段?用手吗?那是做这件事的一种可能的方法。通过一个精心制作的剧本?也许吧。有一点是肯定的。这并不容易。

最后,我想提一下,还有其他非常聪明的方法来执行语义分割,但大多数都是建立在 FCN 和 U-Net 之上的。其中一些是:

语义分割是一个非常活跃的研究领域,因为它在现实世界的应用中非常重要和紧急,所以我们期待在未来几年看到更多的论文。计算机视觉和深度学习的结合非常令人兴奋,并在复杂的任务中给了我们巨大的进步。你认为如果没有深度学习,特斯拉自动驾驶汽车今天已经行驶了 12 亿英里吗?我个人不这么认为。让我们看看未来会怎样…

如果你有任何想法、评论、问题或者只是想了解我的最新内容,请随时在LinkedinTwitterinsta gramGithub

原载于 2019 年 1 月 25 日sergioskar . github . io**

基于深度学习的航空图像语义分割

原文:https://towardsdatascience.com/semantic-segmentation-of-aerial-images-using-deep-learning-90fdf4ad780?source=collection_archive---------11-----------------------

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

source: matheen faiz on unsplash.

在计算机视觉和图像处理中,逐像素图像分割是一项具有挑战性和高要求的任务。这篇博客是关于从航空(卫星/无人机)图像中分割建筑物的。高分辨率遥感数据的提供为有趣的应用开辟了可能性,例如更详细地按像素对单个物体进行分类。通过使用卷积神经网络(CNN ),图像的分割和分类变得非常有效和智能。在本文中,我们使用了非常高分辨率和尺寸的图像,因此图像被裁剪并减小了尺寸,以便在具有正常规格的中等水平的计算机中容易地进行处理。该模型受 UNET 模型的启发,后者广泛用于输出与输入格式相同的网络。该模型通常用于医学科学领域,以检测医学图像中的异常,如发现骨折或肿瘤。微调或迁移学习也用于提高模型的准确性。微调超参数可以有助于改进模型的学习,因为使用了先前训练的模型的编码器。为了针对不同的挑战情况训练我们的模型,以便我们的模型可以产生更准确的结果,我们使用了数据扩充,即拍摄一幅图像并对其进行一些更改,如改变色调、饱和度、亮度值、缩放和改变角度、旋转等,以提供广泛的训练情况,这在训练数据较少或不足的情况下也有帮助。总的来说,经过充分的数据训练后,该模型能够得到高精度的结果。

什么是语义切分??它的实际应用有哪些??

对无人机图像进行语义分割以对不同属性进行分类是一项非常具有挑战性的工作,因为差异非常大,你不能指望这些地方是相同的。手动分割这些图像以用于不同的应用是一项挑战,也是一个永无止境的过程。因此,需要自动化和智能系统来自动完成我们的工作。所以,剧中的神经网络来了。近年来,神经网络和深度学习在不同领域的应用达到了高峰,解决这一挑战性问题的有趣和智能的方法吸引了不同领域的人们的注意。因此,由于数据的不规则性,通过应用神经网络的概念来解决这个问题是一个有点挑战性的任务。

卷积神经网络(CNN),是处理图像的深度学习概念。在正常的神经网络操作中,每个节点都是相互连接的,创建了一个复杂的网络,但如果我们在图像中应用相同的东西(它本身就是一个大矩阵),事情就不会那么好了,因为每个像素在那里充当一个节点,当这几百万个像素与另一层连接时,就会有几百万或几十亿个连接,所以在那种情况下计算太复杂了,所以为图像创建了一种新的方式,我们称之为卷积神经网络。这里的概念基本上是我们卷积图像到另一层。

该计划可以在各种商业目的中实施,例如:无人机是一种新的广泛使用的技术,具有广泛的实施范围,如检查任何区域或交付产品,因此该计划有助于定位准确的位置并提高准确性。通过自动检测建筑物,我们可以使用这些数据来预测人口密度或计算住宅区、商业区或无人居住区的面积。在线地图是目前广泛使用的技术,通过自动检测建筑物等属性,可以很容易地在地图上显示特定区域,这可以有多种应用,如标记区域或使用地图创建建筑物的三维模型。这个项目的另一个主要应用是它在灾害管理中非常有用,例如,如果一个地方遭受了地震或洪水等灾害,那么可以使用飞行器来救援或运送食物,如果建筑物在更短的时间内以高精度定位,就可以做到这一点。此外,这在实际生活中还有许多其他的应用,也可以有益于社会和商业目的。

使用神经网络来创建一些自动化的工作,改变了传统的和缓慢的做事方式,从而产生高精度的结果,这既节省时间又节省成本,而无需任何忙乱的工作;由于航空图像分割是一个重要的挑战,其实际应用是巨大的,自动化是一个很好的解决方案。这里用于语义分割的 UNET 模型受到医学领域的启发。UNET 的真正应用是用于医学图像,即当与正常图像的大数据集比较时,检测像肿瘤或骨折等异常。由于这些敏感的工作需要非常高的精度,所以 CNN 的层被做得更深以学习更重要的特征。这一点启发我们将该模型用于航空图像,因为建筑物之间的差异是完全独特的,并且有许多参数和特征要学习,如果将其用于实际应用,高精度也是必要的。

使用的基本概念/技术

神经网络- 人工神经网络(ANN)是一种信息处理范式,其灵感来自生物神经系统(如大脑)处理信息的方式。这个范例的关键要素是信息处理系统的新颖结构。它由大量高度互联的处理元件(神经元)组成,这些元件协调工作以解决特定的问题。人工神经网络像人一样,通过例子来学习。通过学习过程,人工神经网络被配置用于特定的应用,例如模式识别或数据分类。生物系统中的学习涉及对神经元之间存在的突触连接的调整。

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

Fig. A Simple Neural Network Architecture.

卷积神经网络- U-Net 架构由捕获上下文的收缩路径和实现精确定位的对称扩展路径组成。收缩路径遵循卷积网络的典型架构,具有交替的卷积和汇集操作,并逐渐向下采样特征地图,同时增加每层的特征地图的数量。扩展路径中的每一步都包括特征图的上采样,然后是卷积。

U-Net 能够从相对较小的训练集中学习。在大多数情况下,用于图像分割的数据集最多由数千个图像组成,因为手动准备掩模是非常昂贵的过程。通常,U-Net 是从随机初始化的权重开始从头开始训练的。众所周知,没有过拟合的训练网络的数据集应该是相对较大的,数百万张图像。在 Image-net 数据集上训练的网络被广泛用作其他任务中网络权重的初始化源。以这种方式,可以对网络的非预训练的几层(有时仅对最后一层)进行学习过程,以考虑数据集的特征。

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

Fig. A Simple Convolutional Network Structure.

UNET 模型——U-Net 架构由一个捕捉上下文的收缩路径和一个支持精确定位的对称扩展路径组成。收缩路径遵循卷积网络的典型架构,具有交替的卷积和汇集操作,并逐渐向下采样特征地图,同时增加每层的特征地图的数量。扩展路径中的每一步都包括特征图的上采样,然后是卷积。

UNET 能够从相对较小的训练集中学习。在大多数情况下,用于图像分割的数据集最多由数千个图像组成,因为手动准备掩模是非常昂贵的过程。通常,U-Net 是从随机初始化的权重开始从头开始训练的。众所周知,没有过拟合的训练网络的数据集应该是相对较大的,数百万张图像。在 Image-net 数据集上训练的网络被广泛用作其他任务中网络权重的初始化源。以这种方式,可以对网络的非预训练的几层(有时仅对最后一层)进行学习过程,以考虑数据集的特征。

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

Fig. A Simple U-NET Structure.

使用 VGG-16 编码器进行微调(在 image-net 上进行了预训练) -作为我们 U-Net 网络中的编码器,我们使用了相对简单的 VGG 系列 CNN,由 11 个连续层组成,称为 VGG16。VGG16 包含七个卷积层,每个卷积层后面都有一个 ReLU 激活函数,以及五个最大轮询操作,每个操作将特征映射减少 2。所有卷积层都有 3×3 个内核。第一个卷积层产生 64 个信道,然后,随着网络的加深,在每次最大池化操作之后,信道的数量加倍,直到它达到 512。在随后的层上,通道的数量不变。为了构建编码器,我们删除了完全连接的层,并用 512 个信道的单个卷积层代替,该卷积层充当网络的瓶颈中心部分,将编码器与解码器分开。

为了构造解码器,我们使用转置卷积层,它将特征图的大小加倍,同时将通道的数量减少一半。并且转置卷积的输出然后与解码器的相应部分的输出连接。通过卷积运算来处理所得到的特征图,以保持通道的数量与对称编码器项中的相同。这个上采样过程重复 5 次,以与 5 个最大池配对。从技术上讲,完全连接的层可以接受任何大小的输入,但因为我们有 5 个最大池层,每个层对图像进行两次下采样,所以只有边长可被 32 整除的图像可以用作当前网络实施的输入。

提议的模型/工具

数据集 -我将我的模型应用于 Iniria 航空影像标注数据集。该数据集由 180 幅欧洲和美国城市居民区的航空影像组成,并被标记为建筑物和非建筑物类别。数据集中的每幅图像都是 RGB 格式,分辨率为 5000×5000 像素,每个像素对应一个 30 厘米×30 厘米的地球表面。但是我们不能把这么大尺寸的图像直接放到我们的代码中,所以我们需要截取这些图像。每个裁剪图像的分辨率必须能被 32 整除。因此,我对这些图像进行了 512x512 分辨率的裁剪,然后将其用于我的算法中。首先,我尝试使用双线性插值来调整图像的大小,但这种技术未能保留图像的重要细节,所以我只是正常地裁剪它。从总数据集来看,80%的图像作为测试数据,其余 20%作为验证集。

平台和软件要求-

Jupyter Notebook 中的 Python 3.5 用于编码目的(Anaconda 环境)。

  • Keras 与 Tensorflow(后端)用于开发代码。

图像增强和图像数据生成器——图像增强通过不同的处理方式或多种处理方式的组合,如随机旋转、平移、剪切和翻转等,人工生成训练图像。在 Keras 中,有一个名为图像数据生成器的预定义功能,专门用于此目的。我旋转它,放大我的数据集的随机图像。这有助于创建一个模型,更智能地识别不同情况下的建筑物。并且它还增加了数据中的图像数量,这与结果的良好预测成正比。

带有预训练 vgg16 编码器的 UNET 模型 -我使用预训练的权重来微调我的模型。预训练模型在不同于手头任务的任务上被训练,但是提供了非常有用的起点,因为在旧任务上训练时学到的特征对于新任务是有用的。我已经采取了 vgg16 的编码器部分,并把它的权重是“预先训练的图像网络”使用相同的名称。然后,我根据编码层的结构创建了解码层,通过相应地对其进行上采样,并将这些层“连接”到它们各自的编码层。然后我已经把激活函数取为“亚当”,损耗取为“二元交叉熵”。

迭代——迭代/历元数我取 100。并且相应地使用等于测试图像除以所取批量的 step_per_epoch。这同样适用于验证集。

实施情况和结果

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

raw image(left)…………………………………………………………………………………… processed image(right)

优点和缺点

优点-

这是一种非常有效和简单的技术,可以获得高精度的结果。

这是一项不断改进的最新技术,会定期更新,以便我们将来拥有更好的模型。

您可以在很少的数据中获得很高的准确性。

  • 它易于学习和实施

缺点-

它需要非常高的计算能力,这使得它是一个有点昂贵的过程。

高端 GPU(图形处理单元)是先决条件,否则将花费太多时间进行训练。

某些标记图像的边界部分有时不太清晰,但这可以通过使用大型数据集或应用 CRF(条件随机场)来解决。

超参数调整是一个耗时的过程。

结论

因此,我的结论是,通过使用 UNET,预先训练的 VGG-16 作为编码器,我们可以用非常有限的数据集获得高精度。我只拍摄了 200 张图像,经过训练,准确率达到了 98.5%。我还尝试了不同数量的数据来检查结果,如 2000 张图像,6000 张图像,结果令人满意。由于它的学习与数据的数量成正比,所以提供大数据有助于获得智能学习和更好的结果。我还应用了图像增强,这也有助于通过提高训练数据集的质量来获得更好的结果。因此,总的来说,这是一种非常有效的图像分割技术,用于提取航空图像中的建筑物等特征。

语义分割—流行的架构

原文:https://towardsdatascience.com/semantic-segmentation-popular-architectures-dff0a75f39d0?source=collection_archive---------2-----------------------

用数据做很酷的事情!

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

Semantic Segmentation

什么是语义切分?

语义分割的任务是将图像中的每个像素分类,如下图所示。在这里你可以看到所有的人都是红色的,道路是紫色的,车辆是蓝色的,街道标志是黄色的,等等。

语义分割不同于实例分割,实例分割是同一类的不同对象将具有不同的标签,如在 person1、person2 中,因此具有不同的颜色。下图非常清晰地说明了实例分割和语义分割的区别。

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

Different tasks in computer vision

一个重要的问题可能是,为什么我们需要这种逐像素理解像素位置的粒度?

我想到的一些例子有:

I)自动驾驶汽车——可能需要知道另一辆汽车在路上的确切位置,或者过马路的人的位置

ii)机器人系统——如果机器人知道两个部件的确切位置,那么它们将会表现得更好

iii)损坏检测——在这种情况下,了解损坏的确切程度可能很重要

面向语义分割的深度学习模型架构

现在让我们来讨论 3 种进行语义分割的模型架构。

1。【FCN】

FCN 是一种流行的语义分割算法。该模型使用各种卷积块和最大池层,首先将图像解压缩到其原始大小的 1/32。然后,它在这个粒度级别上进行分类预测。最后,它使用采样和反卷积层来调整图像的大小到原始尺寸。

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

Fully Convolutional Network

这些模型通常没有任何完全连接的层。下采样步骤的目标是捕获语义/上下文信息,而上采样的目标是恢复空间信息。图像大小也没有限制。最终图像与原始图像大小相同。为了完全恢复下采样中丢失的细粒度空间信息,使用了跳过连接。跳过连接是至少绕过一个层的连接。这里,它用于将信息从下采样步骤传递到上采样步骤。合并不同分辨率级别的要素有助于将上下文信息与空间信息结合起来。

我训练了一个 FCN 来为自动驾驶汽车执行语义分割或道路与非道路像素。

2。U-Net

U-Net 架构建立在完全卷积网络(FCN)的基础上,并经过修改,在医学成像中能够产生更好的分割效果。

与 FCN-8 相比,两个主要区别是:

(1)U-网是对称的,并且

(2)下采样路径和上采样路径之间的跳跃连接应用串联运算符而不是求和。

这些跳跃连接旨在向上采样时向全局信息提供局部信息。由于其对称性,网络在上采样路径中具有大量特征图,这允许传递信息。B

U 形网因其对称的形状而得名,不同于其他 FCN 变体。

U-Net 架构分为 3 个部分:

1:收缩/下采样路径
2:瓶颈
3:扩展/上采样路径

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

U-net model

我已经实现了用于烟雾分割的 U-net。U-net 的一个主要优点是运行速度比 FCN 或 Mask RCNN 快得多。

3。屏蔽 RCNN

先来温柔的介绍一下 Mask RCNN。

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

Mask RCNN Model

更快的 RCNN 是一个非常好的算法,用于物体检测。更快的 R-CNN 由两个阶段组成。第一阶段,称为区域提议网络(RPN),提议候选对象包围盒。第二阶段本质上是快速 R-CNN,使用 RoIPool 从每个候选框中提取特征,并执行分类和包围盒回归。这两个阶段所使用的特征可以被共享以用于更快的推断。

屏蔽 R-CNN 在概念上很简单:更快的 R-CNN 对每个候选对象有两个输出,一个类标签和一个边界框偏移量;为此,我们添加了第三个分支,输出对象遮罩—这是一个二进制遮罩,指示对象在边界框中的像素位置。但是额外的遮罩输出不同于类和框输出,需要提取对象的更精细的空间布局。为此,RCNN 使用全卷积网络(FCN)。

简而言之,我们可以说 Mask RCNN 将两种网络——更快的 RCNN 和 FCN——结合在一个大型架构中。模型的损失函数是进行分类、生成包围盒和生成掩模的总损失。

掩模 RCNN 有几个额外的改进,使它比 FCN 更准确。你可以在他们的论文中读到更多关于他们的内容。

我已经使用 Keras Matterport github 和 Tensorflow 对象检测训练了自定义掩膜 RCNN 模型。要学习如何自己制作一个面具 RCNN,请跟随车损检测博客的教程。

我有自己的深度学习咨询公司,喜欢研究有趣的问题。我已经帮助许多初创公司部署了基于人工智能的创新解决方案。请到 http://deeplearninganalytics.org/来看看我们吧。

你也可以在 https://medium.com/@priya.dwivedi 的看到我的其他作品

如果你有一个我们可以合作的项目,请通过我的网站或 info@deeplearninganalytics.org 联系我

参考资料:

更多关于 FCN 的信息

关于优信网的更多信息

使用深度可分离残差神经网络的语义分割

原文:https://towardsdatascience.com/semantic-segmentation-using-deep-separable-residual-neural-networks-ab96184f291f?source=collection_archive---------24-----------------------

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

Semantic segmentation using Google deep-lab v3

在这篇博客中,我们将看到如何使用深度可分离残差神经网络来执行语义分割。使用可分离的卷积神经网络代替传统的 2D 卷积也被阐明。

数据集描述

对于图像分割任务,我们将使用由 Divam Gupta 准备的示例数据。分割数据可从- 驱动器获得。总共有 12 个分割类和总共 367 个图像及其相应的注释。

数据的可视化

使用下面用 python 3 编写的代码块可以很容易地将数据可视化。

下面提到的代码代表下载数据的目录。

dir_data = “dataset1/”
dir_seg = dir_data + “/annotations_prepped_train/”
dir_img = dir_data + “/images_prepped_train/”

可视化部分如下。

import cv2, os
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns## seaborn has white grid by default so I will get rid of this.
sns.set_style(“whitegrid”, {‘axes.grid’ : False})ldseg = np.array(os.listdir(dir_seg))
## pick the first image file
fnm = ldseg[300]
print(fnm)## read in the original image and segmentation labels
seg = cv2.imread(dir_seg + fnm ) # (360, 480, 3)
img_is = cv2.imread(dir_img + fnm )
print(“seg.shape={}, img_is.shape={}”.format(seg.shape,img_is.shape))## Check the number of labels
mi, ma = np.min(seg), np.max(seg)
n_classes = ma — mi + 1
print(“minimum seg = {}, maximum seg = {}, Total number of segmentation classes = {}”.format(mi,ma, n_classes))fig = plt.figure(figsize=(5,5))
ax = fig.add_subplot(1,1,1)
ax.imshow(img_is)
ax.set_title(“original image”)
plt.show()fig = plt.figure(figsize=(15,10))
for k in range(mi,ma+1):
 ax = fig.add_subplot(3,n_classes/3,k+1)
 ax.imshow((seg == k)*1.0)
 ax.set_title(“label = {}”.format(k))plt.show()

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

The visualization output consisting of 12 classes of annotations for a single image.

数据预处理

数据预处理步骤仅包括将图像的尺寸调整到(224,224)的形状。这是用于 ResNet -50 网络的常规形状,因此也用于我们的可分离残差神经网络。

调整大小的图像的可视化。

import randomdef give_color_to_seg_img(seg,n_classes):
 ‘’’
 seg : (input_width,input_height,3)
 ‘’’

 if len(seg.shape)==3:
 seg = seg[:,:,0]
 seg_img = np.zeros( (seg.shape[0],seg.shape[1],3) ).astype(‘float’)
 colors = sns.color_palette(“hls”, n_classes)

 for c in range(n_classes):
 segc = (seg == c)
 seg_img[:,:,0] += (segc*( colors[c][0] ))
 seg_img[:,:,1] += (segc*( colors[c][1] ))
 seg_img[:,:,2] += (segc*( colors[c][2] ))return(seg_img)input_height , input_width = 224 , 224
output_height , output_width = 224 , 224ldseg = np.array(os.listdir(dir_seg))
for fnm in ldseg[np.random.choice(len(ldseg),3,replace=False)]:
 fnm = fnm.split(“.”)[0]
 seg = cv2.imread(dir_seg + fnm + “.png”) # (360, 480, 3)
 img_is = cv2.imread(dir_img + fnm + “.png”)
 seg_img = give_color_to_seg_img(seg,n_classes)fig = plt.figure(figsize=(20,40))
 ax = fig.add_subplot(1,4,1)
 ax.imshow(seg_img)

 ax = fig.add_subplot(1,4,2)
 ax.imshow(img_is/255.0)
 ax.set_title(“original image {}”.format(img_is.shape[:2]))

 ax = fig.add_subplot(1,4,3)
 ax.imshow(cv2.resize(seg_img,(input_height , input_width)))

 ax = fig.add_subplot(1,4,4)
 ax.imshow(cv2.resize(img_is,(output_height , output_width))/255.0)
 ax.set_title(“resized to {}”.format((output_height , output_width)))
 plt.show()

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

The resized images.

从上面的图片中我们可以看到,调整图片的大小确实改变了图片的长宽比,但是对文件的注释图片没有太大的影响。

现在,让所有的图像调整到(224,224)的大小。下面的代码可以用来做这件事。

def getImageArr( path , width , height ):
 img = cv2.imread(path, 1)
 img = np.float32(cv2.resize(img, ( width , height ))) / 127.5–1
 img1 = cv2.cvtColor(img,cv2.COLOR_BGR2LAB)
 img = cv2.merge((img,img1))
 #print(img.shape)
 return imgdef getSegmentationArr( path , nClasses , width , height ):seg_labels = np.zeros(( height , width , nClasses ))
 img = cv2.imread(path, 1)
 img = cv2.resize(img, ( width , height ))
 img = img[:, : , 0]for c in range(nClasses):
 seg_labels[: , : , c ] = (img == c ).astype(int)
 ##seg_labels = np.reshape(seg_labels, ( width*height,nClasses ))
 return seg_labelsimages = os.listdir(dir_img)
images.sort()
segmentations = os.listdir(dir_seg)
segmentations.sort()

X = []
Y = []
for im , seg in zip(images,segmentations) :
 X.append( getImageArr(dir_img + im , input_width , input_height ) )
 Y.append( getSegmentationArr( dir_seg + seg , n_classes , output_width , output_height ) )X, Y = np.array(X) , np.array(Y)
print(X.shape,Y.shape)

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

The data and the label shape.

模型开发

该模型是一个深度可分离的残差神经网络。用可分离卷积范式代替传统的 2D 卷积运算,降低了模型的参数复杂度。

传统的卷积方法使用基于梯度的学习,因此消失梯度和精度下降是卷积范例的两个主要问题,卷积范例指出,随着参数复杂性的增加,由于模型损失的增加,模型的精度降低。

残余建筑

残差架构类似于 ResNet-50 模型,其避免了基于梯度的学习,但是使得残差学习范式能够通过模型获得最佳结果。所提出的残差模型具有 4 个残差块,其中每个残差块依次具有 3 个可分离卷积层以及与单个可分离卷积方法的快捷连接。

剩余网络定义如下。

def residual_block(mod_, f_in, f_out, strides_ = (1,1), use_shortcut_ = False): 
 shortcut_ = mod_

 k_ = (3,3)

 mod_ = SeparableConv2D(f_in, kernel_size=k_, strides=(1,1), padding = “same”)(mod_)
 mod_ = BatchNormalization()(mod_)
 mod_ = ELU()(mod_)

 mod_ = SeparableConv2D(f_in, kernel_size=k_, strides=strides_, padding = “same”)(mod_)
 mod_ = BatchNormalization()(mod_)
 mod_ = ELU()(mod_)

 mod_ = SeparableConv2D(f_out, kernel_size=k_, strides=(1,1), padding = “same”)(mod_)
 mod_ = BatchNormalization()(mod_)
 mod_ = ELU()(mod_)

 if use_shortcut_ == True or strides_ != (1,1):
 shortcut_ = SeparableConv2D(f_out, kernel_size=k_, strides=strides_, padding = “same”)(shortcut_)
 shortcut_ = BatchNormalization()(shortcut_)

 mod_ = Add()([shortcut_, mod_])
 mod_ = ReLU()(mod_)

 return mod_

剩余网络可以图示如下。

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

Residual block of our proposed network.

上采样反卷积层

上采样层将低分辨率图像提高到高分辨率。有各种各样的上采样方法。所提出的方法将转置卷积层用于上采样,这可以被最好地描述如下。该方法简单地反转卷积的向前和向后传递,并在 Keras 的 Conv2DTranspose 中实现。

def model_build(in_):

 IMAGE_ORDERING = “channels_last”

 k_=(3,3)

 mod_ = Conv2D(16, kernel_size=k_, strides = (1,1), padding = “same”)(in_)

 mod_ = BatchNormalization()(mod_)

 mod_ = ReLU()(mod_)

 mod_ = MaxPooling2D()(mod_)

 mod_ = residual_block(mod_, 16, 32, use_shortcut_=True)

 mod_ = MaxPooling2D()(mod_)

 mod_ = residual_block(mod_, 32, 64, use_shortcut_=True)

 mod_ = MaxPooling2D()(mod_)

 pool3 = mod_

 mod_ = residual_block(mod_, 64, 96, use_shortcut_=True)

 mod_ = MaxPooling2D()(mod_)

 pool4 = mod_

 mod_ = residual_block(mod_, 96, 128, use_shortcut_=True)

 mod_ = MaxPooling2D()(mod_)

 pool5 = mod_

 n = 2048
 nClasses = 12
 o = ( Conv2D( n , ( 7 , 7 ) , activation=’relu’ , padding=’same’, name=”conv6", data_format=IMAGE_ORDERING))(pool5)
 conv7 = ( Conv2D( n , ( 1, 1 ) , activation=’relu’ , padding=’same’, name=”conv7", data_format=IMAGE_ORDERING))(o)

 ## 4 times upsamping for pool4 layer
 conv7_4 = Conv2DTranspose( nClasses , kernel_size=(4,4) , strides=(4,4) , use_bias=False, data_format=IMAGE_ORDERING )(conv7)
 ## (None, 224, 224, 10)
 ## 2 times upsampling for pool411
 pool411 = ( Conv2D( nClasses , ( 1 , 1 ) , activation=’relu’ , padding=’same’, name=”pool4_11", data_format=IMAGE_ORDERING))(pool4)
 pool411_2 = (Conv2DTranspose( nClasses , kernel_size=(2,2) , strides=(2,2) , use_bias=False, data_format=IMAGE_ORDERING ))(pool411)

 pool311 = ( Conv2D( nClasses , ( 1 , 1) , activation=’relu’ , padding=’same’, name=”pool3_11", data_format=IMAGE_ORDERING))(pool3)

 o = Add(name=”add”)([pool411_2, pool311, conv7_4 ])
 o = Conv2DTranspose( nClasses , kernel_size=(8,8) , strides=(8,8) , use_bias=False, data_format=IMAGE_ORDERING )(o)
 o = (Activation(‘softmax’))(o)

 return o## The model input and summary##in_ = Input((224,224,3))
model_f = model_build(in_)
model = Model(input = in_, output = model_f)
model.compile(optimizer = RMSprop(), loss = "categorical_crossentropy", metrics=["accuracy"])model.summary()

通过执行上面的代码,可以绘制和可视化模型摘要。RMSprop 已经被用作具有分类交叉熵损失的优化器。

数据集的训练和测试分割。

关于训练和测试数据,数据集已经以 85:15 的比例分割。训练和测试数据没有任何重叠图像。

from sklearn.utils import shuffle
train_rate = 0.85
index_train = np.random.choice(X.shape[0],int(X.shape[0]*train_rate),replace=False)
index_test = list(set(range(X.shape[0])) — set(index_train))

X, Y = shuffle(X,Y)
X_train, y_train = X[index_train],Y[index_train]
X_test, y_test = X[index_test],Y[index_test]
print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)

模特培训

训练参数如下。

nb_epochs = 180
nb_batch = 32earlyStopping=EarlyStopping(monitor=’val_loss’, patience=10, verbose=0, mode=’auto’)lr_reduce = ReduceLROnPlateau(monitor=’val_acc’, factor=0.01, epsilon=0.0001, patience=2, verbose=1)save_path=”weights/sep_kernel3_res4_85_lab.h5"checkpoint = ModelCheckpoint(save_path, monitor=’val_acc’, verbose=1, save_best_only=True, mode=’max’)

模特培训

hist1=model.fit(X_train, y_train, epochs = nb_epochs, batch_size = nb_batch, callbacks=[checkpoint,earlyStopping,lr_reduce], validation_data=(X_test, y_test), verbose = 1)

模型评估

绘制培训损失曲线

for key in [‘loss’, ‘val_loss’]:
 plt.plot(hist1.history[key],label=key)
plt.legend()
plt.show()

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

Training Loss

并集或 IOU 的交集计算如下:

def IoU(Yi,y_predi):
 ## mean Intersection over Union
 ## Mean IoU = TP/(FN + TP + FP)IoUs = []
 Nclass = int(np.max(Yi)) + 1
 for c in range(Nclass):
 TP = np.sum( (Yi == c)&(y_predi==c) )
 FP = np.sum( (Yi != c)&(y_predi==c) )
 FN = np.sum( (Yi == c)&(y_predi != c)) 
 IoU = TP/float(TP + FP + FN)
 print(“class {:02.0f}: #TP={:6.0f}, #FP={:6.0f}, #FN={:5.0f}, IoU={:4.3f}”.format(c,TP,FP,FN,IoU))
 IoUs.append(IoU)
 mIoU = np.mean(IoUs)
 print(“_________________”)
 print(“Mean IoU: {:4.3f}”.format(mIoU))

IoU(y_testi,y_predi)

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

The classwise IOU and the mean IOU

模型性能的可视化

该模型的预测能力通过下面这段代码来可视化。

shape = (224,224)
n_classes= 10for i in range(10):
 img_is = (X_test[i] + 1)*(255.0/2)
 seg = y_predi[i]
 segtest = y_testi[i]fig = plt.figure(figsize=(10,30)) 
 ax = fig.add_subplot(1,3,1)
 ax.imshow(img_is/255.0)
 ax.set_title(“original”)

 ax = fig.add_subplot(1,3,2)
 ax.imshow(give_color_to_seg_img(seg,n_classes))
 ax.set_title(“predicted class”)

 ax = fig.add_subplot(1,3,3)
 ax.imshow(give_color_to_seg_img(segtest,n_classes))
 ax.set_title(“true class”)
 plt.show()

以下代码的输出如下。

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

The prediction ability of the model is fine but can be optimized.

语义分割:通过 TensorBoard 可视化学习进度

原文:https://towardsdatascience.com/semantic-segmentation-visualization-of-learning-progress-by-tensorboard-7272fd5b6b50?source=collection_archive---------19-----------------------

介绍

神经网络的构建和训练不是一个简单的过程,除非你使用 MNIST 数据集,这是深度学习世界中的一种“Hello world”应用程序。很容易犯错误,花几天时间去想为什么网络没有达到您期望的性能。通常,深度学习库有一些 API,允许在训练期间探索模型和模型行为。但是它们非常受限制,并且需要额外的可视化编程。在本文中,我们将使用 TensorBoard 来可视化 CNN 的训练。例如,我们将对 ISBI 挑战赛 2012 数据集使用语义分段。本文的完整代码可以在 Github 上找到。

什么是 TensorBoard?

TensorBoard 是一个工具,用于可视化张量流图、关于图形执行的量化指标以及可以帮助您了解神经网络行为的附加数据。

从软件的角度来看,TensorBoard 是一个网络服务器,它监控某个目录,并将存储在其文件中的数据显示为图形、图表、直方图、图像等。TensorFlow 程序在执行过程中向目录提供数据。服务器读取数据并将其可视化。由开发人员决定必须显示哪些数据。TensorBoard 可以绘制标量图(例如,损失、准确度的线图)、图像(例如,当前预测图像)、直方图(作为权重分布)。除此之外,TensorBoard 还可以将您的模型显示为交互式图形。

使用 TensorBoard 服务很简单:在你的程序代码中添加中间训练数据,启动 TensorBoard,你就可以监控你的模型的训练进度。

TensorBoard 预装了 TensorFlow。以下命令启动 TensorBoard 服务:

tensorboard —-logdir *logs*

其中日志是包含要监控的数据的目录的路径。

如果要在特定端口上启动 TensorBoard,可以使用端口参数:

tensorboard —-logdir *logs --port=9000*

默认情况下,TensorBoard 仅在本地主机上提供服务。参数 bind_all 允许在所有网络接口上绑定。

tensorboard —-logdir *logs --port=9000 --bind_all*

或者,您可以使用 host 参数指定主机名或 IP 地址,将 TensorBoard 暴露给特定的主机。

你的数据怎么写?

TensorFlow 提供了一组 API,用于以 TensorBoard 可以理解的格式序列化您的数据。以下是可用的序列化函数:

  • 标量 —写入单个值的历史,如损失、准确性等。
  • 图像 —写入图像的历史。
  • 直方图 —记录某个张量的数据分布历史。
  • text —写一个字符串型张量的历史。
  • 音频 —写入音频样本的历史(包含音频数据的张量)。
  • tensor_summary —写一个任意张量的历史。

每个函数都接受一个张量作为输入数据,并返回一个 protobuf 字符串,该字符串可以由一个 FileWriter 对象写入磁盘。此外,可以使用函数 mergemerge_all 将摘要合并到集合中。

如果你使用 Keras,你不必直接使用函数。Keras 提供了一个方便的 TensorBoard 回调,它将为您完成大部分工作。

TensorBoard 的一个很好的特性是可以在同一个图上显示几次运行的指标。通过这种方式,可以比较不同超参数的模型行为。你要做的只是把不同跑步的日志保存在 TensorBoard 文件夹的不同子目录下。您可以随时打开/关闭管路的可视化。

电镜图像中神经元突起的 2D 分割

在下面的例子中,我们将使用 TensorBoard 对 EM 堆叠中神经元结构分割的模型训练进行可视化( ISBI 挑战数据集)。

数据集描述

训练数据是来自连续切片透射电子显微镜(ssTEM)的一组 30 个图像。

相应的二进制标签以进出的方式提供,即白色用于分割对象的像素,黑色用于其余像素(主要对应于膜)。

换句话说,我们在一个 tiff 文件中组合了 30 个灰度图像(每个图像在一个单独的页面中),在另一个 tiff 文件中组合了 30 个黑/白蒙版。

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

A sample image and corresponded label mask from the ISBI dataset

显然,30 幅图像不足以训练一个卷积网络,因此使用了诸如旋转、移位、剪切、缩放和翻转之类的增强。

网络架构

在本文中,我们使用了一个对称变体的 U-net 卷积神经网络(https://github.com/zhixuhao/unet)。通过在原始模型中使用“相同”填充而不是“有效”来实现对称。

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

U-net neural network

上面的模型在 Keras 中实现。完整的源代码可以在 Github 资源库中找到。

Keras TensorBoard 复试

Keras 提供了一个方便的回调函数,使得 TensorBoard 的使用更加容易。

在本文中,我们将使用以下参数:

  • log_dir —保存数据的目录路径。
  • histogram_freq —权重直方图的保存频率。1-对于每个时期,2-对于每第二个时期,等等。
  • write_graph — 一个布尔标志。如果应保存模型图,则为 True。
  • 更新频率— 数据序列化的频率。可能的值:“batch”代表每一批,“epoch”代表每一个 epoch,或者是一个以样本数定义序列化频率的整数。

网络图

将参数 write_graph 设置为 True 会触发模型图形的序列化。为您的图层提供用户友好的名称非常重要,以便您可以在图表中识别它们。下图是 TensorBoard 为本文使用的 U-net 架构制作的。请注意,该图与上面的网络图非常相似。TensorBoard 的一个很好的特性是用相同的颜色给相同结构的层着色。

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

Model graph produced by TensorBoard (rotated)

标量图

参数 update_freq 控制指标序列化的频率。在本文中,除了损失之外,我们还序列化了准确度和一个自定义指标——错误分类像素的相对数量:

注意:该函数将在训练期间执行,因此我们必须使用 TensorFlow 函数来操纵张量。Numpy 函数在这里不起作用。

这是你需要为 TensorBoard 编写的序列化模型图形和度量的全部代码。注意,在示例中,TensorBoard 目录包含损失函数的名称和学习率。因为我想探索我的模型如何收敛于不同的损失函数和不同的速率,所以我将每次运行的文件输出到 log 文件夹的不同子目录中。它允许我比较同一地块上的可视化不同运行,并比较模型性能:

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

直方图和分布图

将参数 histogram_freq 设置为 1 导致权重的串行化和每个时期的网络层的激活。两个新菜单项:分布直方图出现在 TensorBoard 仪表盘中。重要的是要知道,如果我们想要可视化直方图,我们不能使用验证数据的生成器。如果你尝试这样做,TensorFlow 会抛出一个错误。

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

Distribution plots produced by TensorBoard

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

Histograms produced by TensorBoard

自定义图像的序列化

Keras 的 TensorBoard 回调提供了参数 write_images ,该参数触发网络层图像的序列化。因为语义分割有助于可视化预测结果,以获得网络表现如何的感觉。这可以通过创建自定义回调和使用 TensorFlow 图像汇总 API 来实现。让我们来看看 Keras 自定义回调的结构:

自定义回调类包含几个将在特定事件上执行的方法。为了监控训练过程的进展,我们使用 on_batch_end 方法,并为每批生成预测结果和相应标签的图像。

现在我们创建该类的一个实例,并将其添加到回调列表中。

现在—开始训练,启动 TensorBoard 并监控进度。下图显示了 TensorBoard dashboard 的屏幕截图,比较了均方误差和二元交叉熵损失函数的分割进度。

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

结论

我发现 TensorBoar 对于监控模特的训练过程非常有用。它允许用几行代码可视化中间步骤。

语义相似度分类器和基于语义相似度的句子聚类。

原文:https://towardsdatascience.com/semantic-similarity-classifier-and-clustering-sentences-based-on-semantic-similarity-a5a564e22304?source=collection_archive---------8-----------------------

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

最近,我们一直在做一些实验,通过利用预先训练的模型来聚集语义相似的消息,这样我们就可以在不使用标记数据的情况下获得一些东西。这里的任务是给定一个句子列表,我们对它们进行聚类,使得语义相似的句子在同一个聚类中,并且聚类的数量不是预先确定的。

语义相似度分类器的任务是:对给定的两个句子/消息/段落进行语义等价的分类。

第一步:通过嵌入来表示每个句子/信息/段落。对于这个任务,我们使用了 infersent,它工作得很好。

*InferSent* is a *sentence embeddings* method that provides semantic representations for English sentences. It is trained on natural language inference data and generalizes well to many different tasks.

[## Facebook 研究/推断

推断句嵌入。在 GitHub 上创建一个帐户,为 Facebook research/INF sent 开发做贡献。

github.com](https://github.com/facebookresearch/InferSent)

代码如下:

*# Load infersent model* 
model_version = 2
MODEL_PATH = "infersent_sentence_encoder/infersent**%s**.pkl" % model_version
params_model = {'bsize': 64, 'word_emb_dim': 300, 'enc_lstm_dim': 2048,
                'pool_type': 'max', 'dpout_model': 0.0, 'version': model_version}
model = InferSent(params_model)
model.load_state_dict(torch.load(MODEL_PATH))*# If infersent1 -> use GloVe embeddings. If infersent2 -> use InferSent embeddings.*
W2V_PATH = 'infersent_sentence_encoder/GloVe/glove.840B.300d.txt' **if** model_version == 1 **else** 'infersent_sentence_encoder/fastText/crawl-300d-2M.vec'
model.set_w2v_path(W2V_PATH)#load data
ds = pd.read_msgpack('./ds.mp')
sentences = ds['text']# generate infersent sentence embeddings
model.build_vocab(sentences, tokenize=**True**)
embs = model.encode(sentences, tokenize=**True**)

步骤 2:寻找语义相似的句子/信息/段落的候选

这里的想法是索引每个句子/消息/段落的表示(嵌入),并基于距离阈值为每个句子挑选 k (=10)个 NN(最近邻)候选。我们发现 nmslib 非常快速高效。

**import** **nmslib**

NTHREADS = 8
**def** create_index(a):
    index = nmslib.init(space='angulardist')
    index.addDataPointBatch(a)
    index.createIndex()
    **return** index**def** get_knns(index, vecs, k=3):
    **return** zip(*index.knnQueryBatch(vecs, k=k,num_threads=NTHREADS))nn_wvs = create_index(embs)to_frame = **lambda** x: pd.DataFrame(np.array(x)[:,1:])idxs, dists = map(to_frame, get_knns(nn_wvs, embs, k=10))catted = pd.concat([idxs.stack().to_frame('idx'), dists.stack().to_frame('dist')], axis=1).reset_index().drop('level_1',1).rename(columns={'level_0': 'v1', 'idx': 'v2'})

第三步:获得候选对在语义相似度分类器上的预测概率。(关于语义相似性分类器的细节将在以后的博客文章中介绍)

把第二步想成候选生成(侧重于召回),第三步想成侧重于精度。在所有被认为是潜在重复的候选者中,我们给每一对分配概率。

步骤 4:聚集聚类以合并聚类

基于在步骤 3 中被认为是重复的候选者,我们使用 scikit 中的凝聚聚类实现来合并聚类。在凝聚聚类中,所有观察值都从它们自己的聚类开始,并且使用指定的合并标准合并聚类,直到收敛,此时不再发生合并。

[## sk learn . cluster . agglomerate clustering-sci kit-learn 0 . 21 . 2 文档

连通性矩阵。为每个样本定义遵循给定数据结构的相邻样本。这可以…

scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.AgglomerativeClustering.html)

这在实践中工作得相当好,并且形成的集群具有良好的语义等价性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值