TowardsDataScience 博客中文翻译 2020(二百三十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

CNN 简介(第一部分):理解和组织图像数据集

原文:https://towardsdatascience.com/convolutional-neural-networks-understanding-and-organizing-your-data-set-ba3e8b4086cb?source=collection_archive---------47-----------------------

了解机器如何学习第一部分

使用 Python、Keras 和 PlaidML 或 TensorFlow 的卷积神经网络实用介绍

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

Pixabaymohamed_hassan 拍摄的照片

介绍

现代技术已经使卷积神经网络(CNN)成为一系列问题的可行解决方案,包括从识别和定位营销材料中的品牌位置到诊断肺部 CT 中的癌症等等。如果你喜欢,你甚至可以用 CNN 来分类乐高积木。尽管越来越受欢迎,但许多第一次了解 CNN 的开发人员很难超越对该主题的表面介绍。

在这一系列文章中,我将以一种易于理解和实用的方式介绍卷积神经网络:通过创建一个可以在肺部 X 射线中检测肺炎的 CNN。 *******

这四篇文章系列包括以下部分,每一部分都致力于开发过程的一个逻辑块:

第一部分:问题介绍+理解和组织你的数据集(你在这里)

第二部分:用相关扰动塑造和扩充您的数据集(即将推出)

第三部分:调整神经网络超参数(即将推出)

第四部分:训练神经网络并解释结果(即将推出)

虽然本系列讨论的是与医学成像相关的主题,但这些技术实际上可以应用于任何 2D 卷积神经网络。虽然本系列不可能涵盖为每个可能的问题实现 CNN 的每一个细微差别,但是作为读者,我们的目标是让您在完成本系列时,具备从头开始实现、排除故障和调整您自己的 2D CNN 的整体能力。我打算讨论构建神经网络的许多基本细微差别,这些差别是大多数介绍性文章或操作指南往往会忽略的。重要的时候,我会关注为什么如何,而不仅仅是如何。我也尽量避免那些会让神经网络新手感到困惑的术语。

本系列的第一篇文章将花时间介绍关于主题和底层数据集的关键概念,这些概念是本系列其余部分的基础。建议您仔细阅读第一篇文章,因为它提供了我们在第二部分开始编码时需要的大量信息。

先决条件: 本系列面向至少对 Python 有所了解并对 CNN 有所了解的读者,但您无需成为专家也能理解。你至少应该知道如何设置 Python 环境,导入 Python 库,并编写一些基本代码。

如果你是一个绝对的初学者(也就是说,不知道 CNN 是什么),我建议你在开始这个项目之前阅读这篇文章:

[## 卷积神经网络的直观解释

什么是卷积神经网络,为什么它们很重要?卷积神经网络是…

ujjwalkarn.me](https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/)

*免责声明: 这不是医疗器械,不是 FDA 许可或批准的,你不应该使用这些文章中的代码来诊断真实的患者——我不希望 FDA 给我写信!

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

这个人得了肺炎——你能看出来吗?来源:胸部 x 光图像(肺炎)

让我们(简单地)谈谈肺炎

我们不再讨论一个已经被讨论了一百万次的话题(比如臭名昭著的 MNIST 问题),而是解决一个更实质性但更容易解决的问题:检测肺炎。在开始任何项目之前,对该主题有一些领域知识是至关重要的。虽然您可以开发一个具有一些表面功能的神经网络,而无需真正理解手头的问题,但创建功能性的、生产就绪的神经网络的关键是理解问题域和环境。

肺炎是一种每年影响 300 多万人并可能危及生命的疾病,尤其是对年轻人和老年人。世界卫生组织一直将肺炎列为“全球儿童死亡的最大传染性原因”。 [ 1]肺炎通常部分通过分析胸部 X 射线图像来诊断。这种 X 射线图像是用主观的和不一致的标准来解释的,而且“在肺炎患者中,对胸部 X 射线的解释,尤其是最小的细节,完全取决于读者。” [ 2】随着现代计算能力的发展,神经网络已经变得更容易使用,也更吸引研究人员去解决这类问题。

分析 X 射线是卷积神经网络非常适合解决的一类问题:主观性和不确定性是重要因素的模式识别问题。

现在我们已经对问题域有了一些的了解,让我们开始吧。我们将在工作中增加我们的领域知识。

了解数据集

我们在本文中使用的数据集可在这里获得。[3]数据集的原始发布是这里的【4】出于好奇,数据的官方存储库是这里的。[5]

该数据集包含 5,863 幅图像,分为三大块:训练、验证和测试。每个块被进一步分成“正常”图像(没有肺炎的图像)和“肺炎”图像(被分类为患有细菌性或病毒性肺炎的图像)。数据集中的图像细分如下:

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

正常图像与肺炎图像的分布以及细菌性与病毒性肺炎的分布来源:作者提供的图像

注意肺炎与正常图像的不平衡。对于每一个正常图像,该数据集包含大约三个肺炎图像。这对于医学图像数据是典型的;因为患者每次接受 X 射线检查时都暴露在可能危险的电离辐射中,所以医生只有在怀疑有问题时才会让患者接受 X 射线检查(通常情况下,他们是对的)。当我们在项目的后期增加数据集时,我们将通过增加正常 X 射线的数量来解决这个问题。

识别图像特征和变化

下面是数据集内的两个图像示例:一个被分类为具有细菌性肺炎迹象,另一个被分类为正常。

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

包含细菌性肺炎感染肺(左)和正常肺(未感染,右)的放射照片示例。来源:胸部 x 光图像(肺炎)

虽然您可能无法确定哪张 x 光片包含肺炎,但您应该能够**在 x 光片中寻找其他差异。**它们具有不同的曝光水平、不同的对比度水平、解剖结构的不同部分在视图中居中、分辨率和尺寸不同、噪声水平不同等等。这是一个关键概念。

除了分类目标(即“肺炎”或“非肺炎”)之外,查看您的数据集和图像变化也至关重要,因为它会告诉您在生产环境中可以预期的变化种类。这种多样性表明了我们稍后需要应用的扰动的类型,以 扩充 数据集。扰动是我们对集合中的许多图像进行的轻微改变,以便使数据集更大并模拟真实世界的条件,例如添加人工噪声或稍微旋转一些图像。一般来说,数据集扩充是机器学习的一个关键方面,尤其是当您处理相对较小的数据集时,比如这个数据集。

识别数据集偏差和假设

你也应该在你的数据集中寻找偏差。在这种特殊情况下,该数据集中的所有图像都是的子图像*。这意味着数据集不适用于大部分人群:成年人!如果我没有指出这个关键的细节,你可能会认为我们在处理成人的图像。在选择或创建训练数据集时,要非常小心地理解所做的假设。那些潜在的假设应该反映你试图用你的神经网络模型解决的用例。在这种情况下,我们不能用这个数据集来训练一个神经网络模型来检测成人肺部的 x 光片中的肺炎,因为它不包含成人肺部的 x 光片!*

偏见的另一个更明显的例子是经典的“校车”识别问题。如果你正在编写一个将检测美国校车的神经网络,数据集需要包括什么?默认的假设可能类似于“它需要包括校车和城市公交车,可能还包括包租的公交车。”真正的答案是:它可能需要包括几乎所有品牌和型号的许多类型车辆的代表性样本,因为它需要明确了解什么不是校车。**始终考虑你的神经网络将分析哪些可能的图像,而不仅仅是神经网络的预期目标。**

在这种情况下,假设我们的神经网络将分析肺部 x 光片是公平的,但什么是肺部 x 光片?肺部 x 光片可能还包括哪些内容?

有许多肺部疾病,很有可能有些会表现出肺炎的迹象,但实际上是其他疾病。不要认为真实世界的数据会像“肺炎”和“非肺炎”一样枯燥无味。例如,肺不张、浸润和某些类型的肿块可能会依靠未经训练的神经网络将其识别为肺炎,只是因为它们不正常!

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

八肺病。请注意,如果没有上下文,像肺不张和浸润这样的情况可能会混淆只在分类为“肺炎”和“正常”的图像上训练的神经网络。来源:NIH 胸部 x 光数据集

假设“肺炎”和“非肺炎”数据集就足够了,可能会阻碍现实生活中的项目。学会识别和思考你的数据集假设是一项重要的技能。

考虑到我们在这里处理的数据集是有缺陷的,如果我们的目标是检测肺炎,我们将继续前进。在现实生活中,您需要识别这种困境,并在您的数据集中解决它。

标签的重要性

最后,你应该在你的数据集中寻找高质量的标签。在这个项目中,我们将假设基础数据标签是好的,但是如果您正在构建一个将投入生产的神经网络模型,坏的标签会对您的精度上限产生重大影响。例如,在这种情况下,我们正在执行二元分类,因为 x 光片要么包含肺炎* (1),要么是正常 (0)。如果其数据被用于数据集中的医生没有验证他们对这些患者的诊断(例如,用血液测试、痰测试等再次检查他们的诊断)。),那么我们可能有潜在的标签问题。也有可能是医生诊断病人的时间太早,以致于痰检呈阳性,但是肺部 x 光检查并没有显示出肺炎的迹象,仍然被标记为阳性。这可能会影响训练。理解问题域将引导你寻找标签的问题。如果你不了解问题域,找一个了解的人来帮助你建立数据集。*

在这种情况下,我们将(可能没有足够的理由)假设标签是好的。您可以阅读与数据集相关的出版物,以了解更多关于其标注过程的信息(链接在本节的顶部),并自行决定这一假设是否合理。

注:也可以使用更多的海量数据集,如美国国家卫生研究院的 胸部 X 射线数据集 ,它包含 112,000 多张 X 射线,代表许多不同的肺部疾病,但对于本简介,我们应该使用更易于管理的大小和范围的数据集。训练和操作一个巨大的数据集对于入门来说太复杂了,而且由于需要的处理能力,可能需要很长时间来调整和训练。

组织您的数据集

在组织你的数据集时没有硬性的规则——这取决于个人偏好。但是,有些事情您可能需要考虑:

  1. 在扩充和训练神经网络模型时,您打算如何读取数据集?

这一点很重要,因为如果您的数据以一种有助于您以后如何读取和使用数据的方式进行组织,您将最终编写更少的代码,并最终获得更干净的解决方案。例如,如果您打算将 Keras 的内置image _ dataset _ from _ directory()方法与 ImageDataGenerator 一起使用,那么您希望以一种更容易的方式组织数据。恰好这个特定的数据集已经以这样的方式建立:

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

这个数据集的组织

在肺炎文件夹中,图像标记如下:

{随机患者 id } _ {细菌或病毒} _ {序列编号}。jpeg

举个例子,

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

肺炎图像如何标记的示例

正常图像标记如下:

normal 2-{ random _ patient _ id }-{ image _ number _ by _ patient }。联合图象专家组

例如:

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

如何标记普通图像的示例

当我们在下一篇文章中开始塑造、读取和扩充数据时,我们将更多地讨论 image_dataset_from_directory()和 ImageDataGenerator。现在,只需要知道这种结构使得使用 Keras 内置的特性变得容易。

2。每张图片需要多少标签?

另一个考虑是你需要记录多少标签。如果可能的话,我更喜欢在文件名中保留标签。在许多情况下,这是不可能的(例如,如果您正在处理分割,并且需要读取每个图像的几个坐标和相关标签,我将在将来的某个时候写一篇关于分割的类似文章)。

那么当你有很多标签的时候你会怎么做呢?大多数人使用 CSV 文件,或者对于非常大或复杂的数据集,使用数据库来跟踪它们的标签。

对于这个问题,所有必要的标签都包含在文件名中。

3。你将如何划分你的数据?

每个数据集都应该分为三类:训练、测试和验证。

训练:

训练数据集用来训练模型。这是神经网络看到并从中学习的数据。这个数据集应该理想地代表神经网络在生产环境中可能遇到的每个类别和特征。

验证:

验证数据集用于在每个训练时期检查您的训练进度。它将通过神经网络模型重复运行,并用于调整您的神经网络超参数。说该数据集不影响您的模型是不正确的,因为它不用于训练-在其超参数由验证集调整的任何模型中都存在隐式偏差。作为神经网络开发人员,您本质上是在精心制作一个可以在这个集合中很好执行的模型。因此,验证集也应该代表神经网络在生产环境中可能遇到的每个类别和特征。如果它是而不是代表,那么你的神经网络在验证集上的表现将无法与其现实世界的表现相提并论。

测试:

该数据集用于测试最终的神经网络模型,并评估其功能,就像您在现实生活中一样。由于验证数据集的隐含偏差,使用该数据集来评估最终的神经网络模型是一种不好的做法。该数据集可以小于其他两个数据集,但仍必须具有统计显著性(即:它应该充分代表神经网络在生产环境中可能遇到的每个类别和特征——您注意到这里的趋势了吗?).

现在我们知道了每一套是用来做什么的,让我们来谈谈数字。理想情况下,所有这些集合都将尽可能大。对于每个数据集应该有多大,没有硬性规定。话虽如此,我有一个经验法则,我喜欢用于这样的数据集,它至少有几千个样本,并且很简单(即二进制分类):70%训练,20%验证,10%测试。如果遇到训练集太小的问题,可以根据需要进行调整以优化性能。

在你有一个更复杂的问题的情况下(例如,有许多类的分类),那么问题变得更加微妙。你需要设计你的数据集来反映你的目标。在这种情况下,我的经验法则是每个类应该分成 70%用于训练,20%用于验证,10%用于测试,并根据需要进行进一步的调整。

同样,这些是松散的指导方针,以我的经验来看,它们是起始值,并不是真正的规则。在许多情况下,如果不是大多数情况,您将需要重新平衡您的数据集分布几次,以真正优化结果。

在这种情况下,X 射线数据集被分割成 Kaggle 的原始形式的差配置,具有:

  • 测试集中 10.6%的数据
  • 验证集中的 0.3%
  • 90%在训练集中

因此,我们将根据我上面的规则随机分割数据集来处理这个问题,在训练集中留下 4,104 张图像,在验证集中留下 1,172 张图像,在测试集中留下 587 张图像。

第一部分结论

在本文中,我们讨论了理解问题域的重要性,如何识别数据集中的内部偏差和与数据集相关的假设,以及如何将数据集组织成训练、验证和测试组。既然我们对数据集及其局限性有了明确的理解,并且已经组织好了数据集,我们就可以开始编码了。

在下一篇文章中,我们将讨论:

  1. 在训练神经网络之前,使用带有 image_dataset_from_directory()的 Keras ImageDataGenerator 来形成、加载和扩充我们的数据集
  2. 解释为什么这可能不是最佳解决方案(尽管它易于实现并被广泛使用)
  3. 展示一种更强大、更可定制的数据整形和扩充方法
  4. 向您展示一个优秀、简单的技巧,让快速加速您的超参数调整和训练过程

本系列的下一篇文章将于 2020 年 6 月 14 日发布。

参考资料:

[1]世界卫生组织, P neumonia (2019),https://www.who.int/news-room/fact-sheets/detail/pneumonia

[2] D. Moncada 等人,社区获得性肺炎成人胸部 X 线片的解读(2011),https://pubmed.ncbi.nlm.nih.gov/22218512/

[3] P. Mooney 等人,胸部 x 光数据集(肺炎)(2017 年),https://www . ka ggle . com/paultimothymiooney/胸部 x 光-肺炎

[4] D. Kermany 等人,通过基于图像的深度学习识别医学诊断和可治疗疾病(2018),https://www . cell . com/cell/full text/s 0092-8674(18)30154-5

[5] D. Kermany 等人,标记光学相干断层扫描(OCT)和胸部 X 射线图像的大数据集(2018),https://data.mendeley.com/datasets/rscbjbr9sj/3

卷积神经网络:为什么它们对图像相关学习如此有用?

原文:https://towardsdatascience.com/convolutional-neural-networks-why-are-they-so-good-for-image-related-learning-2b202a25d757?source=collection_archive---------15-----------------------

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

(权利:自己的形象)

快速解释为什么 CNN 现在几乎总是被用于计算机视觉任务。

在其发展几年后,CNN 已经赢得了它的第一个图像识别竞赛(2011 年),第二年,在 2012 年,四个图像识别竞赛的获胜者正在使用 CNN 作为基础架构!即使是现在,有线电视新闻网仍然是计算机视觉的女王!

让我们从以下内容开始解释:

我们在计算机视觉中做什么?

我们在这里处理的是图像,而不是表格数据和编码文本数据中的矢量特征。图像不一定有标签,子标签为区域,因此,特征应该被提取,或智能地减少。为了说明以下内容,让我们举一个简单的例子:假设任务是根据一幅图像来决定某人的年龄,那么我们应该提取正确的特征用于推断。这些特征可以是皱纹、白发等的存在。作为本部分的结尾词:特征提取!

如何从图像中提取特征?

假设您想要提取皱纹,我们应该如何在图像中找到皱纹(显然不是手动的)?嗯,皱纹(图 1)或多或少看起来像这样(图 2)

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

图 1、图 2(权利:来源)

为了从图像中捕捉这些线,一个直观的解决方案是使用矩阵滤波。参见以下示例(图 3):

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

图 3(权利:来源

这里,滤波器是一个 3×3 矩阵,其对角线上的值为 1,其他地方为 0。因此,此滤镜将用作十字形区域或全暗区域的遮罩。在逐条目矩阵乘法之后输出高值意味着滤波器形状和所分析的区域匹配。请注意,用于过滤的矩阵不必总是取值为 0 和 1,它也可以有-1,以便进行严格的形状搜索。对皱纹进行同样的处理,我们可以使用以下过滤器(图 4)。

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

图 4(权利:自己的形象)

我们可以将这些过滤器应用于原始图像,并简单地保持较高的值,以显示形状已被检测到。这样我们就可以知道从原始图像中提取的特征在哪里以及是什么。(注:这一步被称为卷积层步骤,但我们将避免过多窥探,因为将会有另一篇文章详细解释 CNN 的层)

过滤器?但是我通常应该使用哪种过滤器呢?

与我们之前所做的不同,对于一般的任务特征提取,过滤器可以具有不同的大小,当达到太大的大小时,枚举它们或猜测这些不同的过滤器变得太困难。另外,大多数时候我们自己忽略了我们应该为分类提取什么特征。你猜怎么着?CNN 不要求我们猜测应该使用什么样的过滤器。实际上,CNN 的训练就是对这些过滤器的训练,这些过滤器是网络的权重。因此,CNN 可以完全揭示人类永远不会注意到的细节,例如确定照片上某人的年龄。这就是 CNN 的优势。(到目前为止,我们只使用了几个在同一步骤中应用的滤波器,但是通常会使用更多不同大小的滤波器,并且具有时间延迟。

非常感谢您的阅读!请继续关注我的下一篇文章,在那里我将正式阐述这里解释的概念。

[## 一步一步实现:Keras 中的 3D 卷积神经网络

了解如何实现您自己的 3D CNN

towardsdatascience.com](/step-by-step-implementation-3d-convolutional-neural-network-in-keras-12efbdd7b130)

具有异构元数据的卷积神经网络

原文:https://towardsdatascience.com/convolutional-neural-networks-with-heterogeneous-metadata-2af9241218a9?source=collection_archive---------10-----------------------

更新:

  • 2020/02/21:为图形添加像素

在自动驾驶中,卷积神经网络是各种感知任务的首选工具。尽管 CNN 擅长从相机图像(或以视频剪辑形式出现的一系列图像)中提取信息,但我经常会遇到各种不适合卷积神经网络的元数据。

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

直接在元数据上使用 CNN 可能是个坏主意(改编自来源

根据传统定义,元数据是指用于描述其他数据的一组数据。在这篇文章中,通过元数据,我们的意思是

  • 异构的、非结构化的或无序的数据伴随摄像机图像数据作为辅助信息。在传统定义的意义上,这些数据“描述”了摄像机数据。
  • 元数据的大小通常比摄像机图像数据小得多,从每幅图像几个数字到最多几百个数字不等。
  • 并且与图像数据不同,元数据 无法用规则网格表示,每张图像的元数据长度可能不是常数

所有这些属性使得 CNN 很难直接消费元数据,因为 CNN 假设数据表示在规则间隔的网格上,并且网格上的相邻数据也具有更紧密的空间或语义关系。

我遇到的元数据类型可以分为以下几组:

  • 可能影响传感器观察的传感器参数:摄像机内部/外部
  • 不同类型的传感器数据:雷达针或激光雷达点云
  • 两组数据之间的对应/关联

一个特例是激光雷达点云数据。激光雷达点云的一个典型帧通常具有成千上万个点,伴随着一帧或几帧相机图像。激光雷达点云信息丰富,它们本身可以形成与相机感知并行的独立感知管道的基础。因此,很少将它视为相机数据的辅助信息,也不是这里考虑的典型元数据类型。对于点云数据,人们已经开发了特定的神经网络架构,如 PointNet,或图形神经网络(GNN) 来直接消费点云数据,不在本帖讨论范围之内。

下面我们回顾最近文献中提出的使用卷积神经网络消费元数据的不同方法。

相机参数

深度学习在 SLAM 的很多方面都取得了重大进展,其中之一就是单目深度估计。单目深度估计本质上是不适定的,并且由于单目图像中缺乏尺度,在一个数据集上训练的模型通常不能很好地推广到其他数据集。这与一般的对象检测形成了鲜明的对比,在一般的对象检测中,对象检测器的性能不依赖于特定的相机型号(需要知道哪些相机型号拍摄了 COCO 数据集中成千上万的图像将是一场噩梦)。

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

不同焦距的镜头拍摄同一场景

相机的内在特性,尤其是镜头的焦距决定了单目图像所缺乏的比例因子。一般来说,无法分辨一幅图像是用焦距更长的相机从同一位置拍摄的,还是用同一台相机在更靠近物体的位置拍摄的。

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

单目图像中的尺度模糊(来源

由于这个原因,深度估计训练和推断通常是在用相同相机(或者至少用相同传感器和镜头规格的相机)收集的一个数据集上进行的。如果您更改相机模型,您必须收集一个全新的数据集,并标注距离以再次训练您的模型。

幸运的是,在自动驾驶和其他工业应用中,内部电路很容易从相机制造商处获得,并且在相机的整个生命周期中相对固定。我们能把这种内在机制运用到单目深度预测网络中吗?

Camera intrinsics 有四个自由度(不包括镜头失真——参见这个简明的 openCV 文档),其特征在于由像素大小归一化的行和列方向上的焦距 fx 和 fy,以及主点的像素位置 cx 和 cy。我能想到的一个简单的解决方案是将深度解码器的这四个数字融合在一个特征图的顶部,并且可能添加一个全连接层来将这四个数字融合到深度中。 CAM-Convs :针对单视图深度的相机感知多尺度卷积 (CVPR 2019)通过将内部函数工作到伪图像中,提出了一个更加聪明的解决方案。

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

CAM-Convs :摄像头感知多尺度卷积

卡姆-Conv 从优步的 CoordConv 中获得了很多灵感(卷积神经网络和 CoordConv 解决方案的一个有趣的失败, NeurIPS 2018 )。CoordConv 将两个网格通道连接到原始图像和/或中间特征图,以编码位置信息。在坐标转换的基础上,卡姆-Conv 首先将坐标转换的原点从左上角移动到主点,创建两个居中坐标 (cc)地图。这两个通道编码主要点信息。然后视场 (fov)图通过将 cc 通道除以相机焦距 f 并取反正切来计算,这基本上计算每个像素的方位角和仰角。这两个通道编码焦距信息。最后,归一化坐标 (nc)图也连接到特征图(本质上是一个归一化坐标)。

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

图像中像素的方位角和仰角(改编自 src

实际上 CoordConv 本身可以看作是将坐标信息编码到卷积神经网络的一种情况。它为卷积神经网络提供了具有平移方差的选项,并有助于学习位置敏感数据分布。

另一种方法:归一化焦距和归一化像面

在坎-Conv 论文中还有一点值得一提。如上所述,无法判断图像是用较长焦距的相机拍摄的还是近距离拍摄的。从另一个角度来看,由两个不同焦距的相机从同一相机位置成像的同一物体将呈现不同的外观,即使它们具有相同的 3D 距离。

Cam-Conv 的一个替代方案是使用标称焦距。所有地面真实距离根据标称焦距进行缩放,并用于训练模型。然后,在推断过程中,通过考虑相机的实际焦距,将预测距离按比例调整回实际距离。当然,以上讨论是基于同一图像传感器的假设。如果传感器的物理像素尺寸也发生变化,我们可以使用相同的想法,采用**标称像素尺寸,**假设窄视场(图像尺寸< <焦距)。相比之下,凸轮 Conv 是一个更有原则的方式,以适应各种相机型号。

这与mono loco(ICCV 2019)用于行人距离估算的方法密切相关。在找到图像上的关键点之后,在馈入 MLP 之前,图像坐标被投影到单位深度 Z=1 处的归一化图像平面。这有助于防止模型过度适应任何特定的相机。这基本上考虑了焦距和传感器像素大小对表观物体大小的影响。

非相机传感器数据

在自动驾驶中,除了相机图像之外的传感器数据通常可用于增加传感器冗余和系统鲁棒性。在当今的 ADAS 传感器套件中,一种无处不在的传感器(除了无处不在的摄像机之外)是雷达。

迄今为止,大多数商用雷达产生的雷达点极其稀少(每帧数量不同,根据不同的雷达型号,每帧最多 32 到 128 个点)。这比激光雷达传感器每次扫描数十万个点要小三到四个数量级。**因此,将雷达数据(或雷达图钉)视为补充和描述相机图像的一种元数据是很自然的。**下面是同一场景下雷达和激光雷达数据典型密度的直观对比,在自动驾驶中颇具代表性。

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

相同场景的雷达和激光雷达点云的比较(来自 nuScenes 数据集

注意:有更先进的雷达系统,每帧输出数百或数千个点,但这些所谓的高分辨率“成像雷达”(如 Astyx 的这一个)的商业可用性有限,成本比传统雷达高得多。

关于单独对激光雷达数据或融合激光雷达和相机数据进行三维目标检测的文献有很多(如平截头体点网AVODMV3D 等)。基于稀疏雷达针和相机的早期融合的文献很少。这部分是因为缺少雷达数据的公共数据集,部分是因为雷达数据的噪声性质和缺少高程信息。因此,我希望 nuScenes 数据集的发布能够为这一关键但研究不足的领域带来更多的关注。

融合雷达和图像数据的主流方法是想办法将雷达数据“加密”成图像。在远程检测 : 使用雷达和视觉的远程车辆检测 (ICRA 2019)中,每帧不同数量的雷达引脚被编码成具有相同相机图像空间大小的双通道图像,一个通道编码距离(距离测量),另一个编码距离变化率(径向速度)。每个雷达针被标记为一个而不是一个像素,以增加训练过程中每个点的影响,并反映雷达测量在方位和高度上的噪声性质。使用从雷达到摄像机的外部校准和摄像机的内部校准将雷达引脚投影到摄像机图像上。融合网络相对简单,我将跳过这里,因为我们的重点是 CNN 的雷达数据表示。

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

远距离探测使用双通道伪图像对雷达信息进行编码

在 RVNet : 用于挑战性环境中基于图像的障碍物检测的单目摄像机和雷达的深度传感器融合 (PSIVT 2019),雷达 pin 也被投影到摄像机图像平面并形成稀疏的雷达图像。这次它有三个通道,深度、横向速度和纵向速度。注意,这里的速度由自我车辆的速度补偿,因此不能由单一通道的距离变化率来表示。(作者还提出了一种密集雷达图像编码方法,这种方法对我来说没有意义,因此在此省略。)

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

RVNet 使用自我运动补偿速度

在上述两种方法中,雷达销被投影到摄像机图像上。投影点或者用作单个像素,或者给定一个恒定的空间范围。一种可能的改进方法是根据距离使用各种大小的磁盘,如 RRPN ( 雷达区域提议网络,ICIP 2019)使用的磁盘。这更好地反映了雷达针的空间不确定性,因为理论上,近距离雷达针的投影比远距离雷达针的投影具有更大的横向空间不确定性。

CRF-Net : 一种基于深度学习的雷达和相机传感器融合架构用于物体检测 (SDF 2019)将雷达点绘制成一条垂直线。这些线条从地面开始,延伸 3 米,因此不是均匀地垂直绘制的。从线解析几何 (ICRA,2017 年)也使用类似的技术将单线激光雷达测量结果增密为密集参考深度框架。这个雷达图像实际上与这个演示中显示的非常相似。

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

用垂直线加密雷达针( CRF-Net ,2019)

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

ADAS 的演示:Tram Radar Western

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

增密单线激光雷达测量(从一条线解析几何,ICRA 2017 年)

此外,上述 RRPN(雷达区域提议网络)还提出了一种使用雷达生成区域提议的有趣方式。这是基于这样的观察,即 nuScenes 数据集中的几乎每个对象都具有相应的雷达 pin,因此雷达数据可以用作稳健的区域提议方法。为了适应雷达测量的空间不确定性,锚不总是居中。

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

RRPN 使用噪声雷达数据和移动锚进行目标探测

综上所述,以上所有方法(RRPN 除外)都是将雷达 pin 转换成一个伪图像,用 CNN 提取更高层的信息。

激光雷达点云

如上所述,由于点云的密集特性,可以在激光雷达数据之上直接执行对象检测。因此,将激光雷达数据视为相机图像的元数据可能不合适。然而,从点云数据具有变化数量无序而不是均匀分布在规则网格上的意义上来说,激光雷达数据就像雷达数据一样是非结构化的。

在将激光雷达数据和图像数据输入神经网络之前,人们已经做出了许多努力来执行激光雷达数据和图像数据的早期融合。 MV3D : 用于自动驾驶的多视角 3D 物体检测网络 (CVPR 2017)将激光雷达点转换为两种类型的伪图像,鸟瞰视图(BEV)和前视图(FV)。BEV 贴图是 0.1 m 分辨率的离散化网格,有多个高度贴图和一个密度贴图和一个强度贴图。FV 遵循 VeloFCN : 使用全卷积网络从 3D 激光雷达检测车辆 (RSS 2016)的约定,注意这不同于将激光雷达的点投影到摄像机图像。然后,三个不同的网络从 BEV 图像、FV 图像和 RGB 图像中提取特征,然后将这些特征连接起来进行融合。

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

MV3D 中激光雷达点的输入表示

LaserNet : 一种用于自动驾驶的高效概率 3D 物体探测器 (Arxiv,2019)提出了一种不同的方法来编码激光雷达点。RV(范围视图)通过将激光器 id 直接映射到行并将方位角离散化为列来生成。这种表示的一个优点是它本身是紧凑的。它有五个通道:范围(距离)、高度、方位角、强度和一个指示单元格是否包含点的标志。

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

激光雷达点的 LaserNet 表示

总之,尽管密度比雷达针高,激光雷达点也可以打包成伪图像供 CNN 使用。类似于使用全连接图层消费稀疏元数据的替代方法,我们也可以使用点网 (CVPR 2017)直接消费无序的点云数据。

通信/关联数据

另一种类型的元数据是关联数据,例如交通灯到车道的关联。元数据融合: 交通灯到车道分配的深度元数据融合 (IEEE RA-L 2019)提出了一种数据融合方法,融合来自交通灯、车道箭头和车道标线检测结果的异构元数据。元数据以元数据特征图(MFM) 的形式编码,并与来自相机图像的中间特征图融合。mfm 本质上是二元注意力地图。关联基础事实和预测也被编码成表示横向空间位置的一维向量。

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

元数据特征地图(MFM) 将元数据与相机图像融合

在此工作中,元数据要素地图(MFM)按元素乘以第一个 F=12 层。事实证明,这比直接将 MFM 与影像特征地图连接在一起要好一些。

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

示例元数据特征地图(MFM) 带 IPM 摄像机图像

先前对象检测结果

有时,将对象检测边界框提供给其他学习管道是有用的。然而,边界框的数量不是恒定的-从这个角度来看,它们也可以被视为元数据。一种方法是将边界框转换为热图。在**:用于视觉对象跟踪的空间监督递归卷积神经网络中,对象检测结果被转换为热图,以指导学习在空间和时间上一致的特征,用于视频对象检测和跟踪。**

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

ROLO 将物体检测结果(只有一个物体)转换为热图

在通过关联嵌入将 像素转换为图形(NIPS 2017)中,可通过将对象检测格式化为双通道输入来合并先前检测,其中一个通道由边界框中心的一键激活组成,另一个通道提供框的二进制掩码。可以在这两个通道上显示多个框,第二个表示它们的掩码的联合。如果有太多的边界框,遮罩通道变得太拥挤,那么通过边界框锚点分离遮罩,并将它们放入不同的通道。

为了降低计算成本,这些额外的输入不在输入层中集成,而是在几层卷积和汇集之后合并。

外卖食品

  • 元数据通常是无序的,不在规则的网格上。每个图像的元数据的数量通常不是恒定的,这使得很难使用具有固定输入维度的固定神经网络结构。
  • 如果每个相机图像的元数据是固定长度的,则可以使用完全连接的结构来将这些元数据与相机特征地图融合。
  • 如果元数据是无序的,例如雷达或激光雷达点云数据,另一种方法是使用点网结构,它对输入顺序的排列是不变的。
  • 使用 CNN 消费元数据的最通用方法是将元数据转换成某种形式的具有规则网格间距的伪图像**。伪图像应该是最好的,或者可以被变换到与图像数据相同的空间域。**

参考

张量流卷积神经网络

原文:https://towardsdatascience.com/convolutional-neural-networks-with-tensorflow-2d0d41382d32?source=collection_archive---------21-----------------------

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

丹尼尔·库切列夫在 Unsplash 上拍摄的照片

嘿大家好!在这篇文章中,我试图总结 Deeplearning.ai 在 TensorFlow 中关于卷积神经网络的课程

C 可选神经网络(ConvNets)是一种特殊类型的神经网络,用于分析和处理图像。它的名字来源于它用作过滤器的’卷积层。这将过滤提供给它的特定特征的图像,然后被激活。因此,通过使图像通过这些过滤器来检测特定特征、其在图像中的位置以及其与类别相关的强度,从而生成特征图。

这种神经网络的创新之处在于它能够学习自动开发这些过滤器,从输入图像中捕获一组特定的特征,并根据捕获的特征对图像进行分类。

这些网络在图像分类、推荐系统、图像和视频识别等方面有着广泛的应用。

ConvNets 通常是具有非线性激活函数的卷积的交替层和最大池层的组合,之后是完全连接的密集层。

为了给这些网络的架构一个概念,这里有一张图片。

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

让我们通过钻研课程来理解这一点!

我们将从分类猫和狗图像的基本模型开始。

我们将数据集放在一个名为*‘cats _ and _ dogs _ filtered . zip’*的压缩文件夹中。为了提取它,我们必须实现下面的代码。

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

这将提取基础目录’/tmp/cats _ and _ dogs _ filtered’中的内容,该目录包含训练和验证子目录,这些子目录又包含 cats 和 dogs 子目录。

你会注意到,我们并没有明确地将这些图像标记为猫和狗。我们将在本文的后面讨论图像生成器ImageGenerator 可以直接从子目录中读取图像,并根据子目录的名称为您标注。

例如,您有一个“火车”目录,其中还包含“猫”和“狗”目录。图像生成器会对这些子目录中的图像进行适当的标记。

我们定义了每个目录。

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

我们可以使用下面的代码查看这些目录中的猫和狗的文件名。

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

我们得到这样的输出…

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

根据我们的数据集,我们总共有:

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

我们可以通过实现下面的代码来查看我们的图像

首先,我们配置 matplotlib 参数。

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

我们加载一批 8 只猫和狗的图片。

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

建立模型

数据集中的图像有多种形状和大小。对于要在这些图像上训练的神经网络,我们需要它们具有特定的形状。

对于灰度图像,我们有一个 1 字节的色深,即 8 位。对于我们数据集中的图像集,颜色深度为 3 字节,即 24 位,因为它们是 RGB 格式。

我们最初在模型中添加一些卷积层,然后在发送到密集连接的层之前将其展平。

由于这是一个二元分类模型,我们可以在最后一层添加一个**‘Sigmoid’**函数。

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

我们现在将配置参数来训练和编译我们的模型。我们将使用二元交叉熵损失,因为这是一个二元分类问题,并且我们在最后一层中有一个范围为 0 到 1 的 sigmoid 激活函数。

我们将使用 RMSprop 优化算法而不是随机梯度下降(SGD) ,因为 RMSprop 为我们自动调整了学习速率。

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

为什么要实现 Conv2D 和 MaxPooling2D?

实现卷积层的想法是减少图像,以便只考虑突出的特征和决定输出的特征。换句话说,卷积压缩图像。

池层 有效压缩图像,使其更易于管理,并选择突出的特征。

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

上面一行代码将训练图像重塑为一个 28x28 像素的图像60000 代表图像数量1 代表通道数量 。由于上述图像是灰度图像,因此只有 1 个通道与之相关联。

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

再次像前面的代码片段一样,***【Conv2D】***图层的 input_shape28x28 像素1 通道 与每个图像相关联,作为其灰度图像。 64 卷积存在,并且每个卷积是形状 3x3 的矩阵。

MaxPooling2D 层有一个形状为 2x2 的池矩阵。

【Conv2D】第一个参数 作为 第 64 个 来表示 滤镜 的数量。网络中的初始过滤器负责检测边缘和斑点。在初始层中使用太多的滤波器是不需要的,因为从原始输入层提取的信息只有这么多,并且大多数滤波器将是冗余的。**

初始层使用 16 或 32。

模型的总结给了我们这样一个输出。

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

上面的代码片段为我们提供了整个模型的概要。

第一个 Conv2D 层的输出形状为 26x26。 这不是一个小故障,让我们了解一下原因:-

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

图— 1

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

图-2,让我们把水平方向上的九个像素分别命名为 pix1,pix2,pix3…

Conv2D 图层的 滤镜大小为 3x3 。这意味着它需要选择具有 a(上面或下面的像素)和(左边或右边的像素)的像素。图-2 展示了满足图-1 左上角标准的第一个可能的竞争者的像素。

我们可以看到,在 pix1、pix2、pix3 之上不存在任何像素。类似地,在像素 1、像素 4、像素 7 的左边不存在任何像素。因此,我们需要选择 pix5 作为第一个像素。类似地,在左下角,我们必须相应地选择一个像素。因此我们省略了顶部的一个像素行和底部的一个像素行;左侧一个像素列和右侧一个像素列。

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

行方向的 2 个像素和列方向的 2 个像素被省略。因此,28x28 的图片已经减少到 26x26。

MaxPooling2D 有一个 滤镜大小为 2x2 。它将滑过 26x26 的图片选择具有最大值的像素。这有效地将图像大小减半 *。*因此 26x26 的 pic 变成了 13x13 的 pic 大小。

同样的过程继续,直到我们到达层 max_pooling2d_1。 这里我们有一个尺寸为 5×5 的 卷积窗和一个 64 卷积 。现在,在后续层中,卷积变平。因此,我们有一个展平层的输出形状为 1600(5x5x 64 = 25x 64 = 1600)。这 1600 个要素现在以矢量的形式存在,随后可以输入到后续图层的密集网络中。**

了解图像生成器

我们将从马与人分类器的代码片段开始。

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

这里我们有一个’ 重缩放’ 参数。由参数指定的值是图像的每个像素值乘以的因子**。例如- 一个像素的值为 223 。223 乘以 1/255, 原来的 223 被结果 0.87 代替(223x 1/255 = 0.87) **

数据生成器然后可以与 Keras 模型一起使用接受数据生成器作为输入** : 拟合 _ 生成器评估 _ 生成器预测 _ 生成器 。**

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

使用验证集时,还必须指定验证集的目录。

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

参考上面的代码,我们可以分析模型的训练和验证趋势。

让我们对现有的“猫和狗”数据集尝试遵循相同的过程。

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

我们通过使用训练集中的**‘fit _ generator’**方法来训练我们的模型。

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

下面的代码允许用户在 google colab 中上传文件,然后通过模型运行它,试图预测图像是猫还是狗。

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

查看各层的输出

让我们试着理解我们的卷积神经网络是如何试图预测图像的类别的。要做到这一点,我们需要了解我们的 ConvNet 在图片中关注的是什么特征。

我们可以通过确定哪个特征在通过卷积层时变得突出来分析这一点。

import numpy as npimport randomfrom   tensorflow.keras.preprocessing.image import img_to_array, load_img# Let's define a new Model that will take an image as input, and will output# intermediate representations for all layers in the previous model after# the first.successive_outputs = [layer.output for layer in model.layers[1:]]#visualization_model = Model(img_input, successive_outputs)visualization_model = tf.keras.models.Model(inputs = model.input, outputs = successive_outputs)# Let's prepare a random input image of a cat or dog from the training set.cat_img_files = [os.path.join(train_cats_dir, f) for f in train_cat_fnames]dog_img_files = [os.path.join(train_dogs_dir, f) for f in train_dog_fnames]img_path = random.choice(cat_img_files + dog_img_files)img = load_img(img_path, target_size=(150, 150))  # this is a PIL imagex   = img_to_array(img)                           # Numpy array with shape (150, 150, 3)x   = x.reshape((1,) + x.shape)                   # Numpy array with shape (1, 150, 150, 3)# Rescale by 1/255x /= 255.0# Let's run our image through our network, thus obtaining all# intermediate representations for this image.successive_feature_maps = visualization_model.predict(x)# These are the names of the layers, so can have them as part of our plotlayer_names = [layer.name for layer in model.layers]# -----------------------------------------------------------------------# Now let's display our representations# -----------------------------------------------------------------------for layer_name, feature_map in zip(layer_names, successive_feature_maps):if len(feature_map.shape) == 4:#-------------------------------------------# Just do this for the conv / maxpool layers, not the fully-connected layers#-------------------------------------------n_features = feature_map.shape[-1]  # number of features in the feature mapsize       = feature_map.shape[ 1]  # feature map shape (1, size, size, n_features)# We will tile our images in this matrixdisplay_grid = np.zeros((size, size * n_features))#-------------------------------------------------# Postprocess the feature to be visually palatable#-------------------------------------------------for i in range(n_features):x  = feature_map[0, :, :, i]x -= x.mean()x /= x.std ()x *=  64x += 128x  = np.clip(x, 0, 255).astype('uint8')display_grid[:, i * size : (i + 1) * size] = x # Tile each filter into a horizontal grid#-----------------# Display the grid#-----------------scale = 20\. / n_featuresplt.figure( figsize=(scale * n_features, scale) )plt.title ( layer_name )plt.grid  ( False )plt.imshow( display_grid, aspect='auto', cmap='viridis' )

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

正如我们所看到的,我们从一组可以清楚地看到猫的像素转移到同一幅图像越来越紧凑和抽象的表现。当我们向下游走的时候,我们观察到网络开始突出网络所关注的内容。可以观察到图像中较少的特征被突出显示。图像中的大多数特征被设置为“零”。这被称为’稀疏性,这是深度学习的一个关键特征。

随着我们向下游发展,该表示携带的关于图像原始像素的信息越来越少,但是关于图像类别的信息越来越精确。它类似于一个蒸馏系统,在这种情况下可以称为“信息蒸馏系统”。

可视化精度趋势

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

蓝色线表示模型在训练数据上的表现,橙色线表示模型在验证数据上的表现。我们观察到,我们的训练准确率达到了大约 100%,而我们的验证准确率停留在 70%左右。同样,我们的培训损失稳步下降,而我们的验证损失继续稳步上升。

这是过度拟合的经典例子。当一个模型暴露于少量的例子时,过度拟合就会发生,在这个例子中只有 2000 个例子。当在小的训练数据集上训练时,模型倾向于学习不相关的特征,这些特征不概括数据。例如,当给人类一小组伐木工人和水手的照片并且假设照片中只有伐木工人戴帽子时,人类可能错误地将帽子与伐木工人联系起来,即人类现在可能开始认为所有伐木工人都戴帽子,而不是水手。

为了克服这个问题,我们可以简单地增加图像,即我们简单地调整图像来改变它一点。

图像增强

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

现在,除了 ImageDataGenerator 的 rescale 特性,我们还实现了图像放大。

图像增强有助于处理过度拟合。如果图像被增强,它可以创建新的图像集来训练模型,而无需显式地获得新的图像。它试图修改现有的图像,从而在其中创建更多的功能。因此,在绘制和比较训练和测试的准确性时,损失较小。

然而,在不利方面,如果测试图像集缺乏多样性,并且与训练集更相似,我们可能会遇到图像增强不能反映我们克服过拟合问题的情况。因此,我们还必须在测试集中有各种各样的图像。

可供我们选择的方案有:

rotation_range —我们可以旋转图片的度数。在 0 度到 180 度之间变化。

width_shift 和 height_shift —总宽度或高度的一部分,在此范围内随机垂直或水平平移图片。

shear_range —随机应用剪切变换。

zoom_range —随机放大图片。

horizontal_flip —随机水平翻转一半图像。与现实世界的图片相关。一幅风景,从一边看或水平翻转后,似乎仍然是一幅自然的画。

fill_mode —用于填充新创建像素的策略,可在旋转或宽度高度移动后出现。

迁移学习

迁移学习是机器学习中的一种技术,它专注于存储从解决一种类型的问题中学到的知识,并实现对一些其他相关类型的问题的解决方案。

我们可以在 Keras 中使用 API 来实现这一点,这些 API 可以帮助我们查看预训练模型的层。这有助于我们确定我们希望使用哪些层,以及我们希望重新培训哪些层。

使用预训练模型的快照。稍后可以将参数加载到预训练神经网络的这个骨架模型中,以转变成训练模型。

Keras 已经内置了初始模型的模型定义。我们可以实例化模型并指定数据的输入形状。 InceptionV3 顶部有一个全连接层。通过指定 include_top = False ,我们告诉模型忽略完全连接的层,直接进入卷积。通过将权重参数分配给,我们指定我们不需要模型的内置权重。我们可以稍后通过 load_weights 方法分配我们想要的权重,并将下载的权重加载到模型中。

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

我们现在已经准备好了我们的预训练模型。我们可以遍历模型层并锁定它们,换句话说,我们指定这些层是否是可训练的。

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

模型中的所有层都有名称,因此我们可以查看特定的层。我们可以从预先训练好的模型中抽取任何一层,并获取它的输出。

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

我们现在将获取该输出,并将其与密集层连接,因为我们在实例化模型时忽略了完全连接的层。然后,我们将通过创建一个模型并向其传递输入和层定义来整合所有层。然后,通过指定优化器、损失函数和我们需要的指标来编译模型

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

一旦完成,我们将遵循和以前一样的程序。

我们将创建一个图像数据生成器并增强我们的图像。

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

然后,我们可以指定包含训练图像的目录,并让它流经生成器,以便对来自训练目录的图像应用所有的增强。

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

然后像以前一样,通过将模型传递给 fit_generator 方法来训练模型。这里,模型被训练 100 个时期。

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

上图是准确度与训练和验证集的对比图。该模型开始很好,但随后开始偏离训练。因此,我们最终处于一种不同的过度拟合状态。

为了理解这一点,让我们假设下图是我们的神经网络。这种错误背后的想法是,当我们的模型试图预测导致过度拟合的数据时,神经网络中的层有时可能最终具有相似的权重,并可能相互影响。我们经常在大型复杂网络中看到这种错误。

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

通过实施**【辍学】**,我们有效地使我们的模型看起来像这样。

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

结果是邻居不会太多地相互影响,因此我们可以潜在地克服过度拟合。

我们可以通过添加 Dropout 层在代码中实现这一点。该参数可以是 0 到 1 之间的任何值。这里我们给定参数为 0.2,这意味着我们将丢失 20%的神经元。

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

当我们开始观察验证准确性偏离我们的训练准确性时,这个问题就成了实施退出的一个很好的候选对象

这是实现辍学后的图表。

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

多类分类

到目前为止,我们已经解决了二元分类问题,我们试图将图像分为两类。我们现在将开始“多类分类”,我们试图将图像分为两个以上的类别。

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

在这里,我们试图将图像分为 3 类,即石头,纸和剪刀。以上是我们需要维护的文件结构,以便实现我们所学的二进制分类,就像我们维护猫狗分类问题的文件结构一样。

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

与前面的问题类似,我们将创建一个图像数据生成器,而不是将类模式设置为’二进制’,我们将把它设置为’交叉熵’。

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

接下来,我们将更改模型定义。

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

对于二进制分类问题,我们将在最后一层使用具有’ Sigmoid '激活函数的单个神经元,因为这将是 0 或 1,取决于模型的预测。

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

这里,我们的输出层中有 3 个神经元,激活函数为’ Softmax ’ 。

在有 3 个神经元的 Softmax 函数的情况下,当给出类似下图的输入时,其中一个神经元将会点亮。请注意,所有值的总和等于 1。我们可以称这些值为每一类的概率。该图像很可能属于具有最高概率的类别,因此该神经元将被点亮。

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

我们还将实施一项更改。对于二进制分类问题,我们有了’二进制 _ 交叉熵 ’ 损失函数。

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

对于多类分类问题,我们将使用’分类交叉熵

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

由于在之前的“猫和狗”分类问题中,我们只有两个类别来对数据进行分类,因此我们使用了“二元 _ 交叉熵”损失函数。这次我们将数据分为三类,因此使用了’categorial _ cross entropy函数。一般来说,所有多类分类问题,即具有两个以上类的问题,将使用该损失函数。

至此,我们结束了本课程的记录。在这篇文章中,我们学习了如何为图像分类构建卷积神经网络,实现数据扩充和迁移学习,以及如何实现多类分类器。然而,我们仅仅触及了计算机视觉所提供的大量应用的表面。这些计算机视觉应用中有几个结合了复杂的架构和策略,这些架构和策略源自我们在本课程中看到的卷积神经网络的基本结构。这个领域的可能性是无穷无尽的,探索这些可能性的追求推动了深度学习社区和研究更深入地研究这个主题。

我希望这能激励你参加这个课程,并开始自己实验、探索和实现这些错综复杂的卷积神经网络。

感谢你阅读这篇博客。我希望听到你对此的想法。

张量流卷积神经网络

原文:https://towardsdatascience.com/convolutional-neural-networks-with-tensorflow-8c980d206330?source=collection_archive---------66-----------------------

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

尼克·希利尔在 Unsplash 上的照片

实现 LeNet 5 架构来对 MNIST 数据集上的数字进行分类。

这个世界充满了非结构化数据,而不是结构化数据。它包括图像、文本、图表等等。这些数据很难分析,直到深度学习再次开始存在。深度学习是机器学习的一个分支,它受到大脑工作机制的启发,特别是对神经元的影响。人工神经元结合在一起形成一种叫做神经网络的东西。

深度学习取得了有影响力的进展,尤其是在图像数据上。图像数据非常复杂,因为它没有表格格式,而且有大量的参数,尤其是像素。假设当你使用 SVM 和逻辑回归等机器学习模型时,你想预测哪个图像代表猫,哪个图像代表狗,你必须自己确定猫和狗的区别。

区分猫和狗的特征是什么?嗯,你可以通过它的鼻子、眼睛、耳朵等等来说。要捕捉这些特征,您可以使用卷积运算来捕捉这些特征。但是如果要提取特征,就存在一些问题。而是这些图像彼此之间的形式不同。因此,我们应该有一种方法,可以自己学习从图像中提取特征的参数。

我们必须处理两个任务,提取特征和预测图像。我们可以使用卷积神经网络(CNN)来解决我们的问题。

与传统的机器学习相比,它的特别之处在于它可以捕捉数据的非线性。像支持向量机(SVM)和逻辑回归这样的算法仅从数据中估计线性函数来将它们分类。另一方面,由于激活函数,神经网络可以估计一个非线性函数,该函数将数据划分到它们的类别中。

神经网络如此强大的另一个原因是,该模型可以自己设计特征,并且由于反向传播的能力,它可以学习捕捉特征并正确预测数据。因此,神经网络是从非结构化数据中发现知识的完美模型。

本文将通过 Yann LeCun 的 LeNet 5 架构(第一个 CNN 架构)向您展示如何使用卷积神经网络解决图像分类问题。然后,我们将使用 Python 中的 TensorFlow 库实现它。本文的目标将是这样的,

  • 了解卷积神经网络的构建模块,
  • 了解 CNN 架构,尤其是 LeNet 5 架构,最后
  • 可以用 Python 中的 TensorFlow 实现架构

基本面

在我们开始实施之前,为了确保您不会感到困惑,我将向您展示卷积神经网络的基础知识。它由卷积层、子采样(池化)层和全连接层组成。

卷积层

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

摘自斯坦福 CS230 课程备忘单

卷积层是使用卷积过滤器捕捉图像特征的层。如前所述,卷积是一种用给定的过滤器计算像素的操作,通过逐元素相乘,然后将它们作为一个数字相加。

过滤器将减少数据的维度,但维度的数量会随着时间的推移而增加。如果我们想保持图像的尺寸,我们可以设置填充。填充在图像的边界添加缺失的像素。因此,它将具有与前一个相同的维度。

或者在做卷积的时候想避免像素重叠,可以用 stride。步幅是一种操作,其中卷积过程将随着其给定的数字而跳跃。利用这一点,它可以按照给定的数目跳几级。

该图层将学习适合数据的参数,因此可以准确预测图像。此外,因为它希望捕捉图像的非线性,该层包含一个名为整流线性单元(ReLU)的激活,它将负值设置为 0,否则将是值本身。因此,通过使用这一层,我们不必手动提取特征。

汇集层

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

来自 GeeksForGeeks

池层基本上是一个降低数据维度的层。该层的机制类似于卷积层,只是它不应用任何滤镜。池层的例子是最大池层。它将取图像对应的每个区域的最大值,正如我们可以看到上面的图像。通过获取图像每个区域的最大值,图层可用于汇总图像。

全连接层

在卷积和池层之后,现在图像进入完全连接的层。该图层将处理预测结果。它类似于人工神经网络(ANN)图层,因为它包含节点,对于预测已缩减像素采样的图像非常有用,并且其特征已经被检索。该机制也类似于人工神经网络,但它增加了卷积层,以自动进行特征提取。

LeNet 5 架构

在我们知道 CNN 的构建模块之后,我们如何实现它呢?我们可以参考现有的对它的研究,可以用它的架构作为我们的参考来构建自己的 CNN 模型。对于本文,我们将使用现有的第一个 CNN 架构。它来自 Yann LeCun 和他的团队在 1998 年发表的一篇名为“基于梯度的学习应用于文档识别”的论文。他们提出了一个名为 LeNet 5 的架构。它看起来像这样,

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

摘自 Yann LeCun 关于 LeNet 5 的论文

一般来说,架构由几层组成。流程看起来像这样,

Conv = >池=> Conv = >池= >全连接层= >输出

它将执行两个常规步骤。它们是特征提取(Conv = >池序列)和用于预测值的全连接层。如果我们观察细节,每一层至少重复两次。这就是为什么它被称为深度学习,因为它比现有的机器学习模型更深入地学习数据。

在我们了解架构之后,我们可以直接进入实现。为了实现这一点,我们将使用 TensorFlow 及其 Keras API 来实现。我们将使用来自 Keras 的高级 API,因此您可以更容易地实现模型,而不是使用低级 API。

行动(或活动、袭击)计划

在我们实现这一点之前,我将向您概述一下我们将如何使用 TensorFlow 实现这一架构,

  1. 准备数据
  2. 构建模型并设置优化器
  3. 拟合模型并用数据验证集进行验证

实施

准备数据

在我们实现模型之前,我们必须准备数据。首先,我们将导入数据。它的来源是 Kaggle 上的数字识别竞赛。它由 60000 行组成。然后,它分成 42000 个观察值用于训练数据,其余的用于模型的测试数据。在我们导入数据后,数据最初看起来是这样的,

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

数据集仍为表格格式。列表示标签和对应于图像的像素。因此,我们必须重塑数据集。但在此之前,请确保首先对图像进行归一化,然后对数据集进行整形。最后,我们将训练数据分成两部分,模型的训练和验证数据集。

这样做的代码看起来像这样,

**# Import The Libraries**
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras import layers, models
from sklearn.model_selection import train_test_split**# Import The Dataset**
train = pd.read_csv('../input/digit-recognizer/train.csv')
test = pd.read_csv('../input/digit-recognizer/test.csv')**# Prepare the training set**
train_image = train.drop('label', axis=1)
train_label = train['label']**# Normalize the data**
train_image = train_image / 255.0
test_image = test / 255.0**# Reshaping the image**
train_image = train_image.values.reshape(-1, 28, 28, 1)
test_image = test_image.values.reshape(-1, 28, 28, 1)**# Split into training and validation dataset**
X_train, X_val, y_train, y_val = train_test_split(train_image, train_label, test_size=0.1, random_state=42)

对于数据的预览,它看起来像这样,

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

图像的预览

建立模型

准备好数据后,我们就可以建立模型了。我们将基于架构构建模型,并使用我们的数据集进行调整,因为数据与原始纸张的维度不同,即 28 x 28 x 1。正如我们之前所说的,模型的流程看起来像这样,

Conv = >池=> Conv = >池= >完全连接

这是构建它的代码,

model = models.Sequential()
**# Feature Extraction Section (The Convolution and The Pooling Layer)**
model.add(layers.Conv2D(filters=6, kernel_size=(5, 5), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.AveragePooling2D())
model.add(layers.Conv2D(filters=16, kernel_size=(5, 5), activation='relu'))
model.add(layers.AveragePooling2D())
**# Reshape the image into one-dimensional vector**
model.add(layers.Flatten())
**# Classification Section (The Fully Connected Layer)**
model.add(layers.Dense(120, activation='relu'))
model.add(layers.Dense(84, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
**# Show summary of the model**
model.summary()

在我们建立模型之后,摘要将会是这样的,

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

模型的总结

正如我们所看到的,我们可以看到图像的尺寸减少了,但过滤器的数量增加了。在我们提取特征后,我们将图像整形为一维向量来预测它。此外,我们可以看到,除了池层之外,每一层都有一定数量的参数。在这种情况下,模型要学习 44426 层。该模型将学习这些参数,以实现预测图像的更高精度。

为了适应和优化这个模型,代码应该是这样的,

**# Compile The Model**
model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])**# Fit And Evaluate The Model Using Validation Dataset**
history = model.fit(X_train, y_train, epochs=10, validation_data=(X_val, y_val))**# Evaluate The Model Using Plot** plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0.95, 1])
plt.legend(loc='lower right')

之后,模型拟合数据,并根据历元数重复几次。为了评价,模型达到这样的精度,

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

拟合过程

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

带精度结果的历元线图

正如我们可以看到的,我们得出的结论是,5 的历元数比任何历元数都要稍好一些。因此,我们可以只使用 5 个时期来建立模型,并且我们可以使用它来预测值。

最终想法

我们已经使用 LeNet 5 架构在 MNIST 数据集上建立了模型。我们模型的精确度已经很高了,但我们还可以进一步改进模型。为了改进模型,我们可以增加数据,微调模型,添加更多的过滤器和模型的深度,等等。

存在许多 CNN 架构,例如 VGG-16、ResNet、AlexNet 等等。我必须告诉你这只是开始。关于计算机视觉,我们可以学到很多东西。我希望这篇文章将是你开始计算机视觉之旅的一个很好的开端,我也希望你可以使用 CNN 或其他方式开发一个很好的应用程序。

参考

[1]马丁·阿巴迪等人。艾尔。 TensorFlow:异构系统上的大规模机器学习 (2015)。tensorflow.org 提供的软件。
[2]扬·勒存等。艾尔。*基于梯度的学习应用于文档识别。*IEEE 会报,第 86 卷,第 11 期,第 2278-2324 页,1998 年 11 月,doi: 10.1109/5.726791。
[3] Yann LeCun 等。艾尔。深度学习 (2015)。《自然》, 521(7553),第 436-444 页。

感谢您阅读我的文章,您也可以在下面查看我以前的文章:

[## R 中 ARIMA 模型的时间序列预测

从勘探到预测 1970 年至 2015 年的二氧化碳排放数据。

towardsdatascience.com](/time-series-forecasting-with-arima-model-in-r-77f4e2ae7abb) [## R 时间序列分析导论

从探索,到预测。使用印度尼西亚 2002 年 12 月至 2020 年 4 月的消费者价格指数(CPI)数据

towardsdatascience.com](/introduction-to-time-series-analysis-with-r-a2f97650baa3) [## 数据科学和竞争性编程

他们在解决问题,但方法不同。

towardsdatascience.com](/data-science-and-competitive-programming-2887300207c0)

Cookiecutter 创建自定义可重用项目模板

原文:https://towardsdatascience.com/cookiecutter-creating-custom-reusable-project-templates-fc85c8627b07?source=collection_archive---------14-----------------------

一个简短的教程,学习如何修改现有的 cookiecutter 模板或从头创建自己的模板。

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

Unsplash 上由 Neven Krcmarek 拍摄的照片

你过去和未来的项目可能在某些方面都是独一无二的。也就是说,如果你是(并且你应该是)适度组织的,所有的底层结构在项目之间不会有太大的变化:一个文件夹用于原始数据,另一个用于处理过的数据;一个存放源代码的文件夹,一个存放报告的文件夹等等。拥有一个共享的结构不仅在短期内有助于找到和使用与项目相关的所有资源,而且从长远来看,有助于各个项目之间的一致性和可复制性。

如果做得好的话,良好的项目结构可以节省时间,但是如果你刚开始一个新项目的时候,还在创建自述文件和。gitignore 的而不是导入 matplotlib。人们总是可以简单地复制一个旧的项目,删除/修改旧的文件和文件夹,但这并不会比从头开始更有趣或更快。尤其是如果你必须改变每个文档中的项目标题,每个文件的每个联系人部分的作者姓名等等。这个问题真正的最佳解决方案是使用灵活的模板工具。事实上,有太多的模板工具,然而,以其简单、灵活和直观而著称的是 cookiecutter

如果你还没有听说过它,或者你还没有花时间使用它来优化你的模板,在这篇文章中,我将向你展示如何快速开始使用现有的在线 cookiecutter 模板,如何定制它们,以及如何在没有代码或复杂设置的情况下从头开始制作你自己的模板。

安装 Cookiecutter

安装 cookiecutter 就像在 python 中安装任何其他包一样简单:

pip *install* cookiecutter

或者,如果您使用的是 conda:

conda *install* -c conda-forge cookiecutter

我个人更喜欢拥有一个包含 cookiecutter(以及其他常用/快速使用的工具)的通用 conda 环境,然后为特定的项目依赖项创建一个新环境。但我把这部分留给你。

使用预定义的 Cookiecutter 模板

与开源天堂中的许多资源一样,您可以通过使用您喜欢的 maaaaaany 公共模板之一来开始使用 cookiecutter 模板。

我特别喜欢的一个是cookiecutter-data-science模板。我强烈推荐你访问这个链接,看看整个模板结构。它不仅是一个很好的文件目录树,还可以帮助您组织一般数据相关项目的概念流程。如果需要,我们将在下一节学习如何定制它。如果你想知道对于不同类型的项目还有什么其他的模板(Django 模板,数据新闻模板等等。)你应该看看官方文件上的详细列表。

不过现在,我们将使用烹饪数据科学。假设您希望将项目保存在文件夹 AllProjects 中,通常您会将所有项目保存在该文件夹中。只需进入该目录,在命令/Anaconda 提示符下激活您虚拟/conda 环境(如果您还没有进入该目录),然后键入:

cookiecutter <repo url>

如果你确实在使用cookiecutter-data-science,这就变成了:

cookiecutter https://github.com/drivendata/cookiecutter-data-science

或者,如果你想保存一些字符,你可以使用 GitHub 地址的快捷键:

cookiecutter gh:drivendata/cookiecutter-data-science

如果是第一次使用,它会先把模板下载到本地。一旦完成,cookiecutter 动作就开始了。根据您选择的模板,系统会提示您回答不同的问题,例如项目名称是什么、作者姓名、项目描述、许可证等。这些都是您可以采用的不同定制选项(或者简单地接受默认选项)。填写所需答案或从提供的选项中选择(默认值出现在方括号中)。

我将假设(如果您被询问项目的名称,这通常是应该的)您选择了名称 ElProject 作为项目的根目录。完成所有问题后,您现在应该会在 AllProjects 目录中看到新的项目文件夹,其中包含模板提供的所有内容:

AllProjects
└── ElProject
    └── <all the template's subfolders and files>

就这么简单!

根据模板的不同,您可能会看到它不仅包括一个好的目录树,还包括一些有用的文件,如。gitignore(从版本控制中排除文件),一个预先编写的自述文件,安装和需求文件以及更多好东西。

如果你想开始一个新的项目,比如说 超级机密项目 ,再次运行命令,在你的 AllProjects 目录下,回答提示,你应该会看到目录下添加的项目文件夹:

AllProjects
└── ElProject
    └── <all the project's subfolders and files>
└── super secret project
    └── <all the project's subfolders and files>

如果您需要任何额外的定制,您可以随时添加/删除/更改项目目录中的任何内容。但是,如果您一次又一次地进行相同的定制,那会怎么样呢?也许您更喜欢为您所做的每个项目创建 LaTex 报告,或者 PowerPoint 演示文稿,并且您厌倦了创建文件,从以前的项目中复制相同的结构,然后使用当前项目的信息来纠正它们。如果这是您的情况,那么请继续阅读下一节,我将介绍如何创建定制模板。

创建和自定义模板

从头开始创建模板

创建您自己的 cookiecutter 模板的第一步是用您希望我们的模板拥有的名称创建一个文件夹。您应该始终选择一个易于记忆并且能够描述使用该模板的项目类型的名称。不过对于本教程,我们将做完全相反的事情,并将我们的新模板命名为 dasTemplate

这个文件夹可以放在你电脑的任何地方,但是我建议你把所有的模板放在一起,比如放在文件夹 AllTemplates (如果你把所有的模板保存在一个容易访问的远程存储库中,比如Github,你会得到额外的分数)。现在,我们有以下目录:

AllTemplates
└── dasTemplate

现在,进入新的空文件夹 dasTemplate 开始创建你的模板。

我们希望在模板中重新创建的最基本的功能是能够创建一个以我们的项目命名的空文件夹。为此,intodas template添加下面两个完全相同的内容(包括花括号):

  1. 答。json 文件名为cooki cutter . JSON*(如果第一次,只需创建一个文本文件,但另存为。json 而不是。txt)*
  2. 名为***{ { cookiecutter . project _ name } }***的文件夹

因此我们的模板目录现在看起来像这样:

AllTemplates
└── dasTemplate
     ├── cookiecutter.json
     └── {{cookiecutter.project_name}}

在使用模板之前,您需要打开 json 文件,并在其中编写以下内容:

{
"project_name": "default_name"
}

在解释它们之前,我们可以看看使用这个模板会给我们带来什么。

为此,转到您希望创建项目的位置(例如目录 AllProjects ),并传递与我们使用cookiecutter-data-science模板时相同的命令。然而,这一次不是提供存储库的 url,而是简单地传递模板的路径(除非您也想从 GitHub 使用模板,然后传递存储库的 url…):

cookiecutter path/to/template

例如(如果你像我一样运行 windows):

cookiecutter C:\Users\USer1\Documents\AllTemplates\dasTemplate

运行此命令时,您将得到以下提示:

project_name [default_name]:

你可能会认出这是我们在。json 文件。现在,只需输入你的项目名称*,例如* ElProject 。之后,您应该会看到新的项目文件夹被添加到目录中:

AllProjects
└── ElProject

那么,我们在这里做了什么?这个问题的答案最好一分为二。首先,可以将 cookiecutter.json 看作是我们希望用户在创建新模板时收到的提示文档。正如我暗示的那样。json pair 只是在您没有对提示提供任何答案时使用的默认值。反过来,可以在模板中的任何位置使用这些参数,语法为{{cookiecutter.parameter}}。从这个意义上来说,当我们创建文件夹{{cookiecutter.project_name}}时,我们告诉 cookiecutter 寻找提示 project_name 的答案,并在创建新的单个项目时使用它作为文件夹的名称。

这意味着当我早些时候告诉你你必须完美地复制基本模板时,这并不完全正确。在。json 文件,您实际上可以编写如下内容:

{
"bestCheese": "Cambozola"
}

和模板结构:

AllTemplates
└── dasTemplate
     ├── cookiecutter.json
     └── {{cookiecutter.bestCheese}}

只要您在模板中用双花括号(例如 {{cookiecutter.parameter}})写的内容与 json 文件中的参数匹配,那么 cookiecutter 就会为您完成剩下的工作。

添加到模板

我们现在可以通过选择我们希望模板在项目的文件夹中重新创建的文件来开始慢慢增加我们的模板。在 cookiecutter 中这样做是非常直观的:

您放置在模板中的任何文件和文件夹将按原样出现在使用该模板启动的单个项目中。不仅文件和文件夹会在那里,而且它们的内容也会在那里。也就是说,任何写在里面的东西,每一个图像,所有的东西!

假设您希望您的项目从根目录下的 README.md 开始,并且可能有一个 aboutme.txt 文件用于简要描述您和一些联系信息,以及一个 reports 文件夹,其中有一个 LaTex 报告的模板:

AllTemplates
└── dasTemplate
     ├── cookiecutter.json
     └── {{cookiecutter.project_name}}
          ├── README.md
          ├── aboutme.txt
          └── reports
              └── monthlyReport.tex

在您希望创建项目的目录中运行命令,您应该看到:

AllProjects
└── ElProject
    ├── README.md
    ├── aboutme.txt
    └── reports
        └── monthlyReport.tex

超级容易,但是有点无聊。让我们通过为文件名及其内容使用一些新的可变参数来使它更加个性化。让我们要求将项目的简短描述添加到不同项目的 README.md 中,aboutme.txt 以单个项目的作者命名,并显示项目的名称和描述。tex 文件。我们将首先修改。json 文件来请求所有这些新信息:

{
"project_name": "default_name",
"description": "short description",
"author": "Dr. Myfull Name",
"email": "reachme@mail.com"
}

现在让我们用花括号来修改文件和文件夹。新模板目录应该如下所示:

AllTemplates
└── dasTemplate
     ├── cookiecutter.json
     └── {{cookiecutter.project_name}}
          ├── README.md
          ├── {{cookiecutter.author}}.txt
          └── reports
              └── monthlyReport.tex

README.md 可能如下所示:

# {{cookiecutter.project_name}}
This is a great README file by {{cookiecutter.author}} ({{cookiecutter.email}})

The project is about:
{{cookiecutter.description}}

对于 latex,语法可能会有一些变化(这就是我选择它作为例子的原因),因为 LaTex 在自己的语法中使用了花括号。请注意下面的月度报告示例:

\documentclass{article}%%%%% Packages %%%%%
\usepackage{graphicx}
\usepackage{glossaries}%%%%% Graphics %%%%%
{% raw %}
\graphicspath{{../figures/}}
{% endraw %}%%%%% Glossary %%%%%
\makeglossaries
\loadglsentries{glossary}%%%%% Project details %%%%%
\title{ {{cookiecutter.project_name}} }
\author{ {{cookiecutter.author_name}} }
\date{\today}

我想让你注意的第一件事是项目细节部分。对于标题和作者,双花括号与包围它们的花括号之间用空格隔开。这不是纯粹的审美。在某些情况下,如果你写的时候没有空格,cookiecutter 将不能正确地创建你的文件夹。因此,我建议当您遇到这种情况时,无论您是在 Latex 中工作还是在其他地方工作,都要一步一步地尝试您的模板。

第二个要注意的是图形部分。也许你已经问过自己“如果我需要在文件中使用双花括号怎么办?”。如果这是您的情况,并且您要正常进行,cookiecutter(或者更恰当地说,它所基于的语言)很可能会向您抛出一个错误,认为您正在尝试使用一个很可能不存在的变量或命令。您可以简单地通过用{% raw %}和标记{% endraw %}(一个用于打开,一个用于关闭)将它包围起来,从而避开这个问题。在 raw-endraw 之间的所有文本将出现在单个项目上,就像它在模板中输入的一样;花括号什么的。

这不是我们能用 cookiecutter 开发的唯一额外功能。我们将在下一节看到更多有用的命令。

利用 Jinja 语法增强你的模板

到目前为止,我们看到了如何用我称之为“花括号”的语法创建可复制的模板。这个语法实际上属于模板语言 Jinja ,它在幕后运行 cookicutter 程序。如果你和 Django 或者 Liquid 一起工作过,你可能会熟悉这种语言的范围和应用。

一个人可以用 Jinja 做的所有事情的详细解释已经超出了这篇文章的范围。相反,我将只提到一个特别有用的基本技巧,它可以帮助提升你的模板。

假设,您通常在三个不同的团队中工作,并且您希望您的模板指定单个项目实际上属于哪个团队,以及每个团队的名称列表。您可以简单地在您的。json 调用“project_team”并在每次使用模板时填写团队名称。但是,您可能会拼错名称,这将导致意想不到的和/或恼人的错误。最重要的是,如果你每次都简单地写下团队名称,你将如何更新你的文件作为你答案的一个功能?

您可以做的是设置。json 提供了一个选项选择,而不是一个完全开放的字段,并使用良好的 ol’ if 语句告诉模板根据您的答案打印哪个团队的列表。为此,首先修改。json 文件,只需简单地将所有选项添加到括号中通常会放置默认答案的位置(现在默认情况下,将采用括号中的第一个选项):

{
"project_name": "default_name",
"description": "short description",
"author": "Dr. Myfull Name",
"email": "reachme@mail.com",
"project_team": ["Great Team", "Team of Legends", "The Other Team"]
}

现在,让我们根据对提示的回答,将团队成员列表添加到 README.md 中:

# {{cookiecutter.project_name}}
This is a great README file by {{cookiecutter.author}} ({{cookiecutter.email}})

The project is about:
{{cookiecutter.description}}

## Team:
{% if cookiecutter.project_team == 'Great Team' %}
* Max E.Mumm
* Jack Pott

{% elif cookiecutter.project_team == 'Team of Legends' %}
* Armando E. Quito
* Al E.Gater

{% elif cookiecutter.project_team == 'The Other Team' %}
* May B.Dunn
* Justin Thyme
{% endif %}

如果您运行该命令来创建一个新项目,您应该会看到根据您所选择的团队,README.md 的团队成员列表会有所不同。例如,如果我与“伟大的团队”一起工作,项目文件夹中的自述文件将如下所示:

# ElProject
This is a great README file by Dr. Myfull Name (reachme@mail.com)

The project is about:
short description

## Team:

* Max E.Mumm
* Jack Pott

有了这个新增的功能,您现在应该能够创建非常灵活的模板,允许您使用相同的共享结构快速启动新项目,而无需更改所有的小细节。

如果您一直往下读,希望您现在已经对如何使用 cookiecutter 模板有了一个很好的想法。你现在可以使用预制的,根据你的需要定制或者创建你自己的。如果您希望我介绍更强大的 Jinja 命令来进一步提高您的工作效率,或者有任何评论/问题,请随时在社交媒体上留下评论或加入我。模板快乐,我现在要去吃些饼干了…

原载于https://matic derini . github . io/blog/tutorial/2020/04/13/cookiecutter . html2020 年 4 月 13 日。

面向数据科学的项目管理 Jupyter 扩展

原文:https://towardsdatascience.com/cookiecutter-plugin-for-jupyter-easily-organise-your-data-science-environment-a56f83140f72?source=collection_archive---------24-----------------------

数据科学、编程、项目管理

这是一个 Cookiecutter Jupyter 扩展,可以在没有终端的情况下轻松组织项目文件夹

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

格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片

开始之前

在这篇博客中,我们将讨论我的一个个人资料库:

Jupyter Launcher 中的一个类似 Cookiecutter 的扩展

在博客的末尾可以找到知识库的链接。

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

快速演示

Cookiecutter 如何提高 Jupyter?

毫无疑问,Jupyter 是数据科学/机器学习环境的一个组成部分,无论是笔记本电脑、实验室还是中枢。它们每个都有自己的好处,笔记本是最友好的定制插件,Jupyter Lab 使多台笔记本工作变得容易,而 Jupyter Hub 支持多用户和更多。

然而,Jupyter 的一个弱点是它没有组织项目的工具。

这就是厨师的用武之地。对于以前使用过它的人,单击此处的跳过这一部分。另外, cookiecutter 是一个 python 包,它允许我们只用几行代码就创建一个标准的文件夹结构。最棒的是,你不需要遵循 cookiecutter 的标准。看看这里的其他格式的

$ pip install cookiecutter$ cd path_to_my_project_folder# pick your own flavour of cookie
$ cookiecutter https://github.com/drivendata/cookiecutter-data-science

瞧啊。你现在应该有一个标准文件夹结构准备好了。在我的例子中,目录看起来像:

├── README.md          <- Front page of the project. Let everyone 
│                         know the major points.
│
├── models             <- Trained and serialized models, model
│                         predictions, or model summaries.
│
├── notebooks          <- Jupyter notebooks. Use set naming
│                         E.g. `1.2-rd-data-exploration`.
│
├── reports            <- HTML, PDF, and LaTeX.
│   └── figures        <- Generated figures.
│
├── requirements.txt   <- File for reproducing the environment
│                         `$ pip freeze > requirements.txt`
├── data
│   ├── external       <- Third party sources.
│   ├── interim        <- In-progress intermediate data.
│   ├── processed      <- The final data sets for modelling.
│   └── raw            <- The original, immutable data.
│
└── src                <- Source code for use in this project.
    ├── __init__.py    <- Makes src a Python module. 
    │
    ├── custom_func.py <- Various custom functions to import.
    │
    ├── data           <- Scripts to download or generate data.
    │   └── make_dataset.py
    │
    ├── features       <- Scripts raw data into features for
    │   │                 modeling.
    │   └── build_features.py
    │
    ├── models         <- Scripts to train models and then use
    │   │                 trained models to make predictions.
    │   │                 
    │   ├── predict_model.py
    │   └── train_model.py
    │
    └── viz            <- Scripts to create visualizations.            
        └── viz.py

为什么我们需要一个库克式的 Jupyter 扩展?

想象一下,如果你正在 JupyterLab 做一个项目。

灵感来袭;你想开始一个新项目。你是做什么的?

A.启动一个终端;通过 Cookiecutter 创建另一个标准文件夹目录;在端口 8890 启动另一个 JupyterLab 来处理这个项目,因为您已经有 8888 和 8889 运行两个不同的 JupyterLab 会话。

B.在同一个 JupyterLab 会话中,开始处理 Untitled29.ipynb

C.算了吧;开始另一个项目太麻烦了,哼!

我们都知道答案,不是 B,就是 c。

那么 Cookiecutter 有什么问题呢?

Cookiecutter 是一个非常非常非常训练有素的数据科学家开始一个新项目的惊人的组织工具

换句话说,在你和你下一个定义良好的标准文件结构的项目之间有太多的点击。

JupyterLab 和 JupyterHub 的 Cookiecutter 插件

如果 Jupyter Launcher 中有一个神奇的按钮可以在当前文件夹中创建一个 Cookiecutter 文件结构呢?

Jupyter Cookiecutter 扩展简介:

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

典型的 JupyterLab / JupyterHub 发射器。信用: Ellip

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

一个神奇的 JupyterLab / JupyterHub 发射器!致谢:陈奕迅

首先,我们将使用官方 JupyterLab 服务示例,它已经附带了在类型脚本中定制扩展的必要组件。这个博客将关注这个插件如何改进我们的工作流程,另外,你可以访问这个库,所以我们不会深入代码。但是如果你有任何问题,请随时给我留言!

本质上,这个插件所做的就是首先跟踪你当前的文件夹。假设我们创建了一个名为example_project的新文件夹,双击进入它,你应该可以在你的启动器的笔记本部分看到example_project

一旦你点击了 Cookiecutter 模板按钮,它就会创建一个如下所示的文件夹结构。给它几秒钟,如果什么都没有出现,刷新它;魔法需要时间。

├── README.md          <- The top-level README for 
│                         developers using this project.
│
├── data
│   ├── external       <- Third party sources.
│   │   └── .gitkeep
│   ├── interim        <- In-progress intermediate data.
│   │   └── .gitkeep
│   ├── processed      <- The final data sets for modelling.
│   │   └── .gitkeep
│   └── raw            <- The original, immutable data.
│       └── .gitkeep
│
├── docs               <- A default Sphinx project; see 
│   │                     sphinx-doc.org for details
│   └── .gitkeep
│
├── environment.yml    <- Conda environment file
│
├── logs               <- Folder for storing logging outputs
│   └── .gitkeep
│
├── models             <- Trained and serialized models, model 
│   │                     predictions, or model summaries
│   └── .gitkeep
│
├── notebooks          <- Jupyter notebooks. Naming convention 
│   │                     is a number (for ordering), the
│   │                     creator's initials, and a short `-` 
│   │                     delimited description, e.g.
│   │                     `1.0-jqp-initial-data-exploration`.
│   └── .gitkeep
│
├── references         <- Data dictionaries, manuals, and all 
│   │                    other explanatory materials.
│   └── .gitkeep
│
├── reports            <- HTML, PDF, and LaTeX.
│   └── figures        <- Generated figures.
│       └── .gitkeep
│
├── requirements.txt   <- The requirements file for reproducing 
│                         the analysis environment, e.g.
│                         generated with `pip freeze > 
│                         requirements.txt` or `pipreqs src`
│
├── setup.py           <- Fill in the file to make this project 
│                         pip installable with `pip install -e`
│
├── sql                <- SQL scripts, stored procedures etc.
│   └── .gitkeep
│
├── src                <- Source code for use in this project.
│   └── __init__.py    <- Makes src a Python module
│
├── tests              <- Scripts for unit testing
│   └── .gitkeep
│
└── .gitignore

这种特定的文件夹结构有几个关键特性:

  1. 基于 Cookiecutter 数据科学模板的扩展文件结构,增加了类似tests的文件夹,用于促进测试驱动开发,sql用于鼓励在pickle上使用数据库(感谢我的同事坚持将这个sql子文件夹放在适当的位置!),logs文件夹,用于跟踪所有的日志输出等。
  2. 带有.gitkeep文件,以确保所有的文件夹都会被 git 跟踪,即使你没有任何文件在tests文件夹下(记住,默认情况下 git 不会跟踪空文件夹)
  3. 自带一个默认的 Python [.gitignore](https://github.com/github/gitignore/blob/master/Python.gitignore),所以你不需要自己去获取它

以上所有,在一个按钮内!

现在你没有任何借口不开始整理你的项目文件夹了!(至少在项目的最开始)

限制和注意事项

  1. 这个插件只在JupyterLab >= 2.0.0JupyterHub >= 1.2.0上测试过。
  2. 再说一次,魔法需要时间。因此,在所有文件和文件夹生成之前,尽量不要创建空文件。
  3. 如果文件/文件夹已经存在,将出现Invalid response: 409 Conflict错误。你最终会得到一个Untitled Folder或者Untitled.py
  4. 这个插件现在有一个硬编码的文件结构。如果你需要不同的结构,你需要在安装插件之前更新jupyter-cookiecutter-extension/src/index.ts
  5. 这是一个类似于 Cookiecutter的插件,它没有 aws、s3、许可证等其他配置。
  6. 当您在所有项目的父目录中启动 Jupyter Lab 或 Jupyter Hub 时,这个插件工作得最好。例如,我的项目文件夹的本地父目录是/projects,这意味着我应该在/projects启动 Jupyter,而不是实际的项目目录。
  7. 该存储库附带了 Docker 安装指南。如果你想把它作为你的 Docker 开发环境,Docker 文件应该会包含你!

贮藏室ˌ仓库

$ git clone https://gitlab.com/louis.chanloyuet/jupyter-cookiecutter-extension
$ cd jupyter-cookiecutter-extension
$ git fetch && git checkout 1.0.0

** [## Louis Chan / Jupyter Cookiecutter 扩展

一个最小的 JupyterLab / JupyterHub 扩展,用于从 Jupyter Launcher 创建 cookiecutter 模板。

gitlab.com](https://gitlab.com/louis.chanloyuet/jupyter-cookiecutter-extension)

你可能也喜欢这个

[## 熊猫数据帧上的高效条件逻辑

是时候停止过于依赖。iterrows()和。应用()

towardsdatascience.com](/efficient-implementation-of-conditional-logic-on-pandas-dataframes-4afa61eb7fce) [## Python 中高效的根搜索算法

在 Python 中实现高效的寻根和优化搜索算法

towardsdatascience.com](/mastering-root-searching-algorithms-in-python-7120c335a2a8)

在你走之前

感谢阅读这篇博客!成为一名训练有素的数据科学家绝非易事;我必须承认我自己从来就不是一个人( 道歉 )。希望这个插件能降低每个人养成一些好习惯的门槛,让我们的代码库更有条理,更易维护。如果你从这里学到了新的东西,请告诉我!欢迎在评论中留下你的评论和问题。直到下一次,保持安全,继续编码,并成为我的客人分叉库。

再见!

[## Louis Chan—FTI Consulting | LinkedIn 数据科学总监

雄心勃勃的,好奇的和有创造力的个人,对分支知识和知识之间的相互联系有强烈的信念

www.linkedin.com](https://www.linkedin.com/in/louis-chan-b55b9287/)**

数据科学的烹饪方法

原文:https://towardsdatascience.com/cooking-s-recipe-for-data-science-7f1ebf9828a5?source=collection_archive---------46-----------------------

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

马丁·范·登·霍维尔在 Unsplash 上的照片

如何将现场可靠性工程(SRE)整合到您的数据科学团队、产品和服务中

D 记者:所有表达的观点都是我个人的。为一些非常有品味的烹饪双关语做好准备!

在这篇文章中,我站点可靠性工程中提炼出关键思想:谷歌如何运行生产系统 & 站点可靠性工作手册将它们与数据科学融合*。我为为什么实施站点可靠性工程(SRE)实践不仅会增强您的数据科学产品的可靠性,而且还会提高您的数据科学团队的整体效率提出了一个论点。然后,我将详细介绍如何将 SRE 集成到数据科学团队、产品和服务中。*

当我鼓励你通读整篇文章的时候,你可以随意地从这个想法的拼盘取样!以下是菜单上的内容:

菜单

0.设置表:运行示例

  1. 前菜/开胃菜:起始题
    1.1SRE 是什么?
    1.2 为什么我希望 SRE 加入我的数据科学产品生命周期?
    1.3 我能在不雇佣专门的现场可靠性工程师的情况下实施 SRE 吗?
  2. 关键成分:关键成分 SRE
    2.1 服务水平目标(SLOs)
    2.2 服务水平指标(SLIs)
    2.3 错误预算
    2.4 错误预算策略
    2.5 监控
    2.6 告警
    2.7
  3. 穿上你的思维“无拘无束”:SRE 指导原则要牢记3.1有些 SRE 总比没有 SRE 好
    3.2 事情会出乱子,我们所能做的就是准备!
    3.3 SRE 指标不是玩指责游戏的工具
  4. 在没有厨师的情况下经营厨房:在没有专职现场可靠性工程师的情况下实施 SRE4.1从简单做起,从小做起
    4.2 采用分担责任模式
    4.3 从一开始就通过自动化消除辛劳
  5. 要点:一些最终想法

0.摆桌子

一个运行实例

为了说明关键思想,我将使用下面的运行示例:

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

由作者使用 draw.io 创建

你是一个网站的自豪的产品所有者,该网站允许用户上传食品的图像,并使用你最先进的深度学习模型来确定食品是否是三明治。您希望将 SRE 集成到三明治分类服务的产品生命周期中。对于本文,我们将忽略前端相关的 SRE,而专注于服务于机器学习模型的后端。

1.开胃菜/开胃品

T 何出题

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

安吉拉·贝利在 Unsplash 上拍摄的照片

1.1 什么是 SRE?

SRE 是一个相当宽泛的概念,因此,如果你尝试谷歌搜索“SRE”,你可能会失望地发现,并没有一个明确的公认的功能定义。那么,让我给你我的定义,一个我们可以马上开始工作的定义:

站点可靠性工程是指原则、实践和过程的框架,主要目标是提高(数字)产品和服务的可靠性。

1.2 为什么我希望 SRE 出现在我的数据科学产品生命周期中?

  • 为了提高数据科学产品的可靠性和稳健性 通过实施可靠的 SRE 原则和实践,您可以采取更有条理和更主动的方法来提高产品的稳健性,而不是在出现问题时采取混乱和被动的方法。
  • 在维护旧东西和开发新东西之间划分优先级 SRE 是一种非常数字化和数据驱动的软件运营方法。使用 SLO、错误预算、错误预算政策、监控和警报,您可以有非常明确的标准来确定您的团队是否应该投入更多时间来维护和改进三明治分类器,或者他们是否应该开发一种用于分类其他类型食品的新功能。
  • 为了提高产品开发过程的质量 我认为,当你将 SRE 文化灌输到你的团队中时,你的团队的开发实践和文化就会得到改善。随着开发人员变得更加“SRE 意识”,他们将倾向于围绕构建健壮可靠的数据科学产品来优化他们的开发实践,一直到编写代码、进行代码评审和提出 QA 测试案例的微观层面。

1.3 我可以在不雇佣专门的站点可靠性工程师的情况下实施 SRE 吗?

简答:有!
长回答:看第 4 节(经营没有厨师的厨房)但先通读第 2 节。

2.关键成分

SRE 的关键部件

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

照片由 Calum LewisUnsplash 上拍摄

以下是您需要了解的关键概念/组件

2.1 服务水平目标(SLO)

SLO 可以说是 SRE 最重要的概念。SLO 为您的服务可靠性指定了一个目标水平,通常定义了一个隐含的时间段。SLO 是以客户为中心的阈值,量化客户对您的数据科学产品满意的可靠性水平。例如,在三明治分类服务的情况下,我们可能在 1 个月的时间内有以下 2 个 SLO:

  • 可用性:99.9%的可用性
  • 延迟:99%的请求延迟 500 毫秒

2.2 服务水平指标(SLIs)

sli 是帮助量化 SLO 的特定指标。SLI 通常是两个数字的比值:

(好事发生次数)/(总件发生次数)

对于三明治分类器,我们的 sli 应该是这样的:

  • 可用性:非 5XX API 请求占总请求的比率
  • 延迟:快于 500 毫秒的请求占总请求的比率

这样的度量标准是很好的 sli,因为它们很直观——0%表示一切正常,100%表示一切正常。

2.3 误差预算

误差预算= 100%-SLO。对于三明治分类器,这意味着假定每月可用性 SLO 为 99.9%,误差预算为 0.1% (43 分 12 秒)。错误预算是我们将围绕其设置警报和错误预算策略的指标。误差预算在其他方面也很有用。例如,我们可以根据事故消耗了多少月度错误预算来量化停电事故的严重程度。

2.4 错误预算政策

根据站点可靠性工作手册,错误预算政策定义了一旦错误预算耗尽或接近耗尽时各种利益相关者将采取的具体步骤。对于我们的三明治分类器示例,误差预算策略中的一些关键动作可能包括以下内容:

  • 开发模型的数据科学家/机器学习工程师将优先修复生产错误,直到服务在预算内,而不是开发新的模型来对披萨进行分类
  • 将强制执行代码冻结,以停止对生产部署的任何进一步更改,从而最大限度地降低进一步的风险。只有当有足够的误差预算时,才允许进行更改。

2.5 监控

监控通常包括仪表板,以人类可读的时间序列形式显示关于关键指标的信息。在发生事故时,监控仪表板应该能够帮助您回答 3 个主要问题——发生了什么,什么时候发生的,为什么会发生?以下是您应该监控的指标/组件列表:

  • SLIs 和错误预算:对于我们的三明治分类器,我们应该有仪表板来显示按状态代码(2XX、4XX、5XX)、p99 延迟和当月剩余错误预算分组的请求数量。
  • 模型性能度量:对于我们的三明治分类器,我们应该监控被分类为三明治与非三明治的图像的比率。这将有助于检查模型是否过拟合/欠拟合,以及是否需要在更好的数据集上重新训练或替换模型。(对于像欺诈检测这样的用例来说,这绝对至关重要!)
  • 依赖关系:如果三明治分类器依赖于一个外部数据库,仪表板应该监控这个数据库的健康和性能。
  • 预期变化:如果三明治分类模型已经被重新训练,将热狗分类为三明治,那么我们应该通过仪表板上的图表捕获并确认这一变化的成功部署。
  • **流量&资源使用:**仪表板应该捕获流量、吞吐量和资源使用,比如 CPU 和内存。这是为了确保在使用量增加的情况下(典型的新数据科学产品就是这种情况),资源能够迅速扩展以处理更大的流量。如果您想采用某种形式的自动缩放,流量仪表盘也有助于识别流量模式。

2.6 警报

事件触发警报,警报触发操作。警报的目的是在重大事件发生时通知正确的人正确的事情。例如,如果在部署一个新的三明治分类模型后,延迟突然达到峰值并持续半个小时,则需要提醒相关人员采取缓解措施。警报依赖于监控和阈值来确定何时、向谁和向什么发出警报。

2.7 支持流程

最大化其他 SRE 组件的效用产量通常需要 3 个关键过程:

  • **事故升级协议:**对于如何处理生产事故,最好有一个周密的计划。该协议应该包括诸如谁(开发人员、技术负责人还是产品所有者?)应该在(10%,25% 50%的误差预算用尽时采取行动?)以及应该采取哪些具体行动。在我看来,这些信息也应该纳入错误预算策略,并且应该与警报紧密联系在一起。
  • **事后分析:**无可指责的事后分析对于从事故中吸取教训至关重要,从而提高未来的可靠性和稳健性。在将 SRE 集成到您的数据科学产品生命周期的早期阶段,如何进行事后分析将在设定基调方面发挥至关重要的作用。
  • **SLO & SLI 修订:**根据您的项目生命周期的速度和 SRE 框架的成熟度,将需要定期修订您的 SLO 目标和 SLI,以确保 SRE 以可持续的方式实施,因为您的用户和利益相关者的要求会随着时间的推移而变化。

一旦你脱离了建立一些粗略的 SRE 实践的初始阶段,第四个隐含但关键的过程/组件是一个经过深思熟虑的随叫随到的设置。用 SRE 工作手册的话说,

…随叫随到意味着在设定的时间段内随时可用,并且在这段时间内随时准备以适当的紧急程度响应生产事故。

您可能希望一些员工在工作时间之外随叫随到,以确保您服务的可靠性。您团队中的这些随叫随到的成员应该有一个详细的分步指南,以随叫随到的行动手册的形式说明在发生事故时应该做什么,并且应该可以访问相关的技术文档、错误预算政策和上报协议。你可以在这里阅读更多相关信息

3.穿上你的思维“无沿帽”

牢记 SRE 指导原则

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

照片由юліядубинаUnsplash

3.1 有 SRE 总比没有 SRE 好

我认为部分实施 SRE 总比什么都没有好。例如,对于三明治分类服务,您可能没有制定出精确的错误预算政策,但通过一些基本的 SLO、监控和警报,至少您将能够在网站关闭时主动修复问题,而不是被大量用户投诉所通知。最好是定义一个理想的 SRE 实现的愿景,然后迭代地、逐步地向它前进。

3.2 事情会出错,我们能做的就是准备!

一个或多个组件在某个时间点发生故障导致可用性低于 100%的概率不为零。如果你设法为你的顾客创造了一个 100%可靠的体验,并希望保持这种可靠性水平,你就永远无法更新或改进你的服务。因此,100%的可靠性是错误的目标。另一个警告是,当你从 99%到 99.9%再到 99.99%的可靠性时,每增加 9 个可靠性就会增加成本,但是对你的客户来说边际效用稳定地趋近于零。

3.3 SRE 指标不是玩指责游戏的工具

通过将员工的绩效 KPI 与这些指标挂钩,可以很容易地利用 SRE 的数字数据驱动方法。然而,从长远来看,这确实是有害的。它会延续一种适得其反的相互指责的文化。你想要的是一种责任共担的文化,通过系统地实施 SRE 原则、实践和流程来减少和消除事故和错误。

4.经营一个没有厨师的厨房

在没有专职现场可靠性工程师的情况下实施 SRE

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

shruti dadwalUnsplash 上拍摄的照片

4.1 从简单开始,从小处着手

  • 从对您的客户最重要的 1 到 3 个基本 SLO 开始,如可用性和延迟。随着时间的推移,可以添加几个 SLO 来提高整个产品的健壮性。
  • 设定合理的目标,比如 90%,而不是像 99.9999%这样非常严格的目标。随着时间的推移,这些目标可以逐步细化和收紧。
  • 为您的 SLO 设置一些简单的控制面板,并提供基本的警报来捕捉事件和关键趋势。大多数云提供商都有便捷的监控和警报解决方案。如果没有,设置一个简单的 Grafana-Prometheus-alert manager 堆栈并不是一件非常繁琐的任务。随着时间的推移,可以添加更多的监控和警报。
  • 不要马上正式采用 SRE 的实践,先试运行一段时间,也许是一个季度,让你的团队尝试模仿理想的升级、事后分析和 SLO 修订。

4.2 采用分担责任模式

虽然 SLO 通常需要由产品所有者(例如:CTO 或产品经理)负责,但 SRE 不能集成到您的产品生命周期中,除非每个人都参与进来。“每个人”包括所有的利益相关者——数据科学家、机器学习工程师、DevOps、QA、产品经理、业务请求者等。让每个人都参与到理解和规划将 SRE 集成到您的数据科学产品生命周期中。分阶段推出你的 SRE。将生产系统划分为组件(例如:前端、机器学习模型、后端、基础架构),并让负责这些组件的不同人员通过事件升级协议一起工作。进行上报演习和事后分析,以加强团队中的 SRE 文化。

4.3 从一开始就通过自动化消除辛劳

SRE 的一个重要概念是消除辛劳。辛劳指的是重复的、平凡的维护类任务,很少或根本不需要创造性的解决问题。在我看来,从一开始就应该优先考虑消除劳累。在 SRE 实施流程中寻找可能实现自动化的机会。把它们写下来!虽然最初可能需要更长的时间来自动化一项任务,但这是一项可行的投资,因为随着 SRE 集成在您的团队、产品和服务中的扩展,这种辛劳可能会成为一项巨大的负债。

5.外卖食品

一些最后的想法

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

安布尔·恩格尔在 Unsplash 上拍摄的照片

当谈到理解和实现 SRE 时,有许多问题需要解决。在数据科学领域,深度学习模型等黑盒模型带来的不确定性增加了如何定义 SLO、警报和升级策略的复杂性。我的建议是不要焦虑,开始行动吧!就像你的机器学习模型一样,你和你的团队也会随着经验的增加而变得更好。

见见厨师!

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

艾西瓦娅·普拉巴特

嗨!我是艾西。我名字的前两个字母是“AI”,AI 和机器学习是我热爱的。我目前是新加坡的高级数据科学家,也是 GeorgiaTech 的硕士生。你可以通过 LinkedIn 联系我。

有 Pi 的酷项目

原文:https://towardsdatascience.com/cool-projects-with-a-pi-7bd4792c6e90?source=collection_archive---------12-----------------------

树莓派入门

Raspberry Pi 是一系列低成本的单板计算机,和你的信用卡一样小。自 2012 年第一个版本问世以来,它们在世界各地的爱好者和制造商中非常受欢迎。同年,Raspberry Pi 赢得了 T3 的年度创新奖。

截至 2019 年底,已售出约 3000 万个树莓 Pis。— 询问者

在 8 年的时间里,树莓派经历了大量的迭代和改进。下面是一个表格,显示了到今天为止已经发布的不同型号的树莓 Pi。

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

几代发布的树莓 Pi 模型(来源

使用 Raspberry Pi 的项目

这里列出了一些使用 Raspberry Pi 的有趣项目,让您了解人们是如何使用它的:

家庭自动化

基本物体和运动检测

仪表板摄像头

流媒体服务器

带有红外近程传感器的 WhatsApp 监控摄像机

在这篇文章中,我将向你展示如何建立你的 树莓派 3B+ 模型,这样你就可以开始使用它来创建你自己的项目。

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

树莓派 3B+ ( 图片来源)

树莓派 3B+规格

覆盆子 Pi 3B+是覆盆子 Pi 3 系列的最终版本。

处理器: Broadcom BCM2837B0、Cortex-A53 64 位 SoC @ 1.4 GHz
内存: 1GB LPDDR2 SDRAM
**联网:**千兆以太网 over USB 2.0(最大吞吐量 300 Mbps)、2.4GHz 和 5GHz IEEE 802.11.b/g/n/ac 无线局域网
**蓝牙:**蓝牙 4.2、蓝牙低能耗(BLE)【中 相机串行接口(CSI)、显示器串行接口(DSI)
尺寸: 82mm x 56mm x 19.5mm,50g
**工作温度:**0–50°C
**生产寿命:**将至少持续生产到 2023 年 1 月

您将需要的东西:

  1. 树莓派 3B+
  2. sd 卡
  3. SD 读卡器
  4. 以太网电缆

您需要下载的操作系统:

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

图像来源

  1. Raspbian Buster :这是我们将要安装在树莓派 3B+上的操作系统。请下载 Raspbian Buster 带桌面和推荐软件

您需要下载的软件:

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

蚀刻机软件(图像源)

  1. Etcher 是一个免费的开源工具,用于编写图像文件。iso 和。img 到存储介质上,以创建动态 SD 卡和 USB 闪存驱动器。

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

VNC 浏览器(图片来源)

  1. VNC 浏览器: VNC 浏览器是一款允许远程访问和控制启用了 VNC 服务器的设备的软件。

步骤:

  1. 使用 SD 读卡器将 SD 卡插入您的 PC/笔记本电脑。
  2. 格式化 SD 卡。
  3. 使用 Etcher 软件将 Raspbian buster 图像文件刻录到 SD 卡。

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

使用蚀刻机将 Raspbian 刻录到 SD 卡

4.通过在 SD 卡的根目录下创建一个名为 ssh 的空白文件,启用 ssh 以便您可以远程访问它。

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

将 ssh 文件添加到 SD 卡的根目录

5.从 PC/笔记本电脑中弹出 SD 卡,将其插入 Raspberry Pi,接通电源打开 Raspberry Pi。

6.使用以太网电缆将 Raspberry Pi 连接到 PC/笔记本电脑。

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

树莓派 3B+与以太网电缆和电源电缆连接

7.使用终端从您的 SSH 到 Pi。输入以下命令:

ssh pi@raspberrypi.local

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

8.系统将提示您输入密码。输入默认密码(raspberry)。

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

9.现在,使用以下命令在 Raspberry Pi 上启用 vncserver:

vncserver

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

10.从您的 PC 上,打开 VNC 浏览器,并添加树莓 Pi 的 ip 地址,以远程连接到它。

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

11.现在从远程访问,连接到 wifi,这样您就可以访问它,而不必使用以太网电缆连接到 PC。

全部完成!您的覆盆子 Pi 3B+现在可以使用了。

觉得这个帖子有帮助? 在下面留下你的想法作为评论。

最初发表于www.xailient.com/blog

希望在树莓派上实现实时人脸检测?看看这篇帖子

想在树莓派上实现实时人脸跟踪吗?看看这个帖子

更多故事:

在你的 App 上集成人脸检测

在计算能力有限的设备上运行深度学习计算机视觉的挑战

你现在需要从云计算转向边缘计算!

关于作者

Sabina Pokhrel 在 Xailient 工作,这是一家计算机视觉初创公司,已经建立了世界上最快的边缘优化对象检测器。

使用 pd-replicator 复制/粘贴数据帧

原文:https://towardsdatascience.com/copy-paste-a-dataframe-with-pd-replicator-24e625fc9d53?source=collection_archive---------87-----------------------

数据科学可能涉及在不同平台之间移动大量数据。pd-replicator 试图使(部分)操作尽可能简单!

数据科学是非常迭代的。这些迭代可能涉及不同平台之间的大量来回数据。也许你从你的 BI 工具中提取一些数据,在 Jupyter 中运行一些分析,然后将输出转移到电子表格中与你的队友分享。然后,你发现你需要修复的东西,并最终再次运行整个事情。

问题是,当你摆弄这些数据的时候,你在一些本质上无聊的事情上失去了精神能量/健康。我构建了 pd-replicator 来帮助尽可能简单地将数据从 Jupyter 转移到电子表格中,这通常是我发现数据处理中最痛苦的部分。

概观

pd-replicator在 Jupyter 的数据帧输出中添加一个复制按钮,允许你将数据帧复制到你的剪贴板中,并允许它直接粘贴到电子表格中。

这是一个简单的pip包,只需要很少的设置就可以工作。它适用于所有类型的 Jupyter,包括 classic Jupyter、JupyterLab 和 Google Colaboratory。它也适用于本地和远程托管的设置,如 AWS SageMaker 或 JupyterHub!

下面是一个实际应用的例子:

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

复制数据帧后,将其粘贴到电子表格中就像选择一个单元格并点击粘贴一样简单:

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

一旦它被安装和设置好,使用它就像用replicator()包装你选择的数据帧一样简单,向输出添加一个复制按钮。copy button 小部件还有一个下拉菜单,可让您准确选择要从数据帧中复制的内容。

我在下面提供了一些说明,但它们也可以在自述文件中找到。

装置

可以通过pip进行安装:

> pip install pd-replicator

ipywidgets必须设置,以便按钮/下拉菜单正确显示:

> pip install ipywidgets 
> jupyter nbextension enable --py widgetsnbextension

要使用 JupyterLab,还需要一个额外的步骤:

> jupyter labextension install @jupyter-widgets/jupyterlab-manager

使用

replicator()环绕任何pandas数据帧/系列,以在数据帧/系列上方显示复制器复制按钮:

from pd_replicator import replicatorreplicator(df)

对于远程托管的实例,native选项应该设置为False:

from pd_replicator import replicatorreplicator(df, native=False)

这使用 JavaScript 通过你的浏览器复制到剪贴板,而不是pandas.to_clipboard()使用的系统复制方法。

反馈

如果您对pd-replicator有任何无法解决的问题,请在这里随意在 GitHub 上创建一个问题!

珊瑚漂白分析可视化——Tableau 还是 R ggplot?

原文:https://towardsdatascience.com/coral-bleaching-analysis-visualisation-tableau-or-r-ggplot-43e657c1cdbe?source=collection_archive---------49-----------------------

比较 Tableau 和 R ggplot 在珊瑚漂白分析中传递关键信息的有效性

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

UnsplashBawah Reserve 拍摄的照片

Tableau 和 R 是两种常见的数据可视化工具,前者因其简单和初学者友好的功能而闻名,后者因其广泛的用户交互可能性而闻名。我们如何决定哪种可视化工具更容易实现,或者在向相关利益相关者传达关键见解时更有效?这篇文章将探讨这个问题,并希望达成一个共同的共识。

资料组

我们将使用的数据集包含 2010 年至 2017 年大堡礁珊瑚白化的百分比。总共有 5 种不同的珊瑚类型,主要是蓝珊瑚、硬珊瑚、海扇、海笔软珊瑚。提供了位于大堡礁的 8 个不同地点/位置及其纬度和经度。

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

按作者分类的图像-数据集中前 6 条记录的输出

关键消息

在我们构建的每一个数据可视化中,都必须有一个我们希望传递给相关利益相关者的关键信息,以便在这些数据洞察的支持下采取适当的行动。在该数据集中,我们希望解决以下问题:

1.从 2010 年到 2017 年,哪一年哪一种珊瑚漂白最严重?

2.该地点的位置如何影响不同珊瑚类型的白化现象?

画面可视化

在确定了我们希望通过数据可视化传递的关键信息后,我们可以开始尝试可用的可视化类型,看看哪一种将更有效地传递信息,或者我们可以使用更正式的方法,如我之前在这里写的五张设计表(FDS)方法,来设计更好地满足需求的可视化。我喜欢 Tableau 的一点是,只需几个拖放操作,就能轻松构建不同的视觉效果。

对于我们的第一个关键信息,由于我们试图确定一个时间段(即哪一年)和一种特定类型(即珊瑚漂白的类型),我们可以使用一个彩色条形图,其中 x 轴可以是我们的年周期,y 轴是我们的衡量标准(即漂白的百分比),第三维的颜色代表珊瑚的类型。

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

作者图片—第一条关键信息的可视化表格

通过这种观想,我们知道以下几点:

在 2010 年的年,蓝珊瑚的平均脱色率最差,为的 34.90%** 。**

在 2011 年的年,海笔的平均漂白度最差,为 35.733%

在 2012 年到 2013 年蓝珊瑚的平均褪色率最差,为 37.546%

在 2013 年和 2013 年中,海蓬子的平均漂白度最差,为 36.666%

2014 年,硬珊瑚的平均脱色率最差,为 43.621%

对于 2015 年的年,硬珊瑚的平均脱色率最差,为 48.030%

对于 2016 年和 2016 年硬珊瑚的平均脱色率最差,为 55.239%

对于 2017 年度,海笔的平均漂白度最差,为 62.826%

现在,让我们尝试为我们的第二个关键信息提供见解。由于我们需要确定每个珊瑚点如何影响漂白的百分比,我们可以使用地图以及提供的纬度和经度来可视化。

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

作者图片—第二条关键信息的可视化表格

请注意,我们只能绘制二维可视化图(即,地图上圆圈的大小代表漂白百分比,圆圈的颜色代表不同的地点),结果总共绘制了 5 幅地图来代表我们的第三维,即珊瑚类型。通过这种观想,我们可以推断出以下几点:

对于蓝珊瑚,最差的平均白化发生在01站点 54.666% ,而03站点 16.221% 受影响最小。

对于海扇,最差的平均漂白发生在站点 0354.541% ,而站点 06 处受影响最小 8.977%

对于硬珊瑚来说,最差的平均白化发生在站点 0167.533% ,而站点 04 处受影响最小 11.044%

对于软珊瑚,最差的平均白化发生在01 号站点35.377% ,而08 号站点受影响最小的 15.385%

对于海围栏,最差的平均白化出现在站点 0358.559% ,而站点 06 处受影响最小 30.493%

R 图可视化

在 R ggplot 中构建可视化不那么简单,对初学者也不太友好,因为现在涉及到了编码。然而,它允许更多的可视化可能性,因为用户可以定制他们想要的图形类型。让我们试着在 R ggplot 中建立一个可以同时回答这两个关键信息的可视化。

# load library
library (ggplot2)# read data into R
coral_data<-read.csv("data.csv")
# rename the headers in data
names(coral_data)<-c("year","type","site","bleaching","longtitude","latitude")
# change the column "bleaching" to numeric form instead of % form
coral_data$bleaching<-as.numeric(sub("%","",coral_data$bleaching))# plot the graph
p<-ggplot(coral_data,aes(year,bleaching)) +
geom_point(aes(shape=type,color=type)) +
facet_grid(type~latitude+site,labeller=label_context)# adding smoother of polynomial type
q<-p+
geom_smooth(method="lm",color="black",size=0.2,formula=y~poly(x,2),se=FALSE)# adding theme to polynomial smoother graph
r<-q+
  theme_bw()+
  ylab('% of bleaching')+
  xlab('Year')+
  theme(legend.position = "bottom", legend.direction = "horizontal")r

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

按作者分类的图像—两个关键信息的 R ggplot 可视化

我们绘制了一个多面板(分面网格), x 轴为一年中的两个关键维度,y 轴为漂白百分比。珊瑚色,颜色增加了立体感。多面板允许我们引入第四维度,即站点的位置。

对于我们的第一个关键信息,我们能够粗略地识别出每年漂白率最差的珊瑚类型。当然,我们无法按照我们的第一个可视化表格来描述平均漂白百分比。

对于我们的第二个关键信息,我们也能够大致确定每个地点哪种珊瑚的漂白率最差。同样,我们也无法描述第二个可视化表格中的平均漂白百分比。

最后的想法

我们用两种不同的工具绘制了两种不同的可视化。毫无疑问,使用每种工具都有利弊,如果我要选择哪种工具能够更好地向利益相关者传达关键信息,获胜者必须是 Tableau 。尽管我们不得不建立两个独立的可视化来分别传递关键信息,Tableau 能够描述百分比,我认为这在我们向利益相关者传递见解时至关重要,因为它们是由数字支持的。另一方面,R ggplot 是对两个关键信息的简单的一页概述,但不幸的是,在详细检查图表后,只能粗略地识别关键信息。当然,在 Tableau 和 R ggplot 中,这个数据集有 101 种不同的可能性,也许我的方法不是最有效的,不能发挥每个工具的最佳性能。然而,我希望这篇文章能够给你们提供另一个视角来考虑在决定使用哪种可视化工具来表达问题陈述/关键信息时,数据可视化爱好者们欢呼吧!

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

CORD-19:数据科学对新冠肺炎的回应

原文:https://towardsdatascience.com/cord-19-the-data-science-response-to-covid-19-46d57ab811f3?source=collection_archive---------39-----------------------

通过 CORD-19,白宫呼吁数据科学界提供来自 NLP 和其他机器学习算法的见解。

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

新冠肺炎病例地图[ 来源

目前,全世界团结一致,共同对抗一个共同的对手:新冠肺炎病毒,这种病毒也被简称为冠状病毒。仅仅几周时间,这种病毒就以指数级的速度在全世界传播开来(咄,这就是它的工作方式)。因为数据科学社区的许多成员现在大部分时间都呆在家里,不知道如何利用他们的技能来帮助根除病毒。有许多方法,但有一个特别有意义的方法直接来自白宫本身:CORD-19。

动机

在此之前,让我们后退一步,确保我们都熟悉病毒是如何一次又一次地传播的。

MeltingAsphalt 的凯文·西姆勒制作了一个很棒的系列互动图,展示了任何病毒是如何传播的*(代码这里是)。*

约翰·霍普金斯大学(JHU)已经挺身而出,在全球范围内提供对大量分析的持续跟踪。点击下面的链接,浏览他们的图表,这些图表显示了一段时间内的全球病例、死亡和恢复情况。

[## 追踪者

新冠肺炎(新型冠状病毒肺炎)

shiny.john-coene.com](https://shiny.john-coene.com/coronavirus-embed?data=jhu&chart=cases-added&cumulative=false)

他们还创建了一个令人惊叹的仪表盘,其中包括确诊病例的 ArcGIS 地图。地图两边的表格列出了按国家分列的病例和死亡情况。对于美国的读者,请注意欧洲病例的密度。专家说,美国没有做足够的工作来防止这种密度在 1-2 周内发生。点击下面的链接浏览数字。要查看这篇没有媒体编辑器的 iframe 限制的文章,请在这里查看。

[## 使用 ArcGIS 的新冠肺炎仪表盘

新冠肺炎(新型冠状病毒肺炎)

www.arcgis.com](https://www.arcgis.com/apps/opsdashboard/index.html#/bda7594740fd40299423467b48e9ecf6)

好了,回到病毒。我们都很清楚它们是如何通过指数增长传播的(学究式地说,这实际上是逻辑增长)。要想直观地了解新冠肺炎的这一过程,只需看看格兰特·桑德森精彩的 3Blue1Brown 频道:

格兰特·桑德龙对新冠肺炎突围赛的讨论

CORD-19 概述

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

新冠肺炎分子[ 来源

我想你现在有足够的动力了。那些没有的人可能还在玩上面的地图。不管怎样,我很高兴你有动力,因为我们现在有工作要做。

白宫向技术界发出了行动号召,从大量冠状病毒文献中获取真知灼见。数据(CORD-19)多为关于各种冠状病毒的文字文章。因此,它强烈呼吁自然语言处理(NLP)社区提供见解。各位,准备好迎接即将到来的以芝麻街为主题的模特名字:CORDBERT、BERTID19、CoronaBERT 等。

在这一点上,许多数据科学资深人士会嘲笑和抱怨他们的大部分时间是如何花费在准备数据上,而不是使用数据。我有个好消息:CORD-19 开箱即可机读。

今天,来自艾伦人工智能研究所、Chan Zuckerberg Initiative (CZI)、乔治城大学安全和新兴技术中心(CSET)、微软和美国国立卫生研究院国家医学图书馆(NLM)的研究人员和领导人发布了关于新冠肺炎、新型冠状病毒和冠状病毒群的学术文献的新冠肺炎开放研究数据集(CORD-19)

应白宫科学与技术政策办公室的要求,该数据集代表了迄今为止可用于数据和文本挖掘的最广泛的机器可读冠状病毒文献集合,包含超过 29,000 篇文章,其中超过 13,000 篇具有全文。

whitehouse.gov

加入战斗

Kaggle 是一个数据科学社区,现在在谷歌的保护伞下,已经形成了正式的挑战,从呼吁行动。下面是您的逐步启动和运行流程:

  1. 阅读主页获取 CORD-19 数据。
  2. 查看主 Kaggle 挑战的任务
  3. 查看其他用户所做的现有分析
  4. 与其他用户讨论调查结果。
  5. 参加第 1 周预测挑战。考虑使用 DeepNote 笔记本进行分析,或者使用 AutoML 自动训练模型。

保持最新状态

学术界和工业界的事情发生得非常快!通过一般的 LifeWithData 博客ML UTD 时事通讯让自己保持最新状态。

如果你不是收件箱时事通讯的粉丝,但仍然想参与其中,考虑将这个 URL 添加到一个聚合设置中。

原载于 2020 年 3 月 19 日 https://lifewithdata.org**的

CORD Crusher:将新冠肺炎数据分割成摘要

原文:https://towardsdatascience.com/cord-crusher-slicing-the-cord-19-data-into-summaries-ca5d8f95e276?source=collection_archive---------40-----------------------

我第一次使用自然语言处理深入研究文本数据

在 12 月新冠肺炎疫情爆发的早期,我和妻子在舒适的被窝里等待我们儿子的出生。在他出生后,很明显,新冠肺炎病毒的爆发控制了世界。1985 年底,也就是 1986 年 4 月切尔诺贝利灾难的前几个月,我开始更多地思考自己的出生。似乎在一个不断发展的世界里,新的生活和新的挑战总是相伴而生。所以每当儿子睡觉的时候(没有我本来想的那么多),我就悄悄拿起电脑开始涉水,然后游泳,最后一头扎进 python 中的自然语言处理(NLP)。

2020 年 3 月,白宫科技政策办公室发布了 CORD 19 数据集和行动呼吁:

“呼吁国家人工智能专家开发新的文本和数据挖掘技术,帮助科学界回答与新冠肺炎相关的高优先级科学问题”

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

Caleb PerezUnsplash 上拍摄的照片

CORD 19 是开发代码以找到关于新型冠状病毒的相关和及时信息的绝佳机会。可用的 NLP 包和技术的数量多得令人应接不暇(例如 RoBERTa ,这也是我岳母的名字,她向我们宣布了新病毒的消息),并且这个列表还在扩展。在本文中,我将演示如何将这些 NLP 包放在一起构建一个名为 CORD crusher 的摘要代码。我将放大我的 NLP 代码的组件,解释它们的功能,并展示它们是如何组合在一起的。五个主要步骤是:

  1. 按出版年份将数据划分为时间范围

2.根据广泛的主题提取关键词和分组论文

3.从每个主题的关键词建立主题

4.将关键词提炼为更具体的主题短语

5.搜索代码 19 文本并按相似性排序

粗略但快速提取的关键字

我发现 RAKE (快速自动关键词提取)既是一种快速的算法,也是一种直观的算法。像“新型冠状病毒”这样的关键词将包含多个单词,每个文档可能使用不同的术语:“新型冠状病毒”、“COVID 19”、“2019-nCoV”。RAKE 只考虑单个文档中的关键字,而不是所有的 CORD 19 出版物。这有助于根据单个出版物的术语查找关键字。

RAKE 关键字评分是基于词频和与其他词共现的图表。直观上,这可以理解为单词相关矩阵,其中对角线是词频,其他条目是一个单词与另一个单词相邻的概率。这种简单的方法降低了计算成本,是提高算法速度的关键(120 个单词不到 1 毫秒)。

由于关键字强烈地代表了文档的上下文,我希望出版物的标题和摘要是查找关键字的主要位置。出版物的这些部分是为了给读者提供所有内容的概要。

**Full abstract and title
Are pangolins the intermediate host of the 2019 novel coronavirus (SARS-CoV-2)?**
The outbreak of a novel corona Virus Disease 2019 (COVID-19) in the city of Wuhan, China has resulted in more than 1.7 million laboratory confirmed cases all over the world. Recent studies showed that SARS-CoV-2 was likely originated from bats, but its intermediate hosts are still largely unknown. In this study, we assembled the complete genome of a coronavirus identified in 3 sick Malayan pangolins. The molecular and phylogenetic analyses showed that this pangolin coronavirus (pangolin-CoV-2020) is genetically related to the SARS-CoV-2 as well as a group of bat coronaviruses but do not support the SARS-CoV-2 emerged directly from the pangolin-CoV-2020\. Our study suggests that pangolins are natural hosts of Betacoronaviruses. Large surveillance of coronaviruses in pangolins could improve our understanding of the spectrum of coronaviruses in pangolins. In addition to conservation of wildlife, minimizing the exposures of humans to wildlife will be important to reduce the spillover risks of coronaviruses from wild animals to humans.**Top 20 Rake keywords:** million laboratory confirmed cases novel corona virus disease sick **malayan pangolins** **novel coronavirus** unknown recent studies showed **phylogenetic analyses** showed pangolins improve emerged coronavirus identified wild animals risks natural hosts originated large surveillance **intermediate hosts** intermediate host related **complete genome**

在上面的例子中,180 个单词的全文被浓缩为 40 个单词,其中关键词包含的信息足以识别该文章是关于新冠肺炎的,关键词是“新型冠状病毒”,并且是关于“系统发育分析”中穿山甲的潜在中间宿主。算法还成功配对了“马来亚”和“穿山甲”。这 40 个单词并不概括摘要,而是标记出可以用来标记出版物主题的最多的关键词,并将其与提到相同单词的其他关键词进行分组。

上述示例还表明,许多关键词仍然过于笼统,例如“最近的研究”或“实验室确诊病例”,但这些将在稍后阶段使用术语频率逆文档频率权重 (TFIDF)进行处理,以找到更具体的罕见关键词。

几十年来的 CORD 19 数据

作为物理学家,时间维度一直是衡量系统演化的一个重要特征。此外,将 CORD-19 的元数据 csv 文件划分为时间范围是管理代码的内存和 CPU 使用的一种有用技术。选择正确的时间范围还可以根据下图中的特征对出版物进行大致分组。

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

(作者图片)出版年份与 CORD-19 数据集中的出版物数量。

CORD 19 的出版物可以追溯到 1870 年,但是早期的出版物通常没有机器可读的全文。到 1970 年,只有少数出版物可用于文本挖掘,其中大多数是关于动物中的冠状病毒(人畜共患冠状病毒)。关于人类冠状病毒株(如 229E 和 OC43)的出版物数量也很少,因为这些病毒导致轻微症状而不是流行病。出版物的大幅增长出现在 2002 年 SARS 流行期间,导致了 2002 年至 2005 年红线内出版物的峰值。在 2012 年中东呼吸综合征疫情期间,紫色线也出现了一个较小的峰值。正如预期的那样,数据集中的大多数出版物都是 2019 年至 2020 年新冠肺炎疫情期间的出版物。

元数据按照这些趋势分为时间范围:1970-1990 年,1990-2002 年,2002-2005 年,2005-2012 年,2012-2019 年,2019 年至今。元数据可以作为 pandas 数据帧被加载,并且“publish_time”列被转换为 datetime64:

##For a given path to the CORD 19 data and a range [startyear, endyear]
df=pd.read_csv(‘%s/metadata.csv’%PATH)
df[“publish_time”] = df[“publish_time”].astype(“datetime64”)
df=df[(df[‘publish_time’]<’%d-1–1' %endyear) & (df[‘publish_time’]>=’%d-1–1' %startyear)]

对于每个时间范围,我们预计某些关键词会更流行,如公共卫生是 2002 年 SARS 爆发后更常见的关键词。在 2002 年之前,我们预计大多数关键词都与动物冠状病毒有关,而不是人类病毒株。2019 年后,大部分出版物都以新冠肺炎术语为关键词。这种时间切片利用了 SARS、MERS 和新冠肺炎(大约相隔 10 年)等不同冠状病毒爆发之间的明显差异。

空间为我的代码提供了主干。SpaCy 提供了一个管道,可以自动将文本分解成标记,分配词性,并根据单词之间的相互依赖关系分配标签。它还将 PyTextRank 和 RAKE 等包集成到处理管道中,以提高速度和一致性。选择特定的空间模型可以改善结果,对于 CORD 19,有一个针对生物医学数据进行训练的科学空间

SpaCy 也是将关键字匹配到 CORD 19 文本的强大工具。在每个出版物的摘要中找到的匹配关键词被用于根据主题(例如,公共卫生、重症监护、诊断技术)来标记该出版物。匹配的两种主要方式是短语匹配(用于寻找更精确的术语)和基于规则的匹配(寻找更多样的术语)。短语匹配往往运行得很快,因为字符串存储为哈希值(以节省内存),并且使用词汇字典在哈希值和字符串之间进行转换。“重症监护室”下面的模式既用作分配为匹配模式的主题“ICU”的关键字:

##Simple Phrase matchingmatcher = PhraseMatcher(nlp.vocab, attr='LOWER')
patterns=[nlp.make_doc(‘intensive care unit’)]### Don't need full spacy pipeline only need the text
 matcher.add(“ICU”, None, *patterns)### store string as a hash valuefor doc in docs:#### for a list of docs
        #print(doc.text)
        matches=matcher(doc)### Return matched values
        FoundMatches=[]
        for match_id, start, end in matches:
            FoundMatches.append(nlpsci.vocab.strings[match_id])### convert hash value to string and store it in a list

基于规则的匹配依赖于知道产生给定术语的可能记号、记号的顺序或标点符号的分隔。下面的代码匹配一个术语“计算机断层扫描”(CT)。下面基于规则的模式使用带有“IN”属性的列表作为逻辑 OR,用于列表中的任何单词。逻辑运算“+”要求列表中的每个单词至少匹配一次。这就产生了一组 ct 术语,如“胸部扫描”、“ct 扫描”、“胸部发现”和“CT 发现”。也可以通过“+”操作找到类似“胸部 ct 扫描”的模式。在这种情况下,使用几个关键字来匹配主题 ct,而不是主题 ICU,在 ICU 中只有一个字符串“重症监护室”。(关于空间匹配模式和代码练习的更多信息,请查看 Ines Montani 的教程

#### Rule based matching
matcher = Matcher(nlp.vocab)
CT=[{“LOWER”:{“IN”:[“chest”,”ct”]},”OP”:”+”}
, {“LOWER”:{“IN”:[“scans”,”findings”, “ct”]}, “OP”:”+”}]
 matcher.add(“CT”,None,CT)

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

(作者拍摄的照片)2020 年的月份与出版物数量的对比,分为以新冠肺炎为关键词的总出版物和包括更具体关键词的出版物。(最新 CORD 19 更新于 2020 年 9 月 20 日)

在上面的图中,我只使用找到新冠肺炎匹配模式的出版物,并查看最常见的关联模式。查看出版物数量最多的 2020 年,您可以看到每月出版物主题的细分:

  • 最常发表的主题是公共卫生、识别易受感染的病人和诊断方法。
  • 新冠肺炎与 SARS 和 MERS 一起被提及,以吸取以往疫情的经验。ACE2 这个词每月都频繁出现,就像与新冠肺炎相关的 SARS 和 MERS 一样。这可能是由于 SARS 病毒和新冠肺炎病毒与相同的人类 ACE2 细胞受体结合。
  • 重症监护的主题在 3 月前爆发的早期更为罕见,但随后由于有更多的病例数据,每月都有数百篇出版物。
  • 最罕见的关键词是与新冠肺炎一起被提及的冠状病毒动物毒株。在数以千计被贴上新冠肺炎标签的出版物中,每月只有大约 10 种。

将关键字组合成二元模型和三元模型

N-gram 是 N 个单词的序列,对于将单个标记组合成更具描述性的特征非常有用。一些术语,如“计算机断层摄影”是有用的二元模型(N=2 ),用于研究诊断主题。三元模型(N=3)也经常出现在 CORD 19 数据中,如“世界卫生组织”、“重症监护病房”或“急性呼吸窘迫”。为了查看不同 N-gram 的频率,我使用了类似 CountVectorizer 的 sklearn 特征提取工具,该工具还设置了序列的最小和最大范围:

tf_vectorizer = CountVectorizer(ngram_range=(2,3)) ### Uses only bigrams up to trigrams
tf=tf_vectorizer.fit_transform(skl_texts)####transform and learn the vocab from the list of keywords in skl_texts

上面给出了二元模型和三元模型计数(tf)的矩阵,可以将其转换为一系列用于绘图:

d = pd.Series(tf.toarray().sum(axis=0),index = features).sort_values(ascending=False)
 ax = d[:no_most_frequent].plot(kind=’bar’, figsize=(8,8), width=.8, fontsize=12, rot=50,title=’Most Frequent Keywords’) #### plot the top no_most_frequent 

以新冠肺炎和公共卫生为例,我得到了下面的直方图:

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

(作者照片)关于新冠肺炎和公共卫生的出版物中倾斜关键词的计数(在将二元模型合并到三元模型之前)

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

(作者图片)基于 Levenshtein 距离将二元模型合并为三元模型后倾斜关键词的计数。

尽管一些关键词看起来很有用(如“社会距离”、“重症监护室”),但一些三元组被错误地拆分,如“世界卫生”和“卫生组织”应拼凑成“世界卫生组织”。为了进行这种关联,我使用了模糊字符串匹配,并基于 Levenshtein 距离给出了二元模型与三元模型相似程度的比率窗口。我存储了一个二元模型字典,其中三元模型的 Levenshtein 距离在 64 到 100 之间。这说明“世界卫生组织”是出现频率最高的词。像“个人防护装备”这样的三元组在从“个人防护”拼凑回来时也变得更加频繁。这种与模糊字符串匹配的合并显示了对特征的更精确的计数,这些特征可以被输入到代码的下一阶段以用于主题构建。

从主题构建主题

上述主题仅给出了一个宽泛的主题类型,将论文粗略地划分为几组特征。计数直方图已经显示了一个特征趋势:不太频繁的词往往是关于更具体的主题,如“社交距离”,而非常频繁的词过于笼统,会匹配大量的文本,如“世界卫生组织”。

说明这种趋势的一个好方法是将关键词表示为术语-频率逆文档频率 (TF-IDF)矩阵。术语频率是文档中关键字的计数除以总字数。逆文档频率是文档总数除以所有文档的特征计数。该比率的对数允许计算大量文档的 TF-IDF 分数。TF-IDF 分数是通过将两个术语相乘来计算的:术语频率和逆文档频率。对于在所选数据中频繁出现的词,如“世界卫生组织”或“公共卫生”,得分较低。与所有文档相比,在一个文档中频繁出现的单词的 TF-IDF 得分较高,如“社交距离”。特征的这种表示根据它们作为有用搜索词的相关性对它们进行适当的加权。

##### Can also use only the top TF scored features (set with max_features) and require them to have a more than 5000 for their document frequency (set with max_df)
tfidf_vectorizer = TfidfVectorizer(max_features=no_features,ngram_range=(2,3),max_df=5000)####Create the TF-IDF matrix and score the list of features in skl_texts 
tfidf = tfidf_vectorizer.fit_transform(skl_texts)

如何处理特征的 TF-IDF 值矩阵?答案是将其分解成更小的矩阵,这些矩阵的乘积近似等于原始矩阵。我们可以利用 TF-IDF 矩阵是一个非负矩形矩阵的事实(维数为 N 个文档和 M 个关键词)所以它可以近似地被两个非负矩阵分解。因子的矩形矩阵( WH )需要有一个指定的参数,即主题或聚类的数量:

**V[行:列]=V [文档:术语]=W(文档:主题)H(主题:**术语 )

使用成本函数找到这些因素,一个简单的成本函数如 ||V-WH|| (误差平方和)产生了K-均值聚类算法。对于我的代码,我使用了用于潜在语义分析的相同成本函数kul back-lei bler 成本函数,它基于对数似然比 P/Q 为相同的数据 X 将主题模型 P 与主题模型 Q 分开。如果 P 是比 Q 更好的模型,数据 X 将给出更大的对数似然值。这种模式的非负矩阵分解(NMF)可以使用 sklearn 来完成:

#### Specify the number of topics and the loss function, then fit to the TF-idf matrix to get the factorized model
nmf = NMF(n_components=no_topics,beta_loss=’kullback-leibler’).fit(tfidf)

主题的数量可能是一个关键参数,太少可能无法最大化分离能力,导致主题不一致。过多的主题会导致冗余的主题,每个主题包含的信息很少。如果不观察 2D 的主题群,很难理解这种分离的力量。t-SNE 是一种有用的方法,可以看到投射到 2D(甚至 3D)平面的主题群(从更高维度)。

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

(作者拍摄的照片)动画图,使用在受试者新冠肺炎和 ACE2 细胞受体中找到的关键字,为每一帧运行不同数量主题(2,4,8,10,15)的 NMF。基于上述 15 个主题,最大化主题分离,同时保持主题集群相当一致。

主题数量合适的 2D 投影应该看起来像是烟花爆炸的碎片。这些簇应该彼此分开,并且每个簇中的点应该靠近质心。

用 NMF 创建的主题有什么用处?

  • 每个受试者(如 COVID-19 和 ACE2)都可以分解成更具体的主题。每个主题只是一个排序的关键字列表(二元模型和三元模型),可用于在 CORD 19 数据中查找相似的文本。(接下来将对此进行描述)
  • NMF 模型还可以用于预测添加到 CORD 19 的新文档的主题,而不必再次运行该算法
  • 原始的 TFIDF 矩阵可以进行类似的转换,以找到每个主题的最典型的文档标题。
### Print keywords per topic:feature_names = tfidf_vectorizer.get_feature_names()for topic_idx, topic in enumerate(nmf.components_):
   print(", ".join([feature_names[i]for i in topic.argsort()[:-no_top_words - 1:-1]]))##### predict topic for new publicationstfidf_LatestCORDData = tfidf_vectorizer.transform(new_keywordsinAbstract)X_new = nmf.transform(tfidf_LatestCORDData)#### this makes an embeddingpredicted_topics = [np.argsort(each)[::-1][0] for each in X_new]### Most likely topic per document#### Lookup the most typical paper titles per topicnmf_embedding = nmf.transform(tfidf)### Transform original TFIDF matrix used to predict topicsnmf_embedding = (nmf_embedding - 
nmf_embedding.mean(axis=0))/nmf_embedding.std(axis=0)### see how far away the scores are from the averagetop_idx = np.argsort(nmf_embedding,axis=0)[-10:]### Top 10 document indicesfor idxs in top_idx.T:#### A loop over topics for idx in idxs:print(SelectedRows.iloc[idx]['title'])### Top 10 most common documents per topic where idx is the index in the dataframe that stored the keywords, abstract and titles for the selected papers

为了看事情如何具体地结合在一起,我用 NMF 建立了 3 个关于新冠肺炎及其动物传染病起源的话题。下面的文本框显示了每个主题的前 10 个主题关键字和前 3 个文档标题:

#####Topic Keywords#######
Topic 0:
seafood wholesale market, world health organization, major public health, huanan seafood wholesale, viral rna, public health emergency, global public health, **species transmission**, codon usage, confirmed casesTopic 1:
time evolution signal, antiviral drugs, **genomic sequences**, host taxa, feline infectious peritonitis, neuromyelitis optica, phylogenetic tree, sequence identity, length genome, animal healthTopic 2:
**spike protein** insertions, epidemic diarrhea virus, potential therapeutic options, receptor binding domain, major public health, infectious peritonitis virus, porcine epidemic diarrhea, feline infectious peritonitis, amino acid, water samples##### Top 3 Document titles from the Transform #######
Topic 0:
**Cross-species transmission** of the newly identified coronavirus 2019-nCoV
The Natural History, Pathobiology, and Clinical Manifestations of SARS-CoV-2 Infections
Global genetic patterns reveal host tropism versus cross-taxon transmission of bat BetacoronavirusesTopic 1: 
COVID-19, Companion Animals, Comparative Medicine, and One Health
**Mapping genome variation** of SARS-CoV-2 worldwide highlights the impact of COVID-19 super-spreaders
Identification and Analysis of Unstructured, Linear B-Cell Epitopes in SARS-CoV-2 Virion Proteins for Vaccine Development.Topic 2: 
Development of a TaqMan-probe-based multiplex real-time PCR for the simultaneous detection of emerging and reemerging swine coronaviruses
Genome based evolutionary lineage of SARS-CoV-2 towards the development of novel chimeric vaccine
Structural basis of SARS-CoV-2 **spike protein** induced by ACE2.

基于以上所述,主题 0 很可能带有“跨物种传播”的标签,因为该术语出现在排名关键词和最典型文档的标题中。出于类似的原因,主题 1 可能带有“基因组序列”的标签。根据标题和主题关键字,主题 2 不太清楚,因此我们将在下一节中以该主题为例。

匹配和排列文本

在实际开采的类比中,在文本开采的这一点上,我们有粗切的石头,可以进一步提炼为珍贵的宝石,以备鉴定。提炼的过程包括从主题关键词中构建短语,以便可以基于抽象的短语进行更具体的文本搜索。评估取决于给定的出版物、匹配句子的段落或单句与 CORD 19 数据中其他内容的相关程度。

为了提炼关键词,我在出版物摘要上使用 PyTextRank 来获得更具体的主题短语。主题短语包含主题单词和附加的上下文信息,以改进搜索。 PyTextRank 是 TextRank 算法的 python 实现,它根据图形中的关联对主题短语进行排序。它通常用于摘录摘要,因为它可以推断主题短语(图中的顶点)之间的链接,并根据顶点的重要性按相关性对它们进行排序。与 RAKE 相比,PyTextRank 运行速度较慢,但也能更准确地指示论文的上下文。

回到上一步的例子,关于新冠肺炎的动物传染病起源的话题 2 很难用话题词来确定。有些话题词像“氨基酸”还是很模糊的。在下面的文本框中,您可以看到主题短语如何使主题单词“氨基酸”更加具体:

Topic 2:
spike protein insertions, epidemic diarrhea virus, potential therapeutic options, receptor binding domain, major public health, infectious peritonitis virus, porcine epidemic diarrhea, feline infectious peritonitis, **amino acid**, water samplesPyTextRank Phrases:
'multiple amino acids', 'two secondary water samples', 'influent, secondary and tertiary effluent water samples', 'five amino acids', 'effluent water samples', 'feline infectious peritonitis virus', 'coronavirus spike protein receptor binding domain', 'key amino acids', '**one noncritical amino acid difference**', '**92.2% amino acid identity**', '**a double amino acid insertion**', '**these variable amino acids**', 'porcine epidemic diarrhea virus', '**a noncritical amino acid**', '**a relatively low amino acid similarity**', 'the spike surface glycoprotein receptor binding domain', 'all tertiary water samples', '**gene and amino acid sequence homologies**', '**a distinct 4 amino acid insert**', '**many amino acid changes**', 'negative all secondary and tertiary treated water samples', 'basic amino acids', 'the 2019-ncov spike protein insertions', '**the nucleocapsid protein amino acid and gene sequence**', 'the receptor binding domain', 'a feline infectious peritonitis (fip) virus', 'a major public health concern', '**22 amino acid insertions**'

类似地,其他主题词如“水样”也可以通过上面的主题短语变得更加具体。如果主题词确实代表相关的搜索词,它们应该出现在与其他短语相比 PyTextRank 得分较高的主题短语中。下图显示了这两种情况的散点图。高 PyText 等级分数(> 0.02)也导致较低的计数频率,因为与低等级分数相比,它们代表更具体的上下文。停用词的得分为 0.0(如 we、is、the)。包含主题词“冠状病毒刺突蛋白受体结合域的得分最高的短语明确了结合域在冠状病毒刺突蛋白上。基于主题短语,主题 2 可能具有标签“刺突蛋白氨基酸插入”。

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

(作者提供图片)主题短语计数与其 PyTextRank 得分的散点图。通过在包含主题关键词的出版物摘要上使用 PyTextRank 来找到短语。上面的点显示了所有的短语,以及包含主题词的短语。核密度估计显示所有短语倾向于大部分处于较低的等级分数,而那些包含主题关键词的短语处于较大的值。

下面的图表显示了新冠肺炎动物传染病起源的三个主题中的一些主题短语。一般来说,短语的等级越高,在出版物摘要中出现的频率就越低。这提供了更具体的搜索短语,用于搜索 CORD 19 文本以获得有价值的见解。

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

(作者拍摄)关于新冠肺炎动物传染病起源的 3 个主题的主题短语示例。等级分数越大(越相关),短语越不频繁(越具体)。

SpaCy 短语匹配器再次用于在出版物正文中查找匹配的文本。考虑到具有匹配文本或来自 NMF 嵌入的所有出版物,可以使用余弦相似度来比较出版物的全文:

Corpus=[]
for pub in PubPaths:### Loop over publications
    BodyText=[]
    SkimmedText=SkimallText(Filepath+p,nlpsci)#### return all lines of the paper
    BodyText.extend(SkimmedText)####Full text not just the abstract
    Doc=".".join(BodyText)
    Corpus.append(Doc)
tfidf_vectorizer = TfidfVectorizer()####Build TF-IDF matrix
tfidf = tfidf_vectorizer.fit_transform(Corpus)####Score all the text data
SimilarityArray=cosine_similarity(tfidf, tfidf)#### Make a similarity matrix from the TF-IDF matrix 
nx_graph = nx.from_numpy_array(SimilarityArray)#### Convert similarity matrix into a graph
scores = nx.pagerank(nx_graph)#### Use page rank to score graph vertices
for i,s in enumerate(Titles):##### Print out titles and their scores
        rank.append(scores[i])
        titles.append(s)

与主题 2 最相似的前 3 个文档是:

  1. 新型冠状病毒刺突蛋白的系统发育分析和结构建模揭示了一个进化独特且蛋白水解敏感的激活环
  2. 新冠肺炎疫情:分类学、遗传学、流行病学、诊断、治疗和控制的全面综述
  3. 探索新型冠状病毒刺突糖蛋白的基因组和蛋白质组变异:一种计算生物学方法

类似地,如果上面代码块中的语料库填充了文档中匹配文本的段落(而不是完整的正文文本),则可以用余弦相似度对段落进行排序。排名最高的段落是:

“在 S1 内,发现 N-末端结构域(NTD)与受体结合结构域(RBD,74%同一性)相比保守性较低(51%同一性)……然而, 暴露的环特征已经在模型和 cryo-EM CoV S 结构中得到证实,在 S1/S2 位点具有相似的氨基酸序列……系统发育分析中使用的 S 蛋白的氨基酸序列从图 4 获得……显示了 S1/S2 和 S2 位点的氨基酸序列……发现结构域(NTD)与受体结合结构域(RBD,74%同一性)相比保守性较低(51%)……然而, 在 S1/S2 作者/资助者处,已在具有相似氨基酸序列的模型化和 cryo-EM CoV S 结构中证明了暴露的环特征…获得了用于系统发育分析的 S 蛋白的氨基酸序列…S1/S2 和 S2 位点的氨基酸序列显示为“”。2019 年新型冠状病毒(nCoV)刺突蛋白的结构模型揭示了蛋白水解敏感的激活环,作为与 SARS-CoV 和相关 SARS 样冠状病毒 相比的区别特征

上面的段落仍然过于密集,无法理解是否有有用的见解,因此匹配文本的每个句子(由“…”分隔)都可以用余弦相似性对该主题进行排序。该主题的所有匹配文本中排名最大的句子是:

“此外,我们的分析表明,来自 R. malayanus 的病毒 RmYN02,其特征是在刺突蛋白的 S1 和 S2 亚基的连接位点插入多个氨基酸,与 RaTG13 和新型冠状病毒属于同一进化枝,这为新型冠状病毒在该地区的自然起源提供了进一步的支持” 起源和蝙蝠冠状病毒在中国的跨物种传播

最细粒度的信息,即所选 CORD 19 数据中的句子,用余弦相似度排序可以得出简明的结论。根据上面的论文,在新型冠状病毒的刺突蛋白中插入氨基酸,负责新冠肺炎,支持了病毒起源于马头蝠(马来菊头蝠)的证据。

我想,如果我要简要总结我的挖掘工作,我会按照上面演示的步骤对文本进行剪切、筛选和排序。这将成千上万的文档压缩成一个简短的阅读列表。公共卫生、医学或流行病学方面的专家可以浏览这些见解,找到与他们的研究相关的有趣结论,或者调查重要的公开问题。对于数据科学家来说,将这种算法扩展到无监督的学习方法可能是有用的。最后一步可以和第一步联系起来,这样阅读列表就可以用来找到更多的关键词来标注主题。以这种方式,主题和主题将更健壮地寻找相关信息。

相关文章:

参考

[1]王陆、露西等人 CORD-19:新冠肺炎开放研究数据集(2020 年 4 月 22 日) ArXiv 预印本。
(上文引用的论文)
【2】Javier a . Jaimes,Nicole M. André,Jean K. Millet,Gary r . Whittaker2019-新型冠状病毒(nCoV)刺突蛋白的结构建模揭示了一种蛋白水解敏感的激活环,作为与 SARS-CoV 和相关 SARS 样冠状病毒的区别特征(2020 年 5 月)分子生物学杂志 【3】Latinne,a .,Hu,b .,Olival,K.JNat Commun11、 4235 (2020)。

2020 年要学习的核心数据科学技能

原文:https://towardsdatascience.com/core-data-science-skills-to-learn-in-2020-f70ec6a6b59b?source=collection_archive---------27-----------------------

盲目的追逐只会走进死胡同!知道自己需要什么,2020 年的自己需要什么。

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

图像通过 Unsplash

数据科学是推动全球整个技术变革的核心。这是复杂的,迷人的,有益的,有趣的,是的,有趣!在…学习、试验或建立职业生涯。从美国宇航局卫星数据和全球气候系统的高端复杂性,到数据密集型应用程序(如人工智能)的日常生活可靠性,你是这个过程的一部分。

但这还不够,不是吗?一起前进。特别是如果你是许多渴望在机器学习、商业智能、图像处理或高级数据分析的广阔世界中取得成功的人之一。不,这肯定不够。数据科学需要非凡的技能、持久性和清晰性来掌握数据科学家用来通过操纵数据得出有用见解的方法。

诚然,数据科学的领域从未像今天这样光明。鉴于对数据科学专家的爆炸性需求和巨大的供应缺口,追求最受欢迎的职业之一的时机已经成熟。而且这种需求只会进一步增长,至少在十年或二十年内,数据科学将继续处于所有技术进步的中心。这就引出了今天的话题,2020 年需要学习哪些核心数据科学技能?能够保持相关性,甚至能够适当地开始。

想要在 2020 年在数据科学领域取得成功的个人应该具备什么样的技能?这是我们需要答案的大问题。是单独编程吗?是数学和编程结合吗?是统计,数学,编程统称吗?要想在众多数据科学领域中取得成功,必须具备什么样的正确组合?

这篇文章的主要目的是解决这些和许多其他类似的问题,以帮助您清除灰尘。我们将讨论使数据科学成为多学科领域的所有兴趣领域,并权衡其在未来几年的相关性。

那么,让我们开始吧!

统计

支撑数据科学成为一个包罗万象的领域的核心主题之一是统计学。数据科学用于通过不同的过程从数据中提取可读信息。这些程序被系统地应用于建模和可视化数据,以实现目标。统计学是分析模型的基础,用于汇总数据。此外,当数据被可视化用于模式发现时,它需要敏锐的统计图形和地图来将信息有效地传达给更广泛的公众。

这使得统计学成为你在未来几年超越数据科学所需要掌握的第一门学科。

编程

绝对有必要对至少一种编程语言如 Python、SQL、R、Java 等有一个无条件的命令。,甚至涉足数据科学领域。它通过结合先进的统计和现实世界的编程能力。在众多语言中,Python — 高级、多用途语言是数据相关领域中使用最多的编程语言。由于其通用性质,Python 允许将 SQL、TensorFlow 和许多其他语言、函数和库集成在一起,用于机器学习和数据科学。

数据科学项目生命周期中有多个阶段,如数据收集、功能工程、功能选择、模型创建和部署以及结果交流。Python 附带了一个数据密集型的定制库,以帮助其大量扩展(例如 NumPy、SciPy、StatsModels、Pandas 等)的每个阶段。

没有编程专业知识,你就没有成功立足的机会。如果说有什么不同的话,那就是在未来的几年里,深度技术方面将比以往任何时候都更加相关。这使得编程成为 2020 年要学习的核心数据科学技能的核心。

数据挖掘

数据挖掘的概念在商业和商业活动领域越来越受欢迎。然而,这是数据科学中被完全误解或误解的主题领域之一。数据挖掘不是数据建模、抢劫、分析或争论等。

数据挖掘是从正确的来源中选择正确数据的过程。然后采用正确的技术,如数据回归、分类、异常值或聚类分析,来帮助理解数据集以构建适当的模型。经验丰富的数据科学家或其他人花费 80%的时间处理不同的数据类型,以便能够创建分析模型并获得有价值的洞察力。

我们正在经历一个信息和数据密集型的时代。从基本任务到重要任务,每天都会产生越来越多的数据。例如,你去杂货店刷卡。刷卡启动了数据下载到数据库。在过去的两年中,我们看到了大量的数据,预计到 2020 年年底,数据量将达到 440 万亿字节。

如今,企业比以往任何时候都更需要存储、处理和分析数据,而且这一趋势还将继续。无论是在商业领域、医疗保健、娱乐、金融和银行、R&D、安全等领域,数据挖掘都是世界上所有这些庞大数据不可或缺的关键。您指定一个行业,我们将为您提供其数据驱动的物流。如今,出于各种目的,一切事物都需要战略和可操作的信息。这在没有标准的数据挖掘过程和专家的情况下是不可能的。

机器学习

在我们周围所有的技术变革中,我们是受影响最大的一代。与其他每个方面一样,我们作为一个全球社会,正生活在人工智能(AI)和机器学习(ML)的时代。很多人把人工智能和人工智能混淆为一个单独的领域,虽然它们有相似之处,但每个学科领域都致力于不同的专业知识。机器学习是一项迷人的研究,它训练机器进行自动学习和自我改进,以执行它没有被编程来执行的任务。简而言之,这就是人工智能的应用,在指定的时间内训练机器,并在一定的资源内可靠地执行,人工智能和其他认知技术在这个过程中被大量同化。

所有可用的以及即将到来的数据都需要通过不同的技术进行结构化,如特征选择和建模,以输入到机器中进行自动信息提取。机器学习的主要目的是帮助自动分析大量数据以获得关键见解。ML 是今天和我们走向的自动化之间的支点。它在未来几年的相关性至关重要。为了在数据科学革命中占有一席之地,这是你在 2020 年需要掌握的首批技能之一。

深度学习

深度学习——通常也被称为深度神经学习或深度神经网络——是人工智能应用中机器学习的子类。作为一个子类,深度学习有自己的操作形式、目的和技术。深度学习和机器学习之间的一个主要区别在于输入给机器的输入数据。它使用几个层次从原始数据输入中逐步识别、记忆和提取高度优化的信息。

机器学习可以基于包括文本、图像、音频或视频在内的任何形式的数据进行准确预测,与之相反,深度学习使用神经网络模型。这些模型通过权重接收输入以处理隐藏层中的数据,这些权重在给出所需的预测(输出)之前在计算机系统的训练期间被同步。

深度学习不像机器学习,不需要结构化数据。它有能力从非结构化和未标记的数据中学习,因为它是受人脑结构的启发。

如今,有几种深度学习架构,例如:

深度神经网络

深度信念网络

递归神经网络

卷积神经网络

这些结构已经成功地应用于众多领域,带来了令人震惊的结果,在某些特定情况下甚至超过了人类专家的表现。一些深度学习密集型领域包括:

计算机视觉

语音识别

自然语言处理

社交网络过滤

机器翻译

生物信息学—药物设计

医学图像分析

材料检验

深度学习需要更多的时间和资源来训练机器,这转化为更高的计算成本,因为它需要图形处理单元 (GPU)而不是我们常规的中央处理器(CPU)。

深度学习的范围在医学领域日益扩大,例如,神经网络正在成功检测癌细胞,并以 100%的准确性和细节分析 MRI 图像。技术是利用深度学习知识的另一个领域,例如,自动驾驶汽车现在已经成为现实。看看苹果、特斯拉和日产,它们正在迅速雇用深度学习专家,将可靠的自动驾驶汽车的梦想转化为现实。

以下是提高深度学习职业所需的一些最需要的技能:

Python、C++、R 等编程语言的实践经验

统计概念

机器学习算法

数据评估和建模技术

分布式计算

商业智能

商业智能(BI)基本上是数据分析的一个细分,它采用一套预先确定的流程、技术和战略架构,以便将原始数据转化为可操作的商业智能(信息)。 BI 采用逆向方法,通过分析过去的数据来解决当前的问题。虽然,这种方法提供了包含事实统计的战术报告,但是它们不能预测未来的事件。这就是商业智能和数据科学之间的区别。在数据科学中,你应该使用先进的方法来预测未来的结果,以做出有利可图的商业决策。

数据科学中的商业智能通过结合商业分析、数据挖掘、数据可视化、输入/输出界限工具和数据基础设施来增强企业的决策能力。集成到数据科学方法中的 BI 是通过专业工具报告和交流结果的更快方式,例如:

SAP 商业智能

Oracle BI

Microsoft Power BI

SAS 商业智能

说到底,以上提到的所有领域以及更多领域,本质上都是商业。没有出色的商业智能,你不可能成为任何特定组织的杰出数据科学家。BI 从根本上来说是将所有其他技能连接在一起的轴心。

因此,如果你想在商业智能领域出类拔萃,你必须掌握以下几项技能:

有数据分析工具和 SQL 编程的经验

数据仓库概念

解决问题的技巧

领域知识

结论

此时此刻,事实是,数据科学将继续存在并改变我们今天所知的世界。来自最可信的分析师和全球经济学家的大量类似预测和观察得出结论,未来由数据科学主导。除了成为批判性思考者和对数据充满热情的全面人才,你还需要一些严肃的技能。

所有上述主题领域共同构成了你应该学习的技能的正确组合。对所有这些的基本理解肯定会让你有一个足够好的开始,但是学习应该是一个持续的过程,你不应该停留在基本的专业水平上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值