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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Python 中的远程门户分析

原文:https://towardsdatascience.com/telegramgate-analysis-in-python-457d4a36164e?source=collection_archive---------18-----------------------

深度分析

处理 889 页聊天信息

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

Photo by Alex George on Unsplash

2019 年 7 月 13 日,889 页的电报聊天组对话被泄露,其中包括波多黎各总督里卡多·罗塞罗和其他 11 人,一些现任政府雇员和其他人。这段聊天从 2018 年 11 月 30 日持续到 2019 年 1 月 20 日,在世界各地的波多黎各人中引起了极大的愤慨,抗议随之而来。这种情况被命名为 telegramgate,基于性质类似的水门事件

当我通过其他人对脸书和新闻的解释了解到这一事件以及州长所做的声明时,我认为我最好亲自阅读 PDF,看看这些声明的背景是什么,以及我是否认为它们确实值得愤怒(它们确实如此)。当我发现这份文件长达 889 页时,我的第一个想法是…

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

I can’t even read all my emails, you think I am reading 889 pages of chat conversations?

我决定用 Python 做一个项目来分析 telegramgate 的对话。我将在这里用第一人称复数描述我遵循的过程。

本文中讨论的代码可以在我的 GitHub 帐户中的一个名为analyze_telegramgate的存储库中找到:

[## meramos/analyze_telegramgate

波多黎各总督里基·罗塞罗和他的政府同事之间的电报信息的 NLP 分析…

github.com](https://github.com/meramos/analyze_telegramgate)

开发要求

我们在 Ubuntu 中使用了 Python 3 和 Jupyter Notebook。使用了以下软件包:

  • Tika :允许您在 Python 中使用 Apache Tika 。Tika 是一个用 Java 开发的工具包,它可以从各种不同的文件格式中检测和提取元数据和文本。我们使用它是为了从 Telegramgate PDF 文件中提取文本。通过在计算机终端上运行pip3 install tika来安装它。
  • Re :该模块提供正则表达式匹配的操作。这个模块是 Python 自带的。我们在预处理中使用它来识别和删除与对话无关或不重要的数据,如时间戳和链接。默认情况下,Python 附带了它。
  • PDFKit :允许您从不同来源创建 PDF 文件,包括 HTML。我们用它创建了一个 telegramgate PDF 文件的节略版本。通过运行pip3 install pdfkit安装这个包。您还必须安装wkhtmltopdf以便从 HTML 文件创建 PDF。在 Ubuntu 操作系统中,你可以通过运行sudo apt-get install wkhtmltopdf来安装它。

预处理

处理文本时,了解原始文档结构、了解某些部分的含义以及它们与文档内容的相关性非常重要。

为了处理文档,我们首先使用 Tika 读取它,然后使用正则表达式删除文本中各种不重要的部分。

阅读 PDF

首先,我们使用 Tika 阅读 telegramgate PDF 文档(你可以在这里下载),并预览前 200 个字符。

清洁 PDF

我们注意到文档中有很多新行,所以我们使用字符串方法.strip()删除它们,现在pdf_content的前 399 个字符如下所示:

[注意到行“lComo se col6 eso?”是对《Como se coló eso》的误读。Tika 错误地读了一些颠倒的标点符号和重音字母,例如,它读为“as 6”和“as f”。我们在本文中没有提出解决方法。]

日期“1/20/2019”和文本“Telegram Web”出现在每一页的开头,这很可能意味着电报对话是在那个日期下载的,即 2019 年 1 月 20 日。在每一页的末尾都有一个电报 URL 和你在 PDF 所有页面中的页面。我们可以使用页码来跟踪 PDF 中出现消息的页面,所以我们应该保留它。但是应该去掉每页顶部的日期和文本“Telegram Web”以及底部的链接,这对分析没有用。

测试正则表达式的一个好地方是 https://regex101.com/。

有各种与任何消息都不一致的时间戳。
我们将假设消息发送的时间对分析不重要,因此将被删除。

学习pdf_content的时候,你可能会注意到有很多两个字母的缩写。从查看 PDF,你可以告诉很多这两个字母的缩写对应的聊天成员没有个人资料图片。这些首字母缩略词对文档的分析没有用,但是我们不应该试图删除它们,直到我们知道谁是参与聊天的成员。我们将在下一节“组织内容”中删除它们,在这一节中,我们将确定谁是管理员聊天成员。

从 PDF 的内容创建列表

在这些步骤之后,我们无法从纯文本中删除更多的字符串,所以我们通过用新行分隔字符串来从pdf_content中创建一个列表,并开始提取信息。

现在我们准备组织数据。

组织内容

为了组织/构建 PDF 中的信息,我们决定识别聊天成员以及每个成员发送了哪些消息。

我们可以使用文本格式来自动识别聊天中出现的所有成员,但我们无法读取包含格式的 PDF 文档(我们使用 Tika CLI 和标签 xml 和 html 读取它,但都没有保留 PDF 的原始格式)。

因此,我们必须满足自动识别管理员和手动识别其他成员的要求(请随意评论我们可以从 PDF 中自动检索非管理员聊天成员的方式)。

识别管理聊天成员

当检查 PDF 的纯文本时,我们注意到包含管理员用户名的行包含术语“admin”。我们隔离包含这个术语的行,以便识别聊天中的管理员用户。

现在,我们通过删除文本“admin”及其后面的文本来清除这些结果。

有些管理员用户是重复的,区别仅在于文本“via@gif”。我们删除了包含这段文字的内容,因为这些内容是多余的。

当检查结果列表时,您会发现有两个元素很可能是输入错误(Tika 误读了用户名)。这些元素是“Fdo”和“R Russello”。我们删除了这些元素,得到了管理员聊天成员的最终列表。

被误读的用户名仍然存在于文档中。我们用正确的拼写替换它们。

该聊天组共有 8 名管理员成员。管理成员如下:

  • Ch Sobri(Christian Sobrino):他是波多黎各财政机构和金融咨询局(AAFAF)的执行董事。2019 年 7 月 13 日,在聊天信息被泄露后,他辞去了在波多黎各政府的各种职务(来源)。
  • 卡洛斯·贝尔穆德斯:他是州长的通讯顾问。2019 年 7 月 13 日退出。他是聊天内容泄露后第一个退出的聊天群成员(来源)。
  • 拉斐尔·塞拉米·德·阿科斯塔 :也是州长的通讯顾问。他不再与政府保持任何合同。
  • 埃德温·米兰达:KOI 的首席执行官。州长的公关和亲密合作者。
  • 福·多(埃利亚斯·桑切斯·西方特):前总督在金融监督和管理委员会的代表。
  • 拉蒙·罗萨里奥 :前公共事务和公共政策秘书(2017 年 1 月至 2018 年 12 月)。在泄露消息的时间范围内,他并没有为政府工作。
  • R 罗塞罗(里卡多罗塞罗):波多黎各总督,2017 年 1 月 2 日至今。
  • Alfonso Orona :前任法律顾问(2017 年 1 月至 2019 年 2 月担任 La Fortaleza 首席法律官)。

识别非管理员聊天成员

根据 PDF 的第一行,上面写着“WRF 12 名成员”,这个聊天组一共有 12 名成员。这意味着群组中有 4 个非管理员聊天成员。浏览 PDF 后,我们发现剩下的 4 个聊天成员是:

  • 劳尔·马尔多纳多
  • 安东尼·马塞拉·扎亚斯
  • 里卡多·列兰迪
  • 路易斯格

不幸的是,我们无法在 Python 脚本中提取这些信息。我们将把这些用户名和管理员用户名一起添加到一个总聊天成员的综合列表中。

这不是欺骗…

删除两个字母的用户名缩写

现在我们知道了谁是聊天成员,我们可以删除与一些没有个人资料照片的聊天成员相关的两个字母的缩写。我们为用户建立所有可能的缩写。

现在我们有了潜在的首字母缩略词,我们搜索pdf_lines中的哪些元素只包含其中一个首字母缩略词,并删除那些行。

组织

现在来吃肉!

我们创建一个字典列表(我们称之为conversation),其中每个字典元素都有以下键:

  • message:聊天中发送的消息。
  • chat_member:发送消息的聊天成员。
  • date:发送信息的日期(周、月、日、年)。
  • page_number:PDF 中显示消息的页面。

我们使用包含聊天成员用户名的行作为谁发送了哪条消息的指示器。这些行不包括在最终列表中,因为它们不是对话的一部分。

设想

随着数据的清理和组织,我们可以创建一些可视化来展示数据洞察力。

我们决定创建一个水平条形图,其中每个条形对应一个聊天组成员,条形的长度代表一个聊天成员发送的消息数量。

我们选择了不同的颜色,所以我们随机生成颜色,并为每个聊天成员分配不同的颜色。

如果您正在运行此代码,并且您不喜欢生成的颜色,请随意重新运行代码并创建不同的颜色,或者手动为每个用户定义您想要的颜色。

我们获得每个聊天成员的消息数量,并将它们存储到一个字典中,其中的关键字是用户名,值是消息数。

我们使用 matplotlib 绘制条形图。

下面是生成的图表:

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

从图中我们可以看到埃德温·米兰达发送的信息最多。这可能是因为他在聊天群里分享了很多新闻文章并对其进行了评论,从 PDF 中可以看出这一点。

简略电报门

我们决定创建一个简短的 telegramgate PDF 文档,看看该文档可以缩短多少,以及聊天内容是否可以以更清晰、更直接的格式显示。生成的 PDF 不包含图像或 gif,也不能区分共享帖子和书面帖子。

为了创建 PDF,我们首先使用变量conversation中的内容创建一个 HTML 格式的字符串。我们写下页码、在前面部分中为可视化生成的颜色中的用户名,以及用户发送的消息。我们没有写邮件发送的日期。创建 HTML 字符串后,我们将它保存到本地文件夹中的一个文件中,命名为“telegramgate _ abridged.html”。然后我们使用 PDFkit Python 库从 HTML 文件创建 PDF 文件,我们将结果保存到“telegramgate _ abridged.pdf”。

生成的 PDF 有 654 页长,而原始文档有 899 页。这意味着新的 PDF 比原来少了 245 页。

我们选择对用户名进行颜色编码,以便于区分是谁写的消息。当用户名具有相同的长度和颜色时,它们可以在视觉上融合在一起。如果您希望创建不带彩色用户名的 PDF,您可以通过删除添加在 for 循环中的font标签来实现。

你可以在这里访问这个脚本生成的 PDF。

结论

在本文中,我们用 Python 做了以下工作:

  • 使用 Tika 阅读 telegramgate PDF 文档
  • 通过删除与聊天内容无关的文本来清理数据,我们通过使用各种定制的正则表达式来识别这些文本
  • 通过将 PDF 内容存储在字典数组中来组织 PDF 内容,其中每个字典包含要发送的邮件、发送邮件的用户、邮件出现的页面以及邮件发送的日期
  • 从 PDF 内容中检索和可视化见解
  • 创建了一个 telegramgate PDF 的节略版(用户名以颜色区分),长达 654 页(比原始文档少 245 页)

通过这个练习,我们证明了我们可以通过编程来学习 telegramgate 文档。这一点很重要,因为在阅读文档时,我们对内容的解释会因我们的核心信念而异。我们也可能将某些言论归咎于错误的人。我们需要一种方法来排除分析文档时的人为偏见。

可以在文本中进行更复杂的分析,例如内容文本摘要、文本分类和情感分析。

从劳尔·马尔多纳多的儿子在他的推特账户上发表的一份声明中,暗示聊天组中存在超过 889 页的对话,这可能最终会被披露(来源)。我们可以使用这里开发的代码来分析新内容。

您是否有任何想法可以从 Telegramgate 文档中提取更多见解?Leave them in a comment below!

参考资料

Resources for telegramgate information:

  1. Telegramgate PDF: 889 页
  2. #TelegramGate: Leaks From a Private Group Chat Leave Rosselló Administration Exposed
  3. 下一篇 : 新的一天:Christian Sobrino 辞去所有职务
  4. 新的一天:卡洛斯·贝穆德斯辞去州长和驻地专员的顾问职务
  5. 下一篇 : 新的一天:Rafael Cerame 确认他没有与政府签订任何合同
  6. 新的一天:劳尔·马尔多纳多儿子透露,电报聊天超过 889 页
  7. 下一篇 : Telemundo:ElíasSánchez 声称他们对他进行了抹黑
  8. LinkedIn: Christian Sobrino Vega
  9. LinkedIn: Rafael Cerame
  10. LinkedIn: 埃德温·米兰达
  11. LinkedIn: Ramon R.(T21 )
  12. LinkedIn: Alfonso Orona

技术资源:

  1. 阿帕奇·提卡(Apache Tika) T25
  2. PyPI: Tika library
  3. 正则表达式 101 (T29)
  4. GitHub: Python-PDFKit
  5. Stackoverflow:在 Python 中生成随机的十六进制颜色
  6. PythonSpot: Matplotlib 条形图
  7. Stackoverflow:如何用 pyplot.barh()显示每个条形上条形的值?
  8. Stackoverflow:为什么我的 xlabel 在我的 matplotlib 剧情中被切断了?

用数字讲述描述性统计的全部故事!

原文:https://towardsdatascience.com/telling-the-full-story-of-descriptive-statistics-with-numbers-c91ce1c66e09?source=collection_archive---------15-----------------------

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

From Pinterest

统计可以证明任何事情,甚至是事实!所以真正理解它至关重要。统计学处理大量数据的收集、分析、解释和呈现。描述性统计与总结我们收集的分析信息的方法有关。描述性统计可以通过图形分析(如柱状图、饼状图等)和/或数字分析(本文一定会涉及)来实现。所以回到讲述我们的故事,为了有一个真实的叙述,我们必须谈论两个措施;

  1. 集中趋势的度量
  2. 可变性的度量

这篇文章触及了这些度量的各种估计,并强调了它们对异常值的稳健性(即敏感性)。在对这些估计的直觉进行适当解释后,将使用“python 编程”执行实施。如果这些概念一开始有点难以理解,尝试两次或更多次,这样你的误解就有统计学意义了!😀。

一些术语的快速定义将使我们扬帆起航:

  • 异常值:具有非常低或非常高的值的观察值,这些值往往与其他值存在异常的距离。异常值可能是由于测量中的可变性(包括进一步的调查)或它可能表明实验误差(可能需要从数据集中排除)。
  • 分配:某物在一群人之间分配或在一个地区传播的方式。
  • 顺序统计:基于从最小到最大排序的数据值的度量。

注意:本文中要考虑的这些措施都是通过 python 实现的。我选择使用一种依赖于“numpy”的方法,所以所有的技术在某种程度上都是一致的。使用的代码和数据集的链接可以在这里找到,代码嵌入在文末供参考。

让我们深入研究上面概述的两个措施,好吗?

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

From Pinterest

  1. 集中趋势的度量:集中趋势的度量是代表数据集中心点的汇总统计,这很重要,因为一个变量可能有数千个不同的值,我们希望估计我们的大部分数据位于何处。这些度量表示分布中大多数值的位置(即分布的中心),您也可以将其视为数据围绕中间值聚集的趋势。我们将在本文中介绍的一些中心位置估计包括
  • 平均
  • 修整平均值
  • 加权平均数
  • 中位数
  • 加权中位数
  • 方式

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

Photo by Hasan Albari from Pexels

Mean :这是对中心位置最基本的估计,也称为平均值。这是算术平均值,意味着它是所有值的总和除以值的个数。平均值的计算需要数据集中的所有值,因此值的任何变化都会影响平均值的计算。因此容易受到极高或极低的值(异常值)的影响。它在数学上表示为

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

修整平均值:这是平均值的一种变体,它是一种在计算平均值之前去除最大值和最小值的一小部分(称为截断)的平均方法。移除指定的异常值观察值后,使用标准算术平均公式计算出修整后的平均值。这有助于消除极值(异常值)的影响。它在数学上表示为

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

加权平均值:这是平均值的一种变化,计算方法是将每个数据值乘以一个权重,然后除以权重之和。当我们发现简单意味着我们使用相等的权重,那么为什么你会低估或高估一个变量呢?当一些值高度可变并可能导致低准确性时,可能会考虑变量的权重不足,而后者可能会在特定群体代表性不足时发生,因此我们在分析中采用权重过高的方法来捕捉它们的重要性。它在数学上表示为

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

Median:Median 是在有序统计中将数据集分成两半的中间值。如果有偶数个数据,中间值实际上并不在数据集中,而是将排序后的数据分为上下两半的两个值的平均值。中位数对异常值是稳健的。

***加权中值:*出于同样的原因,我们使用“加权平均值”,可以计算加权中值。这仅仅是当相关的权重被应用于排序的数据时。代替中间数,加权中值是一个值,使得排序列表的下半部分和上半部分的权重之和相等。加权平均值对异常值也是稳健的。

模式:模式是数据集中出现频率较高的值。如果没有值重复,则数据没有模式,这通常出现在连续值中(但是您可以通过定位概率分布图上的最大值来找到连续数据的模式),这就是为什么模式用于分类数据,而通常不用于数值数据。

2.分散程度的衡量:集中趋势的衡量只是故事的一部分,它总结了我们收集的信息以供分析。离差的度量简单地描述了数据集在中心位置的分散程度,显示了值是如何紧密聚集或分散的。它也被称为可变性的度量。因此,我们需要比集中趋势更多的信息来充分讲述描述性统计的全部故事。我们将在本文中介绍的一些中心位置估计包括:

  • 范围
  • 四分位间距
  • 平均绝对偏差
  • 差异
  • 标准偏差
  • 中位数绝对偏差

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

Photo by Jason Hogan on Unsplash

范围:数据集中最大值和最小值之差。这个范围很容易理解,也很容易计算,但并没有真正给出可变性的印象。此外,值得注意的是,由于其计算考虑了极值,因此对异常值不具有鲁棒性。

四分位距:为了充分理解这一点,我们必须谈谈数据分割。数据分段就是将订单统计数据分成相等的部分。通常,我们有三种相互关联的细分类型;

I .百分位数(将数据集分成 100 等份)

二。十分位数(将数据集分成 10 等份)

三。四分位数(将数据集分成 4 等份)

现在回到四分位数范围,正如我们已经知道的,它将数据集分成四个相等的部分。让我们直观地看看这种分割

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

对于该图,可以观察到,顺序统计的分布被分成四个相等的部分,分别包含 25%的数据集。从图中还可以看出,第二个四分位数(Q2)相当于第 50 个百分位数,这都意味着数据集的中间值(即中位数)。

四分位数范围就是第三个四分位数和第一个四分位数之间的差值。

***平均绝对偏差:*在我们深入研究这个问题之前,有必要真正理解“偏差”的真正含义。偏差仅仅是观察值和中心趋势度量的估计值(无论是平均值、中值等)之间的差异,描述了观察值如何偏离中心。

所以,平均绝对偏差是偏离平均值的绝对值。事实上,偏差的总和等于零(因为负值抵消了正值)。最终值为零说明不了什么!所以取偏差的绝对值会得到一个非零的答案,我们可以用它来描述分布的离差。

它在数学上可以表示为

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

***方差:*在这里,我们仍然使用偏离平均值的值,如“平均绝对偏差”中突出显示的,但是在方差中,我们不取这些偏差的绝对值,而是取其平方。这归功于这样一个事实:在统计学中,平方值比绝对值更方便。因此,方差是与平均值偏差的平方和除以 n-1,其中 n 是数据值的数量。它在数学上可以表示为

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

****标准偏差:从方差中可以看出,对偏差求平方将导致巨大的单位为平方的最终结果,因此为了补偿这一点,开发了标准偏差。想象一下,处理’ $ '可能真的会令人困惑,但标准偏差更容易解释,因为它与原始数据集的比例相同。标准差是方差的平方根。它在数学上可以表示为

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

中位数绝对偏差(MAD): 到目前为止,除了 IQR 之外,我们考虑的所有离差度量都包含了所有用于计算的值,因此容易受到异常值的影响。中值绝对偏差是对变异性的稳健估计,因为它处理的是中值。中位数绝对偏差是偏离中位数的绝对值。它在数学上可以表示为

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

代码

总之,我们已经看到了人物、场景、情节、冲突和解决方案,讲述了描述性统计的故事,并强调了关于异常值鲁棒性的各种措施,以及如何通过 python 实现。

感谢阅读!🙌

过去 100 多年的温度

原文:https://towardsdatascience.com/temperatures-over-the-last-100-years-80da88ec75c3?source=collection_archive---------11-----------------------

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

Readings: °F different from long-term average

他的可视化探索了美国过去 100 多年的气温变化。尽管美国无疑正在变暖,但各州之间和每年之间仍存在显著差异。在上面的可视化地图中,每个数据都显示为某一年某个州的平均温度与该州过去 118 年的平均温度之差。深蓝色表示今年比平均气温低得多,而深红色表示今年比平均气温高得多。下面的视频显示了 1900 年至 2017 年美国大陆气温平均值的偏差。

也许从这种形象化中最容易发现的是缺乏一个清晰的趋势。是的,在 20 世纪 90 年代,越来越多的州开始被染成深红色,但是凉爽的年代并没有消失。1998 年创下了美国有史以来最热的一年的记录,然后这个记录在 2006 年、2012 年、2015 年、2016 年和 2017 年被超过。然而,在此期间的其他年份,如 2008 年、2009 年、2013 年和 2014 年,平均气温仅略高于长期平均水平。同样,每年在州一级也很难确定一个明确的趋势。没有明显的相关性表明一个州异常温暖的一年预示着下一年同样的州也会变暖。这方面唯一明确的趋势是,温暖或凉爽的年份往往影响地区,而不是独立的国家。例如,阿拉巴马州的年平均温度远低于平均温度,很可能密苏里州和佐治亚州也记录了低于平均温度的温度。

尽管如此,这种可视化所揭示的一些趋势仍然令人不安。在过去的 20 年里,美国每年的气温都高于平均水平。自 1900 年以来,已经有 20 年超过 90%的州气温高于平均水平,其中 16 个州是自 1990 年以来。美国大陆的每个州都有 10 年高于平均温度的记录——其中 9 次发生在过去的 20 年里。如果这 10 个异常年份随机分布在 1900-2017 年期间,那么这 10 年中有 9 年会在过去 20 年中着陆的概率约为 6000 万分之一。

在全国平均气温异常高的年份,大多数州的气温也高于平均气温,这往往是事实。这意味着,近年来出现的全国平均气温偏高,通常是集体高温的结果,而不是几个异常州造成的平均值。

当然,这种可视化忽略了一些重要的趋势。一个显著的例子是一年内的温度峰值。气候变化的一个显著影响是极端和不稳定天气模式的增加。比方说俄勒冈州在某一年夏天记录了极高的温度,然后在冬天记录了极低的温度。夏季的高温可能会在全州范围内引发毁灭性的野火,冬季的冰冻可能会大大增加能源使用量并影响旅行。在这个想象中,那些极端将会消失,那一年将会被记录为平淡无奇。

点击此处查看完整互动数据可视化

这些数据是从国家海洋和大气管理局的国家环境信息中心收集的。

使用 cookiecutter 模板化您的数据科学项目

原文:https://towardsdatascience.com/template-your-data-science-projects-with-cookiecutter-754d3c584d13?source=collection_archive---------13-----------------------

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

Photo by Neven Krcmarek on Unsplash

在工作和生活中,每个人都必须完成重复的任务。说到数据和分析,例如,您可能在包含相同代码集的同一个笔记本上使用了相同的文件夹结构来分析不同的数据集。在这种情况下,人们所做的就是复制和粘贴他们的文件夹,然后手动更改他们的代码输入,希望不会在途中忘记任何东西,或者在执行这种令人生畏和讨厌的任务时分心。

有一个强大的工具可以避免以上所有情况,那就是 cookiecutter !这是为您知道需要重复多次的分析类型创建项目模板的一种不可思议的方式,同时只需输入一次必要的数据和/或参数。我将在这篇博文中介绍的例子非常琐碎,但是要记住,其目的是为了理解 cookiecutter 是如何工作的。一旦做到了这一点,你只需要变得有创造性,并适应你的需求!

注意:如果您想使用 cookiecutter,它必须是您的环境的一部分。如果您使用 Anaconda,在您的终端中键入conda list,看看它是否出现在安装包列表中,否则只需键入pip install cookiecutter

假设我想创建一个文件夹模板(一个包含笔记本,另一个包含我需要保存的文件),我想让笔记本在数据帧上执行某种计算。下面的快照显示了我每次运行 cookiecutter 时想要复制的结构。

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

该笔记本的目的是创建一个可定制行数和列数的数据框架。dataframe 将用两个值之间的整数填充,这两个值每次都可以改变。该模板还允许我选择我想要在行(或列)上运行的 numpy 函数,并将结果存储到将保存在 deliverables 文件夹中的文件中。当然,每次我想创建一个包含这样一个项目的文件夹时,我希望能够输入这样一个文件夹的标题,以及我要保存的文件的名称。该模板包含奇怪的语法,如{{cookiecutter.folder_title}},其中folder_title是 json 文件中包含的可定制变量之一。请记住,每次克隆模板时,包含在双花括号中的所有变量(在笔记本中,以及文件夹的名称)都将被替换为 json 文件中传递的相应值。

所有这些信息都进入cookiecutter.json文件,该文件中的必须保存在模板文件夹、**、**的顶层,如上图所示。

填充cookiecutter.json

json 文件是一个字典,包含了我每次创建这类项目的新副本时想要更改的变量的所有默认值。

创建模板笔记本

在模板笔记本中编写您想要复制的代码,并使用我上面提到的符号来分配变量,如下面的代码行所示:

为了更好地了解正在发生的事情,可以在这个链接找到整个笔记本。

无需再复制和粘贴,即可继续您的项目!

好的,太好了!现在是时候使用这个了,但是…我如何在每次克隆我的模板时改变我输入的值呢?轻松点。

从你的终端,移动到你想要克隆项目的文件夹,输入cookiecutter <absolute_path_of_Cookiecutter_folder>。一旦您这样做了,终端将要求您输入 json 文件中包含的所有变量的值,一次一个。如果您没有输入任何内容就按 enter 键,cookiecutter 将使用 json 文件中的默认值。完成后,瞧,项目的副本就创建好了!您将看到衍生和笔记本文件夹出现在您的当前目录及其所有内容!您现在可以打开笔记本并按原样运行它了!

这是一个很难解释的话题,不是因为它很难,而是因为它做起来比描述起来容易得多。出于这个原因,我把这个例子放在了我的 GitHub 页面上,这样你就可以克隆它并试用它了!玩了一会儿之后,你就会明白这有多强大,并且有望让你的(分析)生活变得更容易,这取决于你的需求!

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

请随意查看:

本帖的 GitHub repo

我的其他中帖。

我的 LinkedIn 个人资料。

感谢您的阅读!

时差学习

原文:https://towardsdatascience.com/temporal-difference-learning-47b4a7205ca8?source=collection_archive---------6-----------------------

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

使用时间差异(TD)学习的强化学习

在本文中,我将介绍时差学习方法。时域差分法是蒙特卡罗法和动态规划法的结合。

下面是蒙特卡罗(MC)方法的主要特征:

  1. 没有模型(代理不知道状态 MDP 转换)
  2. 代理人采样的经验中学习(类似于 MC)
  3. 像 DP 一样,TD 方法部分基于其他学习估计来更新估计,而不等待最终结果(它们像 DP 一样引导)。
  4. 它可以从不完整事件中学习,因此该方法也可以用于连续问题
  5. TD 将猜测更新为猜测,并根据实际经验修改猜测

为了更好地理解这一点,考虑一个现实生活中的类比;如果蒙特卡洛学习就像一次年度考试,学生在年底完成这一集。类似地,我们有 TD 学习,它可以被认为是每周或每月的考试(学生可以在每个小间隔后根据这个分数(收到的奖励)调整他们的表现,最终分数是所有每周测试的累积(总奖励))。

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

TD(0)

TD(0)是 TD 学习的最简单形式。在这种形式的 TD 学习中,在每一步之后,值函数用下一个状态的值来更新,并且沿途获得奖励。这种观察到的回报是保持学习基础的关键因素,并且算法在足够数量的采样后收敛(在无穷大的极限内)。下面是 TD(0)的备份图,以及我们的 gem 收集和检查示例的 TD(0)示例。

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

TD(0)可以用下图中的等式来表示。等式 1 通常在文献中显示,但我发现按照等式 2 编写的等式更直观。我们用α作为学习因子,γ作为折现因子。这里,状态 S 的值在下一个时间步长(t+1)中基于在时间步长 t 之后观察到的回报 r t+1 被更新,其中 S 的期望值在时间步长 t+1 中。因此,S 在时间步长 t 处的自举使用时间步长 t+1 的估计,而 r t+1 是观察到的回报(使算法落地的真实事物)。TD 目标和 TD 误差是等式的两个重要组成部分,用于 RL 的许多其他领域。

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

萨尔萨

用于控制或改进的 TD 算法之一是 SARSA。SARSA 的名字来源于代理从一个状态-动作值对向另一个状态-动作值对迈出一步,并在此过程中收集奖励 R(因此是 S t,at,R t+1,S t+1 &一个 t+1 元组,它创建了术语 S,A,R,S,A )。SARSA 是一种政策上的方法。SARSA 使用动作值函数 Q 并遵循策略π。GPI(blog-2 中描述的广义策略迭代)用于基于策略π采取行动(ε-贪婪以确保探索以及贪婪地改进策略)。

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

SARSA 可以用下图所示的等式来表示。等式 1 通常在文献中显示,但我发现按照等式 2 编写的等式更直观。我们用α作为学习因子,γ作为折现因子。还显示了 TD 目标和 TD 误差的动作值版本。

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

q 学习

Q-learning 是一种非策略算法。在非策略学习中,我们评估目标策略(π),同时遵循另一个称为行为策略 (μ)的策略(这就像机器人遵循视频或基于另一个代理获得的经验的代理学习)。DQN(深度 Q-learning)登上了《自然》杂志的头版,它是一种基于 Q-Learning 的算法(几乎没有额外的技巧),在雅达利游戏中超越了人类水平的专业知识(我将在未来的帖子中详细介绍 DQN)。在 Q-learning 中,目标策略是贪婪策略,行为策略是ε-贪婪策略(这确保了探索)。

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

参考下图,以两种不同方式编写的 Q 学习算法。看看目标和行为策略动作在等式中是如何表示的。

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

预期萨莎

预期 SARSA 就像 Q-learning 一样,除了它使用期望值而不是下一个状态-动作对的最大值,并考虑了每个动作在当前策略下的可能性。给定下一个状态,Q-learning 算法确定性地将向同一方向移动,而 SARSA 按照期望跟随,因此,它被称为期望 SARSA。它的备份图如下所示。

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

参考下图,了解以两种不同方式编写的预期 SARSA 算法。与 Q-learning 的区别就凸显出来了。

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

TD 方法具有以下优势:

  • TD 可以在线或离线学习每一步
  • TD 可以从不完整序列中学习
  • TD 可以在非终止环境中工作**(续)**
  • 与 MC 相比,TD 具有更低的方差,因为它依赖于一个随机动作、转换、奖励
  • 通常比 MC 更有效
  • TD 利用了马尔可夫特性**,因此在马尔可夫环境中更加有效**

但是它也有下面的限制**😗*

  • TD 是一个有偏差的估计值
  • TD 对初始值更加敏感

最后一个音符

这里我们介绍了单步 TD 方法,但也有多步 TD 方法以及 TD 和 MC 的组合,如 TD(λ)算法。TD 是强化学习中的突破性创新,每个从业者都需要将它放在他们的工具包中。

感谢阅读。可以联系我@ LinkedIn

只需每月 5 美元,就可以无限制地获取最鼓舞人心的内容……点击下面的链接,成为 Medium 会员,支持我的写作。谢谢大家! https://baijayanta.medium.com/membership

机器学习面试的十个要素

原文:https://towardsdatascience.com/ten-elements-of-machine-learning-interviews-ba79db437ad1?source=collection_archive---------36-----------------------

非常有用的在线资源列表。

作为一名博士生,我对 ML 算法有相当好的理解,但仍然发现机器学习面试具有挑战性。挑战来自于这样一个事实:在一个 ML 项目中,有比模型拟合更多的东西。大多数教科书都涵盖了 model.train()背后的技术细节。从一个 ML 教科书中推导出所有的东西,并为一个用例找到合适的 ML 解决方案,这需要两套非常不同的技能。此外,分解一个 ML 项目的复杂性,并在压力下连贯地讨论它不是开玩笑的。在准备科技公司的机器学习面试时,我试图保持一个广泛的范围,并对最广泛使用的 ML 用例进行逆向工程。

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

Photo by Kaleidico on Unsplash

  1. 除了“训练验证和测试”之外,这个脸书指南还是一个很好的通用框架这里的重点是:寻找数据来源和实验。ML 项目通常关注如何处理给定的数据,但更重要的问题是如何找到相关的数据。实验是另一个很少被讨论的方面,因为大多数 ML 模型都没有被部署。

[## 介绍机器学习视频系列的脸书现场指南

《脸书机器学习指南》是由脸书广告机器学习公司开发的六集视频系列

research.fb.com](https://research.fb.com/blog/2018/05/the-facebook-field-guide-to-machine-learning-video-series/)

2.Andrej Karpathy 的博客文章非常棒,因为它概述了进行深度学习的高度实用的过程,即从最简单的基线开始,并从那里逐步迭代。我非常相信这个过程。这与许多人的做法相反,他们有立即使用最复杂模型的冲动。此外,从面试的角度来看,说出漂亮模特的名字比给人留下深刻印象更危险,除非你真的很了解自己。

[## 训练神经网络的方法

几周前,我发表了一篇关于“最常见的神经网络错误”的推文,列出了一些常见的问题,涉及…

karpathy.github.io](http://karpathy.github.io/2019/04/25/recipe/)

3.这篇 Airbnb 博客文章涵盖了他们如何在几个不同的阶段建立体验搜索。他们分享了这么多关于他们如何解决这个问题的细节,这太棒了。当你对问题的正确方面进行优先排序时,解决方案就会自然而然地出现。在 ML 面试中,确定主要目标并意识到限制因素是至关重要的。

[## 基于机器学习的 Airbnb 体验搜索排名

我们如何为一个新的双边市场构建和迭代机器学习搜索排名平台,以及我们如何…

medium.com](https://medium.com/airbnb-engineering/machine-learning-powered-search-ranking-of-airbnb-experiences-110b4b1a0789)

4.我认为凯文·墨菲的书对于有研究生水平数学背景并有耐心读完它的人来说是一个很好的参考。然而,Hal Daumé III 的书要简洁得多,下面的备忘单包含了大多数突击测验的概念。你不想在一个基本的问题上空白或者在不必要的数学上花费时间(为了面试)。

[## 机器学习课程

机器学习是对从数据和经验中学习的算法的研究。它被广泛应用于…

ciml.info](http://ciml.info/) [## 教学- CS 229

您想看看这套母语的备忘单吗?你可以在 GitHub 上帮我们翻译!我的…

stanford.edu](https://stanford.edu/~shervine/teaching/cs-229/)

5.如果像大多数 Kaggle 竞赛中一样有足够多的高质量标记数据,使用随机森林或梯度提升就可以达到目的。最有可能的是,你不会击败 Kaggle 赢家,但在实践中,谁会关心 0.1%的改善?《统计学习元素》有关于随机森林和梯度推进的精彩章节,但下面是一篇较短的文章。此外,了解 scikit-learn 中特性的重要性是如何计算的也是值得的。

[## 从零开始的渐变提升

简化复杂的算法

medium.com](https://medium.com/mlreview/gradient-boosting-from-scratch-1e317ae4587d) [## 总结 Scikit 中的功能重要性-了解一组功能

是的,这是对特征集合的重要性求和的完全正确的方法。在 scikit-learn 中,重要性…

stats.stackexchange.com](https://stats.stackexchange.com/questions/311488/summing-feature-importance-in-scikit-learn-for-a-set-of-features)

6.西蒙·芬克为网飞奖设计的矩阵分解算法出奇的简单,其背后的逻辑也很直观。我们只是简单地将用户向量和项目向量线性投影到一个潜在空间中,在这个空间中,它们的相似性决定了推荐的概率。有人会说学习合适的潜在表征是最大似然法的本质。

[## 网飞更新:在家试试这个

>]网飞更新:在家里试试这个[后续]好了,我在这里告诉大家我(现在我们)是如何成为…

sifter.org](https://sifter.org/~simon/journal/20061211.html)

7.然而在实践中,与网飞竞赛相比,有许多用例特定的考虑事项。网飞竞赛基本上有固定的数据,但如果新的数据不断出现呢?此外,如果我们可以合并关于项目本身的数据,会怎么样呢?这个谷歌课程提供了更全面的指导。

[## 建议:什么和为什么?推荐系统

YouTube 怎么知道你接下来可能想看什么视频?谷歌 Play 商店如何挑选一款适合你的应用程序…

developers.google.com](https://developers.google.com/machine-learning/recommendation/overview)

8.这篇 Instagram 博文无疑将推荐系统设计提升到了一个新的高度。它建立在上面提到的东西之上,并针对它们的特定用例进行了大量优化。

[## Instagram 上的核心建模

在 Instagram,我们有许多机器学习团队。虽然他们都在产品的不同部分工作,但他们都…

instagram-engineering.com](https://instagram-engineering.com/core-modeling-at-instagram-a51e0158aa48)

9.这个脸书视频从模型部署的角度提供了一个视角,并令人惊讶地揭示了他们的 ML 解决方案在高层次上的几个用例。任何想用深度神经网络解决每个问题的人都应该看看这个视频。

10.回到实验这个话题,每个人都听说过多臂强盗,但它实际上是如何工作的呢?

https://peterroelants . github . io/posts/multi-armed-bandit-implementation/

2020 年数据科学和人工智能的十大预测

原文:https://towardsdatascience.com/ten-predictions-for-data-science-and-ai-in-2020-f6abb0c3977d?source=collection_archive---------13-----------------------

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

Photo by Kevin Ku on Unsplash

当我们来到 2019 年底时,我们反思了这一年,这一年的开始已经看到 100 篇机器学习论文在一天内发表,它的结束看起来将看到人工智能打破记录的资助年。

但从数据科学和人工智能中获得真正价值的道路可能是一个漫长而艰难的旅程。

套用新经济思维研究所(Institute for New Economic Thinking)的 Eric Beinhocker 的话来说,物理技术以科学的速度发展,而社会技术以人类可以改变的速度发展——慢得多。

应用于数据科学和人工智能领域,如果决策不能有效地做出,组织流程积极阻碍数据科学和人工智能,人工智能应用程序由于缺乏信任而不被采用(“社交技术”),那么最复杂的深度学习算法或最强大和可扩展的实时流数据管道(“物理技术”)就没有什么意义。

考虑到这一点,我对 2020 年的预测试图平衡这两个方面,强调公司的实际价值,而不仅仅是数据科学团队的“酷东西”。

1。 **数据科学和 AI 角色延续了专业化的趋势。**侧重于大型生产系统以及支撑它们的基础设施和平台的“工程型”数据科学角色(“数据/ML/AI 工程师”)与侧重于调查工作和决策支持的“科学型”数据科学角色(“数据科学家/业务分析专业人员/分析顾问”)之间存在实际差异。

对比鲜明的技能组合、不同的思维模式和既定的部门结构使这成为一种引人注目的模式。前者与 IT 有着天然的密切关系,并随着更多型号投入生产而变得更加突出。它也被证明是从软件工程开始的一个可行的职业过渡(比如这里的、这里的和这里的)。相反,决策支持的即时性和持续应对不确定性的需求要求数据科学家以咨询身份融入业务,而不是通过项目进行管理。

我们继续悄悄地远离独角兽的想法,因为仅仅因为某人可以做某事,并不意味着他或她应该。尽管多才多艺的执行者有很多价值,但在建立和扩展大型数据科学团队时,他们并不是比较优势。

2。 高管对数据科学和 AI 的理解变得更加重要。人们开始意识到,数据科学价值的瓶颈可能不是数据科学或人工智能的技术方面(喘息!),而是数据科学实际消费者的成熟度。

虽然一些科技公司和大公司有一个开端,但是越来越多的人意识到内部培训项目通常是发展内部成熟度的最好方式。这是因为他们能够定制内容,从组织所处的位置开始,并根据可识别的公司业务问题和内部数据集调整培训。

3。 端到端模型管理成为需要生产的最佳实践。随着数据科学和人工智能项目在生产中的实际足迹越来越大,需要解决的问题已经合并到端到端模型管理的规程中。这包括模型的部署和监控(“模型操作”)、不同层次的支持,以及当模型随着时间的推移自然熵化时,对何时重新训练或重建模型的监督。

模型运营支持活动的系统也是一种不同于数据科学家和机器学习工程师的独特技能,推动着这些团队和支持他们的 IT 组织的发展。

4。 数据科学和人工智能伦理继续获得动力,并开始形成一个独特的学科。大规模自动化决策的二阶效应一直是一个问题,但它最终在公众意识中获得了一席之地。这是由于像剑桥分析公司丑闻亚马逊废弃其显示对女性有偏见的秘密人工智能招聘工具这样的突出事件。

该领域本身正在围绕一系列主题寻找定义,围绕自动决策的活动以及何时让人类参与进来,算法偏差和公平性,隐私和同意,以及通往人工通用智能的道路上的长期危险。

特别值得注意的是数据科学和全球隐私法规之间的互动。GDPR 已于 2018 年年中生效,现在对数据处理和分析、模型透明度的要求以及数据科学家工作的组织对不利后果负责的可能性都有限制。

技术通常比监管范式快几年,但监管正在迎头赶上。随着数据科学和人工智能团队学会在新的约束下工作,这将导致短期的痛苦,但最终将导致长期的收益,因为可信的参与者与坏的参与者是分开的。

5。 **工具的趋同导致混乱,**由于完成同一任务的多种方式,不同的群体根据其背景偏好不同的方法。这可能会继续造成混乱,因为新进入该行业的人可能只能看到整体的一部分。

今天,如果您为大型组织工作,并且能够负担得起,那么您可以使用企业工具进行建模。如果您是 MS SQL Server 的 DBA,您可以在数据库环境中建模。如果你是一名软件工程师,你可以调用机器学习 API,开发一个“人工智能产品”。如果您熟悉云产品,可以在 AWS Sagemaker 或 Azure ML Studio 等云平台上构建和部署相同的模型。这样的例子不胜枚举。

最终结果可能是误解和地盘之争的沃土,因为相似的功能以不同的形式存在。在这种情况下,能够在完全不同的技术团队之间建立高度信任的组织将会获得当今可用工具包的全部好处。

6。 加倍努力实现数据科学和人工智能的“民主化”和“自动化”,过度承诺的政党失败了。由于人才有些难以捉摸(或者至少是分配不当),自动化数据科学和人工智能是一个有吸引力的想法。然而,现实仍然是,技术的界限只能使某些明确规定的任务自动化。

以一个典型的数据科学项目为例,围绕模型构建的活动有很多:

  1. 选择正确的项目,组建具有正确技能组合的团队,交流方法,并在必要时获得必要的支持和资金。
  2. 一旦项目开始,选择如何解决问题和采取的方法。例如,故障预测应该被框架化为有监督的还是无监督的机器学习问题?还是一个有待模拟的系统?还是异常检测问题?
  3. 一旦你框定了问题,选择正确的数据来使用,并选择正确的数据而不是来使用——例如,出于道德考虑。
  4. 在数据端进行处理,以确保不会导致错误的模型。例如,电子邮件数据实际上需要在标题、标签等之间进行大量的争论才能得到实际的信息。
  5. 一旦你有了数据,就产生了假设——例如,在大规模数据集中进行数据挖掘,在“进行数据科学”之前,很多工作是关于决定哪些想法可能值得研究。
  6. 建立并优化模型。<这就是正在被自动化的>
  7. 一旦你建立并优化了你的模型(如果你选择使用模型的话),决定它是否有价值。
  8. 一旦你决定这项工作是值得的,将开发的机器学习模型嵌入到生产系统和既定的业务流程中。仅仅这一步通常比所有其他步骤加起来花费的时间还要多。
  9. 一旦模型被部署,构建未来的版本以确保所构建的是完全运行的,经过测试的,并且与其他系统集成。
  10. 一旦整个机器学习系统经过良好的测试并达到工程标准,就可以实际解释和处理数据科学项目的输出。

就像 Wix、Squarespace 和其他网站建设者没有让 web 开发者出局一样,AutoML 和 DataRobot 也不会取代数据科学家。(然而,它们是很好的工具,应该以这种方式进行营销。)

7 .。 边缘建筑和迷雾开始进入主流。部署越来越大的复杂模型的实际必要性和工程成本正在推动新的架构模式。对于实时视频分析的计算和数据传输要求来说尤其如此,被誉为边缘分析的“杀手级应用”。这一趋势得到了计算机视觉领域的进步和新的专用商业硬件的支持,如 AWS Deeplens

8。 **定义的炒作周期和泛滥正在转移。**在大约 5 到 6 年前转向“数据科学”之前,它首先专注于“大数据”,2020 年可能是所有“人工智能”都可能取代对话的一年。

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

Big data is not the point in itself — it is what we do with it that matters.

不得不接纳大量新人的副作用之一是简化了该领域,就数据科学而言,这种简化使其更加强调统计和机器学习,而不强调运筹学和模拟等其他数学建模学科。

人工智能也开始出现类似的模式,类似的重点是机器学习、神经网络和深度学习,通常是在视觉和自然语言处理的背景下。这种弱化目前似乎出现在经典的人工智能领域,如知识表示、专家系统和规划等。

作为旁注,我完全理解转移到一个新领域是很难的,数据科学和人工智能的广度可能是压倒性的。我发现打破这堵墙最有用的东西很少是更多的内容,而是更好的导航。有人能定位我们知道什么和不知道什么,并画出个人的学习路线图,这比无序的学习材料链接列表有用得多。

9。 **竞争进入 AI 芯片市场。**英伟达在深度学习硬件市场上有着巨大的领先优势,目前主导了云中的大部分人工智能。虽然有来自谷歌、高通、亚马逊、Xilinx 和多家初创公司的重要进入者,但竞争仍主要发生在边缘地带。

这将最终改变,因为为人工智能提供动力不仅仅是一个芯片,而是一个完整的便携式硬件平台,最好没有供应商的限制。英特尔和脸书的新芯片可能是期待已久的竞争,或者它可能来自中国公司在贸易战中急于制造自己的芯片。几乎与此同时,到 2019 年下半年,阿里巴巴华为都将发布芯片。

10。最后,**教授数据科学和人工智能并销售工具仍然比实际让它在实践中发挥作用更容易。**从数据科学和人工智能中创造价值不仅困难,而且需要超越数据科学家和机器学习工程师的讨论和共识。

从本质上来说,人工智能系统通常是优化机器。我们刚刚开始问的问题是“我们在优化什么?”尽管在数据、建模和架构方面“做正确的事情”得到了所有的关注,但在为以人为中心的体验和价值观进行设计方面,可以说更难的任务是“做正确的事情”。

同样,数据驱动的决策需要由高级、非技术决策者做出,他们通常会陷入复杂的政治阴谋网络中,并且经常在没有数据科学的情况下成功完成整个职业生涯。

在生产方面,成功的模型部署只是产品的一小部分,并且会受到从内部 IT 环境到过时的监管要求等无数因素的限制,所有这些都与处理数据固有的不确定性有关。对“生产中的模型”本身的痴迷也可能在某种程度上被误导,数据科学的主要 KPI 之一仍然是最难以捉摸的— “你改变主意了吗”

以上显示的所有图像仅用于非商业说明目的。本文是以个人身份撰写的,不代表我所工作或隶属的组织的观点。

R 中十个你可能不知道的随机有用的东西

原文:https://towardsdatascience.com/ten-random-useful-things-in-r-that-you-might-not-know-about-54b2044a3868?source=collection_archive---------7-----------------------

r 充满了有用的东西。这里有一些我经常使用的东西,其他人可能不知道。

我经常发现自己告诉我的同事和程序员同事一些我在 R 中使用的简单的事情,这些事情真的对我需要继续前进的任务有帮助。这些范围从琐碎的快捷方式,到鲜为人知的功能,到方便的小技巧。

因为 R 生态系统是如此丰富和不断增长,人们可能经常错过了解一些真正能帮助他们完成任务的东西。所以我经常会从我的观众那里得到惊讶的反应,比如“我从来不知道这件事!”。

以下是让我在 r 工作更轻松的十件事。如果你已经全部知道了,很抱歉浪费了你的阅读时间,请考虑添加一些你认为对其他读者有益的评论。

1.switch功能

我爱switch()。它基本上是一个根据另一个变量的值选择其值的if语句的简化。我发现当我编写需要根据您之前的选择加载不同数据集的代码时,它特别有用。例如,如果你有一个名为animal的变量,你想根据animal是狗、猫还是兔子来加载一组不同的数据,你可以这样写:

data <- read.csv(
  switch(animal, 
         "dog" = "dogdata.csv", 
         "cat" = "catdata.csv",
         "rabbit" = "rabbitdata.csv")
)

这在闪亮的应用程序中特别有用,在这些应用程序中,您可能希望根据一个或多个输入菜单选项来加载不同的数据集甚至环境文件。

2.RStudio 快捷键

这与其说是 R hack,不如说是 RStudio IDE,但是常用命令的快捷键非常有用,可以节省大量的键入时间。我最喜欢的两个是管道操作符%>%的 Ctrl+Shift+M 和赋值操作符<-的 Alt+。如果你想看到这些令人敬畏的快捷键的完整集合,只需在 RStudio 中键入 Atl+Shift+K。

3.flex 仪表板包

如果你想要一个快速闪亮的仪表板,并以最少的忙乱运行,flexdashboard包有你需要的一切。它提供了简单的 HTML 快捷方式,可以方便地构建侧栏和将显示组织成行和列。它还有一个超级灵活的标题栏,你可以将你的应用程序组织到不同的页面,并放置图标和链接到 Github 代码或电子邮件地址或其他任何东西。作为一个在RMarkdown中运行的包,它还允许你将所有的应用保存在一个Rmd文件中,而不需要像shinydashboard那样将它分解成单独的服务器和 UI 文件。每当我需要在进入更高级的设计之前创建一个简单的仪表板原型时,我都会使用flexdashboard。我经常可以使用flexdashboard在一个小时内设置并运行仪表盘。

4.R Shiny 中 req 和 validate 函数

r 闪亮的开发可能会令人沮丧,尤其是当您得到一般性的错误消息时,这些消息不能帮助您理解到底出了什么问题。随着 Shiny 的发展,越来越多的验证和测试功能被添加进来,以帮助更好地诊断和在特定错误发生时发出警报。req()功能允许您阻止一个动作的发生,除非环境中存在另一个变量,但这样做是无声的,不会显示错误。因此,您可以使 UI 元素的显示以之前的操作为条件。例如,参考我上面的示例 1:

 output$go_button <- shiny::renderUI({ # only display button if an animal input has been chosen

  shiny::req(input$animal) # display button shiny::actionButton("go", 
                      paste("Conduct", input$animal, "analysis!") 
  )
})

validate()在呈现输出之前进行检查,并使您能够在不满足特定条件时返回定制的错误消息,例如,如果用户上传了错误的文件:

# get csv input fileinFile <- input$file1
data <- inFile$datapath# render table only if it is dogsshiny::renderTable({
  # check that it is the dog file, not cats or rabbits
  shiny::validate(
    need("Dog Name" %in% colnames(data)),
    "Dog Name column not found - did you load the right file?"
  ) data
})

关于这些函数更多信息,请参见我的另一篇文章这里的

5.使用隐藏凭据。伦韦龙

如果您正在共享需要登录数据库等凭证的代码,您可以使用.Reviron文件来避免将这些凭证发布到 Github 或其他可能存在风险的空间。.Renviron是一个可以存储重要环境变量的文件,可以使用usethis包中的edit_r_environ()函数轻松编辑。例如,您可以在.Renviron中为您的远程数据库凭证设置一个别名,例如:

 DSN = "database_name",
  UID = "User ID",
  PASS = "Password"

然后在你的共享脚本中,你可以调用这些变量。例如:

db <- DBI::dbConnect(
  drv = odbc::odbc(),
  dsn = Sys.getenv("DSN"),
  uid = Sys.getenv("UID"),
  pwd = Sys.getenv("PASS")
)

6.使用 styler 自动进行 tidyverse 造型

这是艰难的一天,你已经有很多事情要做了。你的代码不像你想的那样整洁,你没有时间来编辑它。不要害怕。styler包有许多功能,允许你的代码自动重定风格以匹配 tidyverse 风格。在你混乱的脚本上运行styler::style_file()很简单,它会为你做很多(虽然不是全部)工作。

7.参数化 R 降价文档

所以你写了一个可爱的 R Markdown 文档,其中你分析了一大堆关于狗的事实。然后你被告知——“不,我对猫更感兴趣”。不要害怕。如果您将 R markdown 文档参数化,那么只需一个命令就可以自动生成类似的关于 cats 的报告。

您可以通过在 R Markdown 文档的 YAML 头中定义参数,并给每个参数赋予一个值来做到这一点。例如:

---
title: "Animal Analysis"
author: "Keith McNulty"
date: "21 March 2019"
output:
  html_document:
    code_folding: "hide"
params:
  animal_name:
    value: Dog
    choices:
      - Dog
      - Cat
      - Rabbit
  years_of_study:
    input: slider
    min: 2000
    max: 2019
    step: 1
    round: 1
    sep: ''
    value: [2010, 2017]
---

现在,您可以将这些变量作为params$animal_nameparams$years_of_study写入文档中的 R 代码。如果您正常编织您的文档,它将按照value变量用这些参数的默认值编织。但是,如果您通过在 RStudio 的编织下拉菜单中选择此选项(或使用knit_with_parameters())来编织参数,则会出现一个可爱的菜单选项,供您在编织文档之前选择参数。厉害!

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

Knitting with Parameters

8.revealjs

revealjs是一个软件包,可以让你用一个直观的幻灯片导航菜单创建漂亮的 HTML 演示文稿,并嵌入 R 代码。它可以在 R Markdown 中使用,有非常直观的 HTML 快捷方式,允许您创建一个嵌套的、逻辑结构的漂亮幻灯片,有各种样式选项。事实上,演示是 HTML 格式的,这意味着人们可以在平板电脑或手机上听你讲话,这非常方便。您可以通过安装包并在您的 YAML 头文件中调用它来建立一个revealjs演示。这是我最近用revealjs做的一个演讲的 YAML 标题的例子

---
title: "Exporing the Edge of the People Analytics Universe"
author: "Keith McNulty"
output:
  revealjs::revealjs_presentation:
    center: yes
    template: starwars.html
    theme: black
date: "HR Analytics Meetup London - 18 March, 2019"
resource_files:
- darth.png
- deathstar.png
- hanchewy.png
- millenium.png
- r2d2-threepio.png
- starwars.html
- starwars.png
- stormtrooper.png
---

这是一个例子。你可以在这里找到代码,在这里找到演示

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

Easy online presentations using revealjs

9.R Shiny 中的 HTML 标签(例如在你的 Shiny 应用程序中播放音频)

大多数人没有充分利用 R Shiny 中可用的 HTML 标签。有 110 个标签提供了各种 HTML 格式和其他命令的快捷方式。最近,我开发了一个闪亮的应用程序,它需要很长时间来执行一项任务。知道用户可能会在等待任务完成的同时进行多任务处理,我使用tags$audio让应用程序播放胜利的号角,在任务完成时提醒用户。

10.表扬包

可笑的简单,但也很棒,praise包向用户传递赞美。虽然这看起来像是毫无意义的自我欣赏,但它实际上在编写简历包时非常有用,如果某人做对了,你可以对他进行表扬或鼓励,例如,如果一个过程成功完成。你也可以把它放在一个复杂脚本的末尾,当它成功运行时,给你额外的快乐。

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

The praise package

最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在 LinkedIn Twitter上找我。

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

一万次初次约会:强化学习浪漫

原文:https://towardsdatascience.com/ten-thousand-first-dates-reinforcement-learning-romance-c75992beab10?source=collection_archive---------19-----------------------

新西兰——我生活的地方——历史上没有“约会”文化,更没有“狂饮”文化。我年轻时普遍接受的交配仪式是喝得酩酊大醉,在一个完全陌生的人的陪伴下醒来,然后——如果你喜欢他们的样子——羞怯地建议再次订婚。但是时代在变。约会应用和日益全球化的文化让“约会”的概念在新西兰变得更加流行,如果一个人想在现代吸引情郎,他必须适应。我必须学会如何去约会?这对我来说是未知的领域!我的成长经历和以前的社会经验都没有让我准备好在吃饭时与一个有魅力的陌生人交谈的严酷。在和某人共度一夜之前决定我是否喜欢他的想法很奇怪,坦白说有点可怕。更令人不安的是,与此同时,他们会决定是否喜欢我!这是一个雷区。一个复杂的环境,充满了失误和变化的规则。一个不同于我自己的社会和文化。换句话说,它是机器学习算法的完美环境。

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

我们将要使用的特定算法在机器学习领域有点奇怪。这与我们之前看到的分类和回归方法有很大不同,在分类和回归方法中,一组观察结果被用来推导出规则,从而对未知情况做出预测。它也不同于我们见过的更非结构化的算法,例如让我们提出针织图案建议或找到类似电影的数据转换。我们将使用一种叫做“强化学习”的方法。强化学习的应用非常广泛,包括机器人的复杂控制器、建筑物中电梯的调度以及教计算机玩视频游戏。

在强化学习中,一个“代理”(计算机)试图通过在复杂的环境中做出选择来最大化它的“回报”。我将在这篇文章中使用的具体实现被称为“q-learning”,这是强化学习的一个最简单的例子。在每一步,该算法记录环境的状态,它所做的选择,以及该选择的结果,即它是产生奖励还是惩罚。该模拟被重复多次,并且计算机随着时间的推移学习在哪些状态下的哪些选择导致最大的奖励机会。

例如,想象一个强化算法学习玩视频游戏“Pong”。在 pong 中,两个玩家用一个白色的线代表的小球拍面对面。一个用白点表示的球在它们之间来回弹跳。球员可以上下移动球拍,试图阻挡球并将其反弹给对手。如果他们错过了球,他们失去了一分,游戏重新开始。

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

每半秒或四分之一秒,强化算法会记录下球拍的位置和球的位置。然后它选择向上或向下移动它的桨。起初,它随机做出这个选择。如果在接下来的时刻球还在比赛中,它会给自己一个小小的奖励。但是,如果球出界了,失分了,它会给自己一个很大的处罚。将来,当算法做出选择时,它会查看过去的行为记录。当选择导致奖励时,它更有可能再次做出选择,而当选择导致惩罚时,它就不太可能重复错误。在训练之前,算法随机上下移动桨,什么也没达到。经过几百轮训练后,动作开始稳定,它试图用桨抓住球。经过成千上万回合,它是一个完美的球员,从来没有错过球。它已经学会了什么叫做“政策”——给定一个特定的游戏状态,它精确地知道哪一个动作将最大化它获得奖励的机会。

但是如何将这一点应用到我目前的困境中呢?我如何用强化学习来教自己去约会?

首先,我需要一个典型约会场景的完全准确的模拟。然后,我将训练一名代理人完美地完成这次模拟。最后,我可以检查代理学习的策略,以确定最佳约会策略。这是一个万无一失的计划。

第一,模拟。我想给你介绍一个我开发的小程序,叫做完全精确的日期模拟器。这是对两个人之间的现代约会的完整而彻底的模拟。让我简单解释一下:

每次约会都要进行十轮。在每一轮约会中,代理人从四个普遍接受的话题中选择一个话题:体育、流行音乐、历史、机器学习和人工智能。这个话题会让代理人的伙伴高兴或不高兴,伙伴会给出微妙和模糊的信号。一旦伴侣对机智的对话感到足够满意,代理人可能会尝试“调情”,这将有望使约会圆满结束。代理人也可能选择喝酒——增加他们的信心,并希望给他们的谈话增添一些亮点;或者,对日期感到绝望,代理人可以选择离开。

从我以前不懂编织的失败中吸取了教训,我招募了一些约会专家来给出他们对模拟器的看法。他们把它描述为“令人困惑”、“武断”和“毫无意义”,由此我得出结论,这是一个非常成功的模拟。

你可以使用完全精确的约会模拟器试试自己的约会运气。

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

Totally. Accurate.

所以,现在来训练我们的特工如何应对复杂的人际关系网。

我们派我们的代理人去约会一万次。代理记录每个点的日期状态,以及到达该点所采取的操作。任何以成功结束的约会都会有奖励。代理人会记住并更有可能重复导致这个结论的行为。起初,它会随机选择行动,但随着它在日期上的成功,它会更重视这些选择,更详细地探索这些成功的途径。

在训练期结束时,我们可以检查代理的表现如何——在 100 次约会中,有多少次以成功告终?我们运行模拟,发现…

…灾难!代理每次约会都失败!检查代理人的行动,他似乎仍然在作出基本上随机的选择。他什么都没学到!出了什么问题?原来这是强化学习的通病。代理需要采取的一系列行动是漫长而复杂的。他偶然发现这一点的几率非常低,而他经常重复这一点以形成强有力政策的几率几乎为零。这意味着,即使在一万次约会之后,代理人也没有学到足够的东西来可靠地吸引他的伴侣——他在约会中的成功永远不会超过随机的机会。

我们需要做的是创造所谓的“有形”奖励。我们需要奖励经纪人朝着成功约会迈出的一小步,比如选择一个好的话题;惩罚犯错的代理人,比如用一个糟糕的话题来烦对方。

有了这种新方法,我们将让代理人进行另外一万次约会,并再次测试他,引导我们…

…又是灾难!代理人每次约会都失败,当我们看他在约会中的行动时,很容易看出为什么:他在每次约会中的第一个也是唯一的行动是立即离开。他已经得出结论,惩罚比奖励要多得多,整个“约会”的情况是一个净损失。他最好的选择是在他有机会累积任何惩罚之前,尽早退出。我的约会专家小组将这种行为描述为“可能是聪明的”,以及“专家级的约会”。

这是强化学习困难的核心,事实上也是所有人工智能的核心。它不折不扣地遵循它的指示。代理对“正确”的结果没有概念。它只是将奖励最大化,将惩罚最小化。追求最优政策是无情的。代理人不知道“应该”如何处理问题,只知道实际的结果。在最好的情况下,这是人工智能的一大优势——没有先入之见,它可以发现解决问题的新方法,并丢弃任何不相关的东西。但在最坏的情况下,这是一个很大的弱点。代理人抛弃的许多先入之见都是长期来之不易的经验的产物。它忽略的许多“无关紧要”的副作用是至关重要的。

但是我呢?我应该在学习如何约会!我不满意!肯定有一种方法可以教会我们的代理人成功约会,至少像人类一样。我不断调整奖励结构,增加各种大小的惩罚和奖励。每一次,代理人都会使他的报酬最大化。有时,他会在愉快的谈话中度过整个约会,但从不冒险调情来进一步约会。有时他会借酒消愁,闷闷不乐地坐着,直到时钟显示日期。但最终,我得到了正确的公式。

奖励和惩罚的结合恰到好处,代理人实际上开始成功了。在一百次约会之后,他每十次中就有一次成功了。一千次后,他达到五分之一,到一万次约会结束时,他的学习稳定下来,三次约会中有一次成功。这比我自己能做到的要好得多。检查代理人的政策表明,他采用了一种相当传统的方法:他尝试各种主题,直到他发现一些有吸引力的东西,然后坚持下去,直到他收到足够的积极反馈。然后他转向调情,直到约会成功。如果他在任何时候被拒绝,他会喝几杯烈酒来壮壮胆,然后再试一次。

我们学到了什么?我从我的约会专家小组中了解到,将浪漫的进展描述为只有一种成功结果的对抗性遭遇是“不健康的”和“有点令人毛骨悚然的”。我还了解到,在理解现实世界时,强化学习的价值有限。没错,代理学会了成功地驾驭我构建的模拟,但是我真的能把这些经验应用到现实世界吗?这只在我的模拟准确的范围内有用。此外,在我如何构建我的模拟,以及我如何形成有助于代理学习的奖励,我都在实验中构建我自己关于约会如何工作的假设。但我认为,这个实验的关键教训是,人工智能对“成功”的定义与你我非常不同,也非常狭隘。智能体不关心它如何实现其目标,也不考虑超出其被赋予的参数的严格限制的任何问题。它不在乎从给定的数据中“应该”得出什么结论,也不在乎这些结论会导致什么意想不到的后果。当人工智能应用于现实世界的问题时,如果我们希望它的结果符合人类的安全感和公平感,我们就必须依靠人类的判断和人类的同情心。

感谢阅读!这篇短文的所有代码都可以在我的 github 中找到, 这里 。别忘了试试 完全精确的日期模拟器 。你可能会喜欢我以前的一篇文章,《游戏中的大脑》,这里是*。下个月再查一篇新论文。***

使用 Selenium 收集网球奖金数据

原文:https://towardsdatascience.com/tennis-prize-money-data-harvesting-using-selenium-c38b79323d47?source=collection_archive---------26-----------------------

利用模式的进行多页面网页抓取,并在硒中等待

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

Lucas Davies via Unsplash

介绍

这篇教程将详细介绍如何利用模式来迭代目前参加 ATP 巡回赛的前 200 名男子网球选手。

具体来说,对于每个球员,我想提取他们各自的姓名、年龄和截至 2019 年 7 月 29 日的奖金。web 抓取将使用 Selenium 模块执行,并将利用该模块中的一些有用的类,这将确保代码更有效地运行。

在这个例子中,玩家姓名和年龄在同一网页上,但是他们各自的奖金收入在单独的页面上,对于每个玩家是唯一的。

通过使用 Selenium 模块,可以获得这些信息。

入门和模式搜索

首先,我从 Selenium 模块导入 webdriver。然后,我创建一个 web 驱动对象,并将其分配给变量 browser。接下来,我只需导航到 ATP 巡回赛网页,如下所示。

现在已经加载了适当的网页,我可以清楚地看到前 100 名男单选手的列表(下图中的*,只显示了前 11 名,但向下滚动到底部会显示前 100 名选手*)。

为了遍历前 100 个玩家,我需要在数据组织中找到一些一致性。具体来说,当我右键单击、选择 inspect 并将鼠标悬停在玩家名称上时,我可以复制 Xpath。

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

然后,我将这个 Xpath 粘贴到 Chrome 开发者工具的控制台标签中。当我第一次复制并粘贴诺瓦克·德约科维奇的 Xpath 时,我可以看到球员对应于表行 1,tr[1]和表数据 4,td[4]。通过检查其他玩家,例如下面突出显示的 Fabio Fogini,我可以看到 Xpath 中唯一改变的部分是表的行号 tr[9]。

这是有意义的,因为数据被组织成表格格式,因此具有我可以利用的一致性。为了利用这个特性,我可以简单地替换 Xpath 的 tr 部分中的数字,并使用从 1(含)到 101(不含)的范围遍历所有玩家的名字!

我利用相同的关系提取玩家的年龄,但是在这种情况下,表中的数据 td 在第 5 列。

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

代码工作流

我希望我的代码如下工作:

  1. 转到主排名页面,从排名最高的玩家开始查找个人玩家姓名和年龄,并提取此信息。
  2. 点击每位玩家的链接,从排名最高的玩家开始,提取他们今年到目前为止的奖金(截至 2019 年 7 月 29 日)。
  3. 导航回主排名页面,对前 100 名玩家重复步骤 1 和 2。
  4. 获得前 100 名玩家的数据后,点击进入下一页,玩家排名在 100-200 之间,重复步骤 1 和 2。
  5. 一旦获得了这些信息,就停止迭代并将输出写入 Excel,以便进行下游数据操作和验证。

Webdriver 等待和预期条件一起工作

当浏览器加载页面时,该页面中的元素可能会在不同的时间间隔加载。这使得定位元素变得困难:如果元素还没有出现在 DOM 中,定位函数将引发 ElementNotVisibleException 异常。使用等待,我们可以解决这个问题。

显式等待使 WebDriver 在继续执行之前等待某个条件发生。

为了使代码更加健壮,我将指示代码在对 web 元素执行任何操作之前等待,直到找到或可以点击 web 元素。下面是两种重要的硒,来源于:https://seleniumhq.github.io/selenium/docs/api/py/api.html

WebDriverWait 和 expected_conditions 可以一起使用。在下面列出的预期条件示例中,我将等待定位 an 元素的可见性。

类 selenium . web driver . support . wait . web driver wait(driver,timeout,poll_frequency=0.5,ignored _ exceptions = None)

类 selenium . web driver . support . expected _ conditions . visibility _ of _ element _ located(locator)

如何在预期条件下使用 Webdriver Wait?

WebDriverWait 有两个必需的参数,即驱动程序、浏览器和超时。超时指示如果找不到相应的 web 元素,在引发超时异常之前要等待多长时间。

让我们剖析一个例子。

我想提取下面有 Xpath 的玩家名字

//*[@ id = " rankingDetailAjaxContainer "]/table/tbody/tr[1]/TD[4]/a ’

我写了 WebdriverWait,然后是我的驱动程序 browser,然后等待 20 秒。然后,我通过将visibility _ of _ element _ located附加到expected _ conditions,告诉 webdriver 等待元素可见。 我接着指定一个定位器使用 通过。Xpath(大写) ,后面是引用的适当 XPATH。

添加等待会在脚本中添加额外的检查步骤。这在 for 循环中在网页之间切换时特别有用,因为 web 元素可能需要一点时间来加载。

结合这些核心思想,现在可以创建一个范围为 1 到 101 的 for 循环,以收集每页上前 100 名玩家的数据。

当使用。文本功能,然后代码指示浏览器点击每个玩家的链接并提取他们的奖金。这里,不是通过提取玩家名字。短信功能,我用点击他们的名字。单击()方法,如下面的代码所示。由于每个玩家都在同一行,我可以使用我之前发现的模式来显示玩家统计页面的所有唯一链接。

每个玩家的奖金可以简单地通过复制 Xpath 找到。对于每个玩家,数据是统一组织的,因此这个 Xpath 将在 for 循环的每次迭代中为每个玩家工作。

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

一旦实现了这一点,我导航回到单打排名页面,提取排名第二的球员的姓名、年龄和收入。在 for 循环的每次迭代中,我都会将数据追加到 Tennis_player、Age 和 Prize_money_2019 的列表中。

当第一批 100 名玩家的数据收集完毕后,我导航到下一个页面,再次检查网页上是否有这样的按钮,并且可以点击。while 循环中的条件告诉代码返回到哪个页面。

当 while 循环的两次迭代完成后,我使用 pandas 将数据写入 Excel 文件,方法是创建一个 DataFrame 并将我的列表压缩在一起,并给它们指定合理的列名。

为了澄清脚本运行顺利,在每一次迭代中,我打印了玩家,以及他们的年龄和奖金。这是不必要的,但是给了我一个迭代进度的视觉检查。下面显示了该输出在控制台中的外观示例。

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

确认

最后,验证代码是否按预期工作是很重要的。例如,我将检查 3 个玩家,以显示已经获得了正确的数据。首先,让我们通过查看我的 Excel 文件“Tennis_Player_Earnings”来确认诺瓦克·德约科维奇的奖金是 8,839,549 美元。

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

成功!现在让我们再次检查与另一名球员,即劳埃德哈里斯。他的奖金应该是 275531 美元。

在与诺瓦克争夺奖金之前,劳埃德似乎还有一段路要走!

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

为了再次确认,我应该检查第二页的玩家,即排名在 100-200 之间的玩家是否有正确的奖金。排名第 188 位的鲁本·贝蒙尔曼斯本应获得 103,754 美元的奖金。这将确认点击到下一页的工作符合预期!同样,信息是正确的。

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

该代码在一个单独的页面上自动遍历网球运动员和他们的奖金,通过他们名字上的链接可以访问。实时观察自动 web 迭代显示了这个过程是如何工作的。为了演示,描述了显示前 3 个玩家的迭代的视频。

摘要

这个例子说明了,通过寻找模式并利用它们,以及等待 web 元素加载并填充网页,我们可以提取信息,而不会出现常见的元素位置错误。但是,需要注意的是,这些模式是使用 Xpaths 找到的。

如果该页面的组织者决定添加一列或将玩家姓名移动到另一列,脚本将会中断,因此在使用 Xpaths 时要小心,并尽可能使用 CSS 选择器。然而,如果您正在编写一个像这样的快速脚本,并将数据输出到 Excel,所示的方法应该足够了,但是不要期望它能工作 X 个月。

tensor flow 2.0——在 Google Colab 上创建和训练一个普通的 CNN

原文:https://towardsdatascience.com/tensorflow-2-0-create-and-train-a-vanilla-cnn-on-google-colab-c7a0ac86d61b?source=collection_archive---------5-----------------------

Colab 和 Tensorflow 2.0 简介

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

Tensorflow 2.0 在不到一周前发布,它一直是我的 twitter TL 上讨论最多的话题,所以我决定加入讨论并写这篇文章。Tensorflow 有一些重大改进,同时使任何人都可以轻松开始使用它。Tensorflow 2.0 现在与 Keras 高度集成,这使得用最少的专业知识构建和测试简单模型更加容易。谷歌还决定强调“热切执行”,而不是建立基于会话的模型。急切执行允许立即计算 python 操作,而不是构建计算图。这篇文章将一步一步地介绍如何使用 Google Colab 并在 Tensorflow 2.0 中构建 CNN 模型

对于那些不知道 Google Colab 是什么的人(如果你知道,你可以跳过下面几行),它是一个在线 Jupyter 笔记本,让你编写和共享代码。最好的部分是代码在谷歌的服务器上执行。你甚至可以选择在谷歌的云 GPU 或 TPU 上训练你的模型。

要在 GPU 或 TPU 上训练您的模型,请转到运行时→更改运行时类型→硬件加速器

资料组

我们将使用的数据集是德国交通标志识别基准。该数据集包含 50K 多幅图像和 40 多种交通标志。

让我们从代码开始

玩弄我们的数据

第一部分是将数据集导入 Google Colab。你可以把你的数据上传到你的 google drive,然后把它安装到你的 Colab 笔记本上。将数据集作为. zip 文件上传到驱动器后,在您的 Colab 笔记本中键入以下代码以挂载驱动器。

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

Mount your drive

您可以使用 shell 命令 unzip 解压缩该文件。通过在命令前面加上“!”,可以在笔记本单元中调用 Shell 命令。看看下面的例子。

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

note: If you have spaces in your directory names, use escape sequence ‘\’

数据集已经分为训练和测试图像,其中 75%的图像用于训练,其余用于测试我们的模型。由于我们已经装载了驱动器,现在我们可以通过引用驱动器中的路径来访问数据集。看看下面的代码来加载训练和测试数据。

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

Loading Training data

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

Loading Testing data

我们使用 PIL 从目录中加载图像,由于图像的尺寸不同,我们使用 im.resize()将每个图像的尺寸调整为 100x100 的标准尺寸。我们现在将 train_images、train_labels 和 test_images 从列表转换为 numpy 数组。numpy 数组“train_labels”在每一行中只有一个条目,因此我们使用下面的代码对它进行了整形。

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

reshape labels of training data

注意:“-1”表示未知维度

既然我们已经重塑了我们的培训标签,我们可以将它们转换成一次性编码。要了解什么是一次性编码以及我们为什么要这样做,请点击这里

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

One-hot encoding our training labels

Scikit-learn 有一个预定义的函数,我们可以直接导入它来创建我们的一次性编码标签。我们现在通过将图像除以 255 来标准化它们。

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

Image Normalization

将图像除以 255.0 将每个图像中的像素值范围减少到 0.0–1.0,这从我们的模型中提供了更好的结果。

构建我们的模型

在我们开始编写模型之前,检查我们的 Colab 是否使用 Tensorflow 2.0 作为后端,我们可以通过输入以下命令来完成。

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

check TensorFlow version

如果 Tensorflow 的早期版本被用作后端,我们可以通过在笔记本中键入以下命令来升级它

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

Upgrade Tensorflow

现在,我们可以开始进行必要的导入,并根据我们的训练数据创建批量张量。

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

Create tensor slices from training data

Tensorflow 的数据集库(tf.data)在 2.0 版本中进行了扩展,并随着新的添加而变得更加复杂。

  1. from_tensor_slices()函数接受 numpy 数组作为参数,并生成张量对象。
  2. shuffle()以 buffer_size 作为参数,从缓冲区中随机抽取元素。
  3. batch()函数将 batch_size 作为参数,并将数据中的连续元素合并成与 batch_size 相等的批

记住 Tensorflow 2.0 更强调“急切执行”,避免计算图。因此,一旦单元被执行,操作就被评估。因此,train_ds 有两个随机采样和批处理的张量。这些张量代表训练图像和标签。

让我们开始对模型的架构进行编码。

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

Model Architecture

我们创建我们的模型类(MyModel)作为模型的派生类。这为我们节省了大量编写自己的模型类的时间。我们将使用的架构是一个简单的 CNN,具有用于类别预测的密集层。想了解更多关于 CNN 的信息,请点击这里。在定义了我们的模型架构之后,我们为我们的模型创建一个对象,然后继续定义我们的损失函数、优化器和度量标准。

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

我们使用分类交叉熵作为我们的损失函数,使用亚当作为我们的优化器。

  1. train_loss 将是每个时期所有损失的平均值
  2. train_accuracy 将是我们的模型在每个时期的精度度量

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

上述函数用于训练我们的模型。它接收图像和相应的标签,计算损失和梯度。

  1. 由于 Tensorflow 2.0 使用“热切执行”,性能和可部署性可能会受到挫折。为了确保出色的性能和普遍的可部署性,我们可以添加一个 decorator @tf.function,这个 decorator 将函数转换成一个图形。
  2. tf。GradientTape()是用于计算差异的高级 API。在上面的代码行中,我们根据真实标签和预测标签计算损失,并使用梯度磁带来计算损失相对于模型变量的梯度(微分),并将它们应用于优化器
  3. 我们还会计算每一步的训练损失和准确度

既然我们已经完成了构建模型的所有必要步骤,我们就开始训练它,但是要执行下面的代码。

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

model training

我们为 5 个时期训练模型,并在每个时期后保存模型的权重。请注意,模型权重将保存在谷歌驱动器中。我们还重置了每个时期的训练损失和准确度值。

若要加载模型的权重,请创建 MyModel 类的实例,并使用 load_weights(path)函数。

基于测试集的预测

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

Model predictions

我们可以通过提供 test_images 作为参数来获得模型预测,由于模型返回概率分布,我们使用 np.argmax()来获得最高值。

结论

通过遵循以上步骤,您已经使用 Tensorflow 2.0 成功地对 CNN 进行了关于 Colab 的培训。如果您有任何疑问,请与我联系:)

链接至完整代码:https://github.com/grohith327/traffic_sign_detection

参考

[## 有效张量流 2 |张量流核心

TensorFlow 2.0 有多种变化,以提高 TensorFlow 用户的工作效率。TensorFlow 2.0 消除了冗余…

www.tensorflow.org](https://www.tensorflow.org/guide/effective_tf2) [## TensorFlow 2 专家快速入门| TensorFlow Core

这是一个谷歌协作笔记本文件。Python 程序直接在浏览器中运行——这是一种很好的学习和…

www.tensorflow.org](https://www.tensorflow.org/tutorials/quickstart/advanced)

面向文本分类的 Tensorflow 2.0 数据转换

原文:https://towardsdatascience.com/tensorflow-2-0-data-transformation-for-text-classification-b86ee2ad8877?source=collection_archive---------13-----------------------

一个完整的端到端文本分类过程

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

在本文中,我们将利用 Tensorflow 2.0 和 Python 来创建一个用于对电影评论进行分类的端到端流程。大多数 Tensorflow 教程侧重于如何使用预处理数据集设计和训练模型。通常,预处理数据是人工智能项目中最耗时的部分。本文将带您完成这一过程。注意:我们并不试图在这里生成一个最先进的分类模型。目标是解释如何在张量流模型中准备用于训练和评估的数据。我们将使用本页的中定义的模型,并通过解决本教程中未涉及的两个挑战来改进流程:

  1. 我们如何将原始文本加载到模型中并对其进行训练?
  2. 一旦创建并训练了模型,我们如何使用它根据新的输入数据生成预测?

挑战 1

我们如何将原始文本加载到模型中并对其进行训练?

关于神经网络,你能知道的最重要的事情是,它们只对数字数据起作用。因此,为了进行文本分类,必须将原始文本数据转换为数字。Tensorflow 教程使用预处理数据集,其中所有文本都已转换为数值。这对于构建原型和评估不同的模型是很好的,但是它跳过了将文本数据转换成数字数据的过程。为了解决这个问题,我们将不使用预处理数据。相反,我们将下载并使用斯坦福大学提供的带标签的 IMDB 评论中的原始文本数据。

!wget -q [http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz](http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz)
!tar zxf aclImdb_v1.tar.gz
!tree -d aclImdb

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

根目录包含我们的测试训练数据集的子目录。在每个目录下,都有包含 posneg 评论的目录。每个目录包含 12500 条评论。注意,对于本教程,我们不使用unsupp目录。

现在我们需要创建一个 train 和 test dataframes,每个 dataframes 有两列: text (评论文本)和 sent (评论的情绪)。我们通过遍历该函数中的目录来实现这一点:

现在我们已经加载了数据,是时候将文本数据转换成数值了:

NUM_WORDS 是一个变量,包含我们希望保留在词汇表中的单词数。对于本例,我们将其设置为 8000。第 2 行和第 3 行创建了一个标记器,用于索引我们的训练数据中最常用的 8000 个标记。第 6&7 行使用索引为评论中的每个单词生成数值。SEQ _ 伦是我们定义的另一个变量,用于确定每次评论使用多少单词。在本例中,我们将其设置为 256。因为我们模型的每个输入必须包含相同数量的标记,所以第 11 & 12 行将每个评论截断为 256 个字符,如果评论少于 256 个字符,则填充它。

现在是时候构建和训练我们的模型了。大部分代码直接取自 Tensorflow 2.0 教程,尽管我对培训部分做了一些改进,我将在下面描述:

第 1 行到第 10 行直接来自教程,没有任何修改。在第 13 行到第 15 行,我添加了一个 EarlyStopping 回调,如果验证精度开始下降,它会导致模型停止训练,这有助于减少过度拟合。第 16–20 行是我们实际训练模型的地方。我使用的参数与本教程略有不同,所以下面是对每个参数的描述:

  • batch_size —传递给训练周期每批的示例数量。最初的教程将此设置为 512。这是一个可调超参数的例子。在尝试了不同的值之后,16 给了我最好的结果,但是通过更新 BATCH_SIZE 常量可以很容易地改变它。
  • epochs —我们通过模型运行完整训练集进行训练的次数。它被设置为 20,但是由于 EarlyStopping 被启用,它很可能永远不会达到这个值。如果达到了 20,你可以增加它来看看你是否能得到更好的结果。
  • validation_split —这里我们说 20%的输入数据将用于验证我们的模型学习得有多好。如果我们开始看到我们的准确性增加,同时看到我们的验证准确性下降,那么我们是过度拟合。在这种情况下,我们应该停止训练,因为这已经是最好的了。
  • 回调——这是我们传递早期停止回调的地方。

在第 22 行,我们通过传入模型从未见过的新输入数据来评估模型。您应该会看到大约 87%的准确性,考虑到我们的神经网络仅用了大约四行代码来构建,这是相当不错的。在文章的最后,我将讨论一些事情,试图使模型更加准确。

挑战#2

一旦创建并训练了模型,我们如何使用它根据新的输入数据生成预测?

原 Tensorflow 教程到此结束。在这一点上,我们有一个经过训练的模型,但还不清楚我们将来如何使用它来根据新数据进行预测。

首先,我们需要保存模型和我们的标记器。我们是这样做的:

在第 2 行中,我们将模型及其所有权重保存到一个名为 model.h5 的文件中。然后我们可以删除我们的模型和记号化器,因为我们已经完成了训练。

现在,我们准备使用我们的训练模型对一些新数据进行一些推断:

  • 第 1–4 行从磁盘加载我们的模型和标记器。
  • 第 6–9 行将我们的文本输入转换为我们的模型需要的数字输入,其方式类似于我们为训练所做的。
  • 第 11-14 行包含了我写的一些评论。请随意在这里添加一些您自己的评论。
  • 第 15 行调用我们的数据准备函数来为我们的输入数据生成数字序列。
  • 第 17 行根据我们的输入数据做出预测。

需要注意的是,loaded_model.predict 的返回值是一组评论为正面的概率。为了解决这个问题,我使用一个阈值来确定一个评论是否是正面的。在这种情况下,如果它在 60%以上,那么它是一个积极的评论。否则就是否定的。这是一个您可以试验和修改的任意阈值。下面是一些查看和解释推理结果的帮助器代码:

  • 第 1-3 行创建了一个包含原始文本和预测情感的数据框架。
  • 第 5 行根据阈值将数字情感值转换为“正”或“负”
  • 第 7 行打印出我们的结果:

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

在本文中,我们采用电影评论的原始文本,并对其进行预处理,以输入到 Tensorflow 2.0 神经网络模型中。然后,我们将数据输入到一个模型中,并取得了一些不错的结果(大约 87%的准确率)。一些增强功能可能会改善这种情况:

  1. 在构建我们的模型之前过滤掉停用词。停用词是正常英语所必需的词,但对确定文章的意思没有任何价值。一些例子包括:" the “,” of “,” a ",…这将有助于我们的模型只关注有意义的单词。
  2. 对模型的细微调整。Tensorflow 2.0 使向我们的神经网络添加新层变得极其简单。我们可能希望在我们的 GlobalAveragePooling1D 层和最终的密集层之间添加一些密集层和/或下降层。
  3. 对模型的重大调整。这是一个非常简单的模型,还有更复杂的模型,比如 RNN 的、LSTM 的和 CNN 的。也有全新的方法,如 BERT。

需要注意的最重要的一点是,无论您选择什么方法,您仍然必须遵循这里介绍的步骤来为神经网络处理您的数据。

我已经在 Google Colab 上分享了这个模型。我期待在下面的评论区听到你的反馈。

TensorFlow 2.0:动态、可读、高度扩展——Exxact 博客

原文:https://towardsdatascience.com/tensorflow-2-0-dynamic-readable-and-highly-extended-exxact-blog-4755ad9d2f27?source=collection_archive---------21-----------------------

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

考虑学习深度学习的新 Python 框架?如果你已经知道一些 TensorFlow,并且正在寻找一些更有活力的东西,你不必再完全切换到 PyTorch,这要感谢 TensorFlow 2.0 中的一些实质性变化。事实上,2.0 中的许多变化专门针对 TensorFlow 的所谓缺点。默认情况下,有了急切执行,当你过分热衷于你的面向对象原则时,你不再需要预先定义一个静态图,初始化会话,或者担心张量超出适当的范围。TensorFlow 仍然拥有大约 3 倍于 PyTorch 的用户基础(从 GitHub 上引用每个框架的存储库来判断),这意味着更多的扩展、更多的教程和更多的开发人员合作探索堆栈溢出上所有可能的代码错误的空间。您还会发现,尽管从 TensorFlow 2.0 开始发生了重大变化,但项目开发人员已经采取了许多措施来确保可以保持向后兼容性。

什么是张量流?

TensorFlow 的核心是一个用于张量的数学操作、存储和转换的软件包,是矩阵概念的推广。TensorFlow 的主要效用和开发驱动力是机器学习,尤其是具有数百万参数的深度神经网络。TensorFlow 通常被用作 Python 的扩展,但所有那些允许 TF 在 GPU 和谷歌张量处理单元等硬件加速器上运行的底层组件都是用 C++和 CUDA 等编译语言编写的。TensorFlow 于 2015 年在 Apache 2.0 许可下发布,此后在研究、工业和教育社区中得到了广泛使用。它被大约 3 倍于下一个最受欢迎的框架的深度学习实践者使用,并被一些项目高度扩展,如用于以隐私为中心的联合学习的 TF-encrypted 或用于图像和音乐的深度学习增强艺术的 Magenta 。许多 AI 和 ML 从业者的大型用户社区和开源精神意味着有大量的材料可以学习和项目可以贡献。张量流计算是基于图形的,张量形式的数据以定向方式沿着连接边在计算节点之间流动。对于建立并行计算,图是一个合适的认知框架。它也非常适合分布式计算、编译器级别的优化,并提供了一个存在于编写它的编程语言之外的模型结构(因此是可移植的)。但是 TensorFlow pre-2.0 中采用的基于图和会话的方法要求开发人员首先定义一个静态图,然后建立一个会话来运行该图。这种方法导致更多重用的样板代码,避免使用普通的 Python 流控制,并且因为在 TensorFlow 会话中调用它们之前必须定义图形,所以它们在训练期间不太灵活。

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

张量流图 CC 由Tensorflow.org

TensorFlow 2.0 的主要变化

简化 TensorFlow 体验是 TensorFlow 2.0 的主要开发目标。他们通过减少冗余、完全的 keras 集成以及从静态图形到快速执行的重大转变实现了这一点。后一种变化使框架更加动态,并且可以说提高了代码的直观性和可读性。TF 2.0 已经完全接受 keras 作为高级应用程序编程接口(API)。这意味着不再直接使用 keras,而是由 TensorFlow 后端在后台完成所有繁重的工作,keras 的所有功能都可以从 tf.keras 下的 TensorFlow 中获得。尽管 keras 与 TensorFlow 的集成早在 2.0 之前就已经开始,但该团队已经投入了大量精力来整合冗余,并将所有内容归入 keras 旗下。特别是,您可能会发现自己正在使用 keras layers API。keras 的发明者 Francois Chollet 发布了一个 18 条 tweet 速成课程,并提供了代码支持,突出了 TF 2.0 中 layers API 所扮演的核心角色。以前,你可以在 TensorFlow 的几个不同角落找到略有不同的相同功能。

2.0 中的一个主要更新是合并了许多令人困惑的冗余,现在 keras API 中内置了许多功能。现在使用面向对象编程和优雅的 Python 流控制的概念要容易得多。总的来说,TF 2.0 承诺为研究级实验提供更高的灵活性,同时保留推动 TensorFlow 成为最广泛的深度学习框架的现实世界实用性和可部署性。虽然 TF 2.0 采用急切执行使实验和原型制作变得轻而易举,但开发人员可以通过用 tf.function 注释包装他们的代码来获得图形的所有好处。更重要的是,对于大多数用户来说,2.0 中的变化可能会导致更平滑的学习曲线和更可读的代码。

值得注意的项目

作为 TF 2.0 的一部分和深度学习的一个主要趋势,一个令人兴奋的发展是边缘计算:轻量级深度学习模型,旨在部署在低功耗分布式设备上,如手机、嵌入式微控制器和物联网(IoT)设备。TensorFlow Lite 是为边缘计算量身定制的,TF 开发者峰会在一款新的轻量级 TPU 支持的 Coral 开发板上演示了 edge ML。这是对像树莓派这样的设备的现有支持的补充。其他利用 TF 2.0 改进功能的有趣项目包括一个名为 DeepPavlov 的开源聊天机器人库,一个虫咬图像分类器,以及一个基于手机图像估计污染水平的空气质量预测应用

警告

在撰写本文时,TensorFlow 2.0 仍然是预发布版本,因此伴随着一系列的错误和不断变化的功能,这些错误和功能会伴随任何处于早期开发阶段的项目。例如,在 TF 2.0 alpha 发布后不久,我开始了一个涉及灵活 cGAN 模型的新项目,升级到当前的 TF 2.0 beta 意味着由于 keras layers API 处理张量拼接的方式中的错误而导致的主要代码更改。任何基于 TF 2.0 的大型项目都有可能经历类似的修订,至少需要几周到几个月的时间,因为 2.0 已经准备好全面发布了。

如何开始使用 TensorFlow 2.0

TensorFlow 价值主张的一个重要组成部分是围绕开源项目构建的大型社区。这意味着有大量的教程、博客文章和成熟的项目可供选择。我建议你采用一个分三部分的方法来快速掌握 2.0。

  1. 通过阅读博客帖子(如这篇)和观看来自 TF Dev Summit 2019 的 TensorFlow 团队的一些演示,从高层次了解 TensorFlow 2.0 的主要变化以及这些变化如何影响您的项目。这是为了激发你的想象力,并有助于专注于特定的概念,这些概念将对你能构建的东西产生巨大的影响。
  2. 从像谷歌种子库这样的资源中研究大量的教程和代码示例,它们都附有代码,你可以在谷歌协作笔记本中修改和运行。这是习惯 TF 2.0 中更加动态和灵活的急切执行原则的好方法,我想你会同意结果比旧的基于图形和会话的开发流程更加 Pythonic 化。
  3. 你从 1 和 2 得到的印象应该给你足够的 2.0 的认知大纲,开始解决真正的问题。如果你对强化学习感兴趣,你可能会发现 TF-Agents 成为你下一个项目的有用权宜之计,而自然语言处理从业者可能会发现递归神经网络的改进后的新易用性很快变得不可或缺。

最后,如果您一直对构建 TensorFlow 专业知识并在项目中使用它持观望态度,2.0 标志着一个方便的边界,它对可用性和实用性进行了许多改进。另一方面,如果你是一个 TensorFlow 老手,你应该会发现你所知道和喜欢的所有功能仍然可以在其他领域进行无数的改进。许多新特性将在项目早期的快速迭代中提高您的效率,而不会牺牲后期的便利部署。

TensorFlow GPU 基准测试

原载于 2019 年 8 月 13 日【https://blog.exxactcorp.com

tensor flow 2.0——这是我在谷歌的人工智能日学到的东西

原文:https://towardsdatascience.com/tensorflow-2-0-here-is-what-ive-learned-from-a-i-day-at-google-64a31914610f?source=collection_archive---------15-----------------------

从研究、原型到生产

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

信不信由你,在新加坡有很多不同的聚会讨论数据科学和人工智能。

但我最喜欢的同学会依然是 TensorFlow 和深度学习新加坡DataScience SG

当我意识到 TensorFlow 和深度学习新加坡将组织这个一天的会议—a . I . Day谈论和展示正在用于开发和创建真实世界人工智能产品的最新和最伟大的技术时…言语简直无法形容我有多激动!

看到人们谈论这些技术的出现是一回事,看到行业专家用行业的技巧和诀窍来分析这些产品是如何制造的是另一回事。

所有演讲者都是在该领域工作的第一手从业者,而不是营销和销售人员。

更令人兴奋的是,在新加坡,本次大会首次邀请了 4 位机器学习领域的谷歌开发者专家和 3 位来自谷歌大脑的演讲人——他们都在同一个平台上。

如果你是刚刚开始使用 TensorFlow 2.0 或一直在使用 tensor flow 2.0 的人,我相信你已经看过了 Paige Bailey 的一些视频,他目前是 TensorFlow core 和 Swift 的产品经理(他也是 TensorFlow core 的开发者倡导者)。

因此,能够在会议期间见到她本人,我激动不已!

这正是我喜欢成为数据科学和开源社区的一部分的原因——彼此分享,同时学习。

Upgrade your existing code for TensorFlow 2.0 by Paige Bailey

虽然我无法记下整个会议中每个主题的所有细节,但我设法记下了一些重要的知识和教训,我相信这些知识和教训会对你有所帮助。

在这篇文章结束时,我希望你能更多地了解 TensorFlow 2.0 提供的最新功能和其他最先进的模型在你的项目中的应用。

我们开始吧!

演讲者的主题从研究、原型到生产

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

A.I. Day 2019

在我开始之前,如果您想了解更多关于 TensorFlow 2.0 的信息,请随意查看这里的官方网站我不久前写的文章,其中讨论了实现的新功能。

在接下来的章节中, 我将依次讲述每个主题以及我学到的简短经验/知识 :

  1. TF . keras 和 TensorFlow 2.0 介绍—Google Brain 的 Paige Bailey
  2. 对话式人工智能的图形深度学习 —红龙人工智能的山姆·维特芬
  3. TensorFlow Extended (TFX):生产中的真实世界机器学习——来自谷歌大脑的 Robert Crowe
  4. 我们应该展示哪张酒店照片?用于图像选择的神经线性强盗 —来自 Agoda 的 Sirinart Tangruamsub
  5. XLNet——最新的语言模型——红龙 AI 的马丁·安德鲁斯
  6. 用于 TensorFlow 的 Swift——谷歌大脑的 Paige Bailey
  7. TensorFlow Lite: On-Device ML 和模型优化工具包——来自 Light 的 Jason Zaman

每个主题都是相互独立的。所以请随意跳到你感兴趣的话题。

1。TF . kerastensor flow 2.0简介

  • Keras—tensor flow 2.0 最值得推荐的高级 API
  • 如果在model.compile()方法中使用run_eagerly = True,模型性能将会非常慢,因为该方法是静态运行的。model.compile()默认是非急切情况下进行训练和推理
  • 使用功能方法构建模型(使用高级 API 构建 DAG)

2。 对图形进行深度学习 用于对话式 AI

  • 现在使用的图的例子包括社交图、推荐图等。
  • 知识图表——Freebase、Wikidata、Cyc 和 DBpedia
  • 构建图表的挑战—数据在欧几里得空间中没有很好地按顺序映射。很难捕捉图表中的所有相关节点来进行准确预测
  • 如何解决这些挑战— 图卷积 。这种方法在图中移动,一次一个节点,以捕捉所有相关节点,并给出更准确的预测,特别是在对话式人工智能中
  • 对图形的深度学习可能具有挑战性,目前仍在积极研究中

3。 TensorFlow 扩展 (TFX):生产中的真实世界机器学习

  • TFX 是一个用于部署生产 ML 管道的端到端平台
  • TFX 流水线是实现 ML 流水线的一系列组件,ML 流水线是专门为可扩展的高性能机器学习任务设计的
  • TFX 的主要库包括张量流数据验证、张量流变换、张量流模型分析和张量流服务
  • ML 开发部署面临的挑战 —数据生命周期管理、标记数据、特征空间覆盖、最小维度、最大预测数据、公平性、稀有条件。TFX 旨在应对这些挑战,尤其是在数据生命周期管理方面
  • 位于 TFX 的元数据存储库 包含工件及其属性、组件的执行记录(运行)和数据来源(接受过哪些数据训练?)在所有执行中。
  • 位于 TFX 的元数据存储在检查你的模型性能中扮演着重要的角色。例如,一年前您训练了一个模型,现在您有了一个新模型,并希望将其性能与以前的模型进行比较。您可以使用已经为之前的模型存储了元数据的 TFX,并使用 TensorBoard 可视化两个模型的性能
  • Apache Beam 为运行批处理和流数据处理作业提供了一个框架,这些作业以分布式方式在各种执行引擎上运行

4。我们应该展示哪张酒店照片?用于图像选择的神经线性 Bandit

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

Hotel pictures shown on Agoda website

  • 向用户推荐照片是基于特定的上下文和酒店图片
  • 之后,训练神经网络模型,然后使用贝叶斯线性回归计算用户点击酒店图片的概率
  • 这个概念很大程度上是基于这篇的研究论文

5。XLNet —最新的语言模型

  • XLNet 是一种用于语言理解的广义自回归预训练方法
  • XLNet 表明置换法作为语言模型目标是一个很好的选择
  • BERT 相比,XLNet 的关键增强包括最大限度地利用上下文进行预测、双流注意力和长记忆(如 TransformerXL )

6。用于 TensorFlow 的 swift

Swift for TensorFlow: The Next-Generation Machine Learning Framework (TF Dev Summit ‘19)

  • Swift for TensorFlow 是用于深度学习和差异化编程的下一代平台
  • 用于 TensorFlow 的 Swift 并没有牺牲作为强语言的性能(类似于 C++)。它是一种跨平台的语言——可以去 C++能去的任何地方
  • 能够用于构建和训练新的模型,例如 AlphaGo英雄联盟

7。tensor flow Lite:On-Device ML 和模型优化工具包

  • TensorFlow Lite 用于在移动和物联网设备上部署机器学习模型,用于设备上的推理
  • 为什么要在设备上使用 ML?因为我们可以通过快速紧密的交互访问更多数据,同时还能保护隐私
  • 在对精确度影响最小的情况下,优化片上 ML 模型的方法之一是通过量化
  • 量化通过降低模型本身的值和运算的精度,能够减少模型的大小和推理所需的时间。这可能意味着模型尺寸缩小 4 倍,执行速度(CPU)提高 10–50%。

最后的想法

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

Wonderful Google office tour in Singapore

感谢您的阅读。

尽管 TensorFlow 2.0 仍在积极开发中,但您肯定可以开始使用它的功能来构建具有热切执行能力的模型。

我希望您了解了更多关于 TensorFlow 2.0 和其他最先进模型提供的最新特性,以便在您的项目中应用。

同时,如果您有兴趣了解 TensorFlow 2.0 的最新发展,您可以随时订阅邮件列表在此加入社区

一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄

关于作者

Admond Lee 现在的使命是让每个人都能接触到数据科学。他正在帮助公司和数字营销机构通过创新的数据驱动方法,利用可操作的见解实现营销投资回报。

凭借其在高级社会分析和机器学习方面的专业知识,Admond 旨在弥合数字营销和数据科学之间的差距。

如果你想了解更多关于 Admond 的故事、数据科学服务以及他如何在营销领域帮助你,请查看他的 网站

你可以在 LinkedInMediumTwitter脸书上和他联系。

[## 阿德蒙德·李

让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。

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

TensorFlow 控制流:tf.cond()

原文:https://towardsdatascience.com/tensorflow-control-flow-tf-cond-903e020e722a?source=collection_archive---------4-----------------------

更深入地了解控制流操作在张量流中的工作方式

介绍

Tensorflow 是最受欢迎的深度学习框架之一,在推进深度学习方面发挥了关键作用。我使用 Tensorflow 已经两年多了,但是在使用控制流的过程中,我看到了许多奇怪和不可预测的行为。

最近(2019 年 4 月 19 日)看了一段 TensorFlow 团队自己内部培训的视频,很有帮助,让大家更清楚控制流 ops 是怎么工作的。我绝对推荐看这个视频

视频详细介绍了 tf.cond()和 tf.while_loop。所以,我决定写这篇文章来详细说明 tf.cond()是如何工作的,并提供一些例子来说明。希望我会在后续的文章中介绍 tf.while_loop。

:我打算在这篇帖子里涉及底层操作。还有其他类似功能性操作的操作,这超出了本文的范围。

切换并合并

在构建图的过程中使用的两个重要操作是切换和合并。因此,在本节中,我将介绍它们是如何工作的,并提供一些例子来熟悉它们的一些怪异行为!

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

Figure 1: Schematics of what are the inputs and outputs of Switch and Merge, and how they work.

如您所见,开关接收两个输入:数据和谓词,并提供两个输出:数据和死张量!。此外,Merge 接收两个(或两个以上)输入,并提供一个输出,即数据。我将在下面谈到更多的细节。

开关

首先,让我们考虑开关。如果您访问 Tensorflow 网站,您可以找到关于开关操作的定义和总结:

*data*转发到由*pred*决定的输出端口。如果*pred*为真,则*data*输入被转发给*output_true*。否则,数据转到*output_false*

正如我之前提到的,Switch 接收两个输入。其中一个是谓词,是布尔张量(真或假),还有一个是要传递的数据。谓词决定数据应该通过 output_true 分支还是 output_false 分支传递。但是,这里有一个奇怪的东西是死张量的概念。不管谓词是真还是假;总是有两个输出:一个是数据,另一个是死张量。如果pred 为真,则死张量沿着output_false发送(反之亦然)。

没有明确的参考资料解释为什么以及如何死张量是有用的,但似乎它们对分布式处理是有用的,它们的存在是一个实现细节。例如,你可以在这里找到一个令人信服的答案:

首先,死张量是 TensorFlow 的控制流构造:[*tf.cond()*](https://www.tensorflow.org/api_docs/python/tf/cond)[*tf.while_loop()*](https://www.tensorflow.org/api_docs/python/tf/while_loop)的一个实现细节。这些构造使 TensorFlow 能够根据数据相关值确定是否执行子图。

让我们看一个例子,让事情更清楚。我从这篇帖子中获得了提供这个例子的灵感。

import tensorflow as tf
from tensorflow.python.ops import control_flow_opsx_0, x_1 = control_flow_ops.switch(tf.constant(1.0), False)
x_2, x_3 = control_flow_ops.switch(tf.constant(2.0), True)
print(x_0, x_1, x_2, x_3)
with tf.Session() as sess:
    print(sess.run(x_0))    # prints 1.0
    print(sess.run(x_3))    # prints 2.0'''
output:
Tensor("Switch:0", shape=(), dtype=float32) Tensor("Switch:1", shape=(), dtype=float32) Tensor("Switch_1:0", shape=(), dtype=float32) Tensor("Switch_1:1", shape=(), dtype=float32)
1.0
2.0
'''

因此,让我们深入了解一下这个示例中发生了什么。我创建了一个图来说明正在发生的事情。

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

Figure 2: Illustrating what is happening in the provided example.

我认为从图中可以清楚地看到发生了什么。如在x_0, x_1 = control_flow_ops.switch(tf.constant(1.0), False)中,谓语是假的;因此,tf.constant(1.0)被转发到output_false分支,而死张量被转发到output_true分支。

需要提及的一件重要事情是,我已经在 tf 内执行了x_0x_3。Session(),它包含数据(张量)。如果我试图运行和执行死张量,我将面临一个错误。每当您试图在 Session.run()中执行和检索死张量时,都会导致错误。例如,以下代码引发了一个著名且经常发生的错误:

with tf.Session() as sess:
    print(sess.run(x_1))'''
output:
**InvalidArgumentError**: Retval[0] does not have value
'''

现在,我认为这对于 Switch 来说已经足够了。让我们看看合并是如何操作的。

合并

Merge 是构造 tf.cond()图所需的另一个运算符。

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

Figure 3: Merge ops

Merge 可以接收多个输入,但其中只有一个必须包含数据,其他的应该是死张量。否则,我们将面临一些随机和不可预测的行为。让我们看看合并在最后一个例子中是如何工作的:

with tf.Session() as sess:
    print(sess.run(control_flow_ops.merge([x_0, x_1])))       
    print(sess.run(control_flow_ops.merge([x_1, x_0])))       
    print(sess.run(control_flow_ops.merge([x_2, x_3])))   
    print(sess.run(control_flow_ops.merge([x_3, x_2])))     
    print(sess.run(control_flow_ops.merge([x_0, x_1, x_2])))'''
output:
Merge(output=1.0, value_index=0)
Merge(output=1.0, value_index=1)
Merge(output=2.0, value_index=1)
Merge(output=2.0, value_index=0)
Merge(output=1.0, value_index=0)
Merge(output=2.0, value_index=2)
'''

它的表现完全符合我们的预期。但是,当你把两个有数据的张量输入合并时,事情变得有点出乎意料和奇怪。

with tf.Session() as sess:
    print(sess.run(control_flow_ops.merge([x_1, x_0, x_3]))) 
    print(sess.run(control_flow_ops.merge([x_0, x_3])))
    print(sess.run(control_flow_ops.merge([x_3, x_0])))'''
output:
Merge(output=1.0, value_index=1)
Merge(output=1.0, value_index=0)
Merge(output=2.0, value_index=0)
'''

有时,它返回x_0的值,有时返回x_3的值。所以,对这种行为要谨慎。

注意:死张量通过计算图形传播,直到它们到达合并运算。

tf.cond()

现在,我认为我们已经很好地掌握了交换和合并是如何操作的。现在正是深入 tf.cond()的好时机。我正在考虑一个简单的例子,其中输入参数是predtrue_fnfalse_fn

tf.cond(pred, true_fn, false_fn)

我将考虑一个简单的例子来介绍这个概念。考虑以下情况:

tf.cond(x < y, lambda: tf.add(x, z), lambda: tf.square(y))

我已经为这个简单的例子构建了计算图,您可以在图 4 中找到它。

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

Figure 4: computational graph to show how tf.cond() works.

首先要提的是每个输入都有一个开关。我所说的输入是指 tf.cond()中 true 和 false 函数的参数。在本例中,有三个输入(x、y 和 z ),因此,计算图中有三个开关。

对于 true_fn,开关输出从 true 分支发出。对于 false_fn,开关输出从 false 分支发出。根据条件结果(无论 x 是否小于 y),谓词可以为真或假,其中一个分支(左或右)将被执行。值得注意的是,tf.add()tf.square()操作都在开关之后。因此,在本例中,只有其中一个将被执行,另一个保持不变。

另外,我觉得这张图有点不对。我认为死张量通过加法或平方运算传播,直到它们遇到合并运算。合并运算去掉了死张量,只提供一个输出。

希望到目前为止,您已经了解了一些关于 tf.cond()的知识,并且对使用这个 API 已经变得更加得心应手。我将通过提供一个有争议的例子来结束这篇文章,并解释到目前为止我们所学到的东西是如何帮助我们理解内在工作的。在 TensorFlow 网站中,您可以找到以下声明:

警告:无论运行时选择哪个分支,在*true_fn**false_fn*之外创建的任何张量或操作都将被执行。尽管这种行为与 TensorFlow 的数据流模型是一致的,但它经常让那些期待更懒惰的语义的用户感到惊讶。

因此,我将提供一个例子来阐明这个警告的含义。我提供了两个例子:在第一个例子中,所有的操作都定义在true_fnfalse_fn中,在第二个例子中,一些操作定义在这个函数之外。我将构建并可视化计算图来解释为什么会出现这种行为。

例 1:

import tensorflow as tf
x = tf.constant(3.0)
y = tf.constant(2.0)def true_fn():
    z = tf.multiply(x, y)
    print_output = tf.Print(z, [z], "The value I want to print!!")
    return tf.add(x, print_output)def false_fn():
    return tf.square(y)result = tf.cond(x < y, true_fn, false_fn)with tf.Session() as sess:
    print(sess.run(result))## output: 4.0'''
if you keep everything the same and just changing x to x = tf.constant(1.0), the predicate becomes true and the output will be as the following:3.0
The value I want to print!![2]
'''

这里需要重点关注的是,所有的张量和运算都是在函数内部创建的。因此,有三个输入参数,因此,图中有三个开关。为这种情况构建一个计算图将会很容易。

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

Figure 5: Computational graph for Example 1.

如果谓词为真(x 将小于 y),将执行true_fn (左分支),右分支不执行,保持不变(反之亦然)。

:我用过 tf。Print()函数,以便打印计算图形中的内容,并访问图形中张量的值。使用 tf。Print()有点复杂,我不打算在这里解释它是如何工作的。这里有一篇关于这个功能的优秀博文。

:当谓词为假(x > y)时,执行false_fn (右分支),结果是 tf。Print()只接收死张量,不打印任何东西。

例 2:

示例 1 有点无聊,结果完全符合我们的预期。在这个例子中,事情变得更加有趣。

x = tf.constant(3.0)
y = tf.constant(2.0)z = tf.multiply(x, y)
print_output = tf.Print(z, [z], "The value I want to print!!")def true_fn():
    return tf.add(x, print_output)def false_fn():
    return tf.square(y)result = tf.cond(x < y, true_fn, false_fn)with tf.Session() as sess:
    print(sess.run(result))'''
output:
4.0
The value I want to print!![6]
'''

在这个例子中,谓词为假(x > y ),我们期望false_fn 执行而true_fn 保持不变。然而,我们可以看到输出包含“我想打印的值!![6]“属于哪一种true_fn。起初,也许这种行为看起来有点怪异,但这与我们目前所看到和理解的完全一致。一些张量(z 和 print_output)已在函数外定义,因此,它们将被放在计算图中的开关之前。让我们用图表来说明这一点:

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

Figure 6: Computational graph for Example 2.

您可以在图 6 中看到,乘法和打印运算在开关之外(之前)。所以,不管谓词是真还是假,这两个操作在两种情况下都会被执行。

因此,通过理解切换和合并,并意识到 tf.cond()是如何工作的,希望您可以看到这种行为与 TensorFlow 的数据流模型是一致的,并且没有任何错误。

我将在这里完成这篇文章。谢谢你把帖子看完。请让我知道我是否犯了一个错误或有什么不对的地方。希望我会在后续的文章中介绍 tf.while_loop()。

参考

2019 TensorFlow 开发峰会总结

原文:https://towardsdatascience.com/tensorflow-dev-summit-2019-wrap-up-a43ec2e5845a?source=collection_archive---------28-----------------------

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

连续第二年,我有幸参加了 3 月 6 日—7 日在美国加州桑尼维尔的谷歌活动中心举行的 TensorFlow dev 峰会。去年,我对组织、场地、日程、演讲者印象深刻,我认为今年甚至更好。因此,再次祝贺 Google 和 TensorFlow 团队组织了如此令人惊叹的活动!

TensorFlow Dev Summit 仍然汇集了来自世界各地的机器学习用户的多样化组合;现在是两天而不是一天。第一天充满了技术讲座、演示、新产品发布和对框架的其他改进,而第二天侧重于闪电讲座,即参与者可以与 TensorFlow 团队成员一起编写代码的实践会议。

关于这次活动有很多有趣的事情要说,所以在这篇文章中,我将分享我的个人笔记,并简要总结一下最引起我注意的事情。

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

第 1 天-3 月 6 日

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

张量流 2.0

在 TensorFlow 2.0 中,重点是让 API 更简单、更自然。API 组件可以更好地与 Keras 集成,默认情况下,激活了 eager 模式。在 2.0 中,您可以使用您所知道的 Keras,用顺序 API 构建您的模型,然后使用 compile 和 fit。Keras 的 fit()将适用于许多情况;但是,如果需要,还有更多的选项可用。在最近的过去,你需要熟悉 tf.where, tf.select 以便写出条件,并且很难把复杂的控制流写成一个张量流图。有了 2.0,你可以简单地用 decorator @tf.function 把一个复杂的控制流写成 TensorFlow graph。 tf.function 只是要附加到 Python 函数的 decorator。TensorFlow 编译器自动解析对张量的依赖性,并创建适当的图形。这使得开发更容易理解和使用,因为我们现在可以像编写“标准”Python 代码一样编写张量流图的控制流。

a = tf.constant([1, 2])
b = tf.constant([3, 4])
print(a + b)
# returns: tf.Tensor([4 6], shape=(2,), dtype=int32)

这种魔力是通过重载一些方法实现的,例如像 ifwhile 。所以总的来说,你不需要再写了:

tf.session.run
tf.control_dependencies
tf.global_variables_initializer
tf.cond, tf.while_loop

除了 2.0,该团队还推出了 TensorFlow Datasets ,这是一组常用的 ML 数据集,以 tf.data.Datasets 或 NumPy 数组的形式准备和公开,以便在 TensorFlow 中轻松使用。此外,他们还提供转换和迁移工具,帮助从 1.x 代码过渡到 2.0。

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

TensorFlow Datasets & TensorFlow Probability

其他附件和扩展:

  • TensorFlow 代理:强化学习库
  • TF Federated:利用分散数据(即不同位置的数据)进行联合学习的库
  • TF Privacy:一个带有工具的库,用于帮助训练具有不同隐私的模型
  • Mesh TensorFlow:使用并行技术构建和训练大规模模型的库
  • TensorFlow Probability:在我看来,TensorFlow Probability 可能是最令人兴奋的插件之一,它是一个在 ML 模型中使用概率方法进行预测的库,处理不确定性并结合领域知识。

这些以及更多关于 TensorFlow 的资源、示例、文档和案例研究可以从tensorflow.org网站获得。

[## Arnaud Zinflou 在 LinkedIn 上说:“来自#TFDevSummit 主题演讲的另一个非常有趣的小视频…

2019 年 3 月 7 日:阿诺德·津弗卢在 LinkedIn 上发帖

www.linkedin.com](https://www.linkedin.com/feed/update/urn:li:activity:6509288966850703360)

张量流扩展

我最喜欢的 TensorFlow 生态系统插件之一是 TensorFlow Extended (TFX)。TFX 为用户带来了整个机器学习生命周期的管理。它有几个组件库,包括:

  • TensorFlow 数据可视化(TFDV)用于大规模监控和验证 ML 数据。
  • 用于预处理任务(如标记化和格式转换)的张量流转换。
  • TensorFlow 模型分析(TFMA ),使开发人员能够计算和可视化模型评估指标。
  • TensorFlow Serving 用于服务 ML 模型,支持版本化和多模型支持

作为奖励,它现在集成了开源管弦乐队,如气流KubeFlow

TensorFlow Lite

去年推出的 TensorFlow Lite (TFLite)是一个用于设备上推理的轻量级解决方案。根据 Google 的说法,TFLite 现在运行在超过 20 亿台移动设备上,引领了下一代移动设备上的 ML。出于以下原因,需要在边缘设备中运行 ML:

  • 快速交互应用程序(通过在客户端运行 ML 应用程序,我们可以消除在服务器和客户端之间发送数据的开销)
  • 数据隐私(通过避免向服务器发送数据)

对 TensorFlow Lite 的一般可用性、模型转换功能和性能进行了一些改进。例如,通过将处理委托给边缘 TPU,结合量化,他们实现了 62 倍的最快推断时间。他们还推出了 Coral Dev Board,这是一款带有可移动模块上系统的单板计算机,具有 Edge TPU 和 Coral USB Accelerator,这是一款 USB 加密狗,旨在加速现有 Raspberry Pi 和 Linux 系统上的机器学习推理。此外,他们还推出了 Sparkfun。 Sparkfun 是一款由 TensorFlow 驱动的 edge 演示板。根据所提供的信息,Sparkfun 可以激活搅拌机或热水器,或者在听到某个单词时做任何你的微控制器可以做的事情,只需要一个硬币电池作为电源;有趣不是吗?更有趣的是,我们收到了 Sparkfun 板和 coral USB 加速器作为参加会议的礼物。

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

TFDevSummit goodies

这种礼物总是很有趣,因为我们可以尝试使用我们所学到的东西。所以这些我以后都要试试:)。

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

The SparkFun Edge board

TensorFlow.js 1.0

Javascript 是使用最多的编程语言之一,TensorFlow。Js 给 JavaScript 开发者带来了 ML。在会议期间,他们宣布发布 TensorFlow.Js。除了核心组件,围绕 TensorFlow.js 还有多个支持库。

实际上,TensorFlow.js 项目将支持各种平台,如 Electron 和 React Native,以便我们可以在许多平台上使用相同的应用程序代码。AirBnb 和优步等公司正在生产环境中使用 TensorFlow.js。

面向 TensorFlow 的 Swift

这可能是我去年最喜欢的发布之一,Swift for TensorFlow 随着 0.2 版本的发布而发展。这是一个渐进的改进。在 0.2 中,用户可以看到增加的可用性,并尝试这种新颖的 ML 范例。此外,他们还通过 fast.ai 推出了使用 Swift for TensorFlow 的新机器学习课程,让 Swift 更容易上手 ML。

在比率中

该项目正在开发一个基于 TensorFlow 的机器转录系统,以加快梵蒂冈历史档案中的大规模搜索和知识发现。经过众包注释训练的定制 CNN 使该系统能够处理具有挑战性的中世纪笔迹。

关于 TensorFlow 和 TensorFlow world 的新课程

分别与 UdacityCoursera 合作的两个新的在线课程可用于学习 TensorFlow。

最后,新发布会 TensorFlow World 将于 2019 年 10 月 28 日-31 日举行。与 O’Reilly 合作举办的 TensorFlow 世界大会将召集工程师、开发人员、高管和产品经理,讨论他们由 TensorFlow 支持的产品/服务。

第二天-3 月 7 日

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

第二天专门进行灯光讲座、小组讨论和研讨会,例如:

  • ML 的可视化调试工具
  • 网易
  • 蝴蝶:民主化的超声波
  • PAI:阿里巴巴的人工智能平台

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

PAI presentation

  • TensorFlow.jl:现在在 Julia 编程语言中支持 TensorFlow

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

Julia and Python syntax side by side

  • TF-lattice:一个帮助开发人员确保他们的机器学习模型即使在训练数据有噪声的情况下也能坚持全球趋势的项目

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

TF-lattice

  • TF.text:改进 TensorFlow 中的文本,改进 TensorFlow 中的 unicode 支持
  • TF.js 在创意实验室的使用

我还参加了 Tensorflow 2.0 升级的小组讨论。

TensorFlow Extended (TFX)车间

TFX 研讨会旨在提供 TensorFlow Extended (TFX)的实践经验,并帮助学习创建我们自己的机器学习管道。在研讨会期间,参与者遵循典型的 ML 开发过程,从检查数据集开始,以完整的工作管道结束。这也是一个探索不同方法来调试和更新我们的管道并衡量绩效的机会。

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

TFX workshop screenshot

最终想法

总的来说,2019 TF Dev 峰会很不错,一堆信息和公告。与去年相比有许多改进;例如,增加第二天和研讨会。如果您使用 TensorFlow,并且希望结识在现实生活用例中也使用 TF 的同行,我肯定认为这个事件是必须考虑的。

参考资料和进一步阅读:

让我们谈谈数据流

原文:https://towardsdatascience.com/tensorflow-goes-2-0-but-what-is-dataflow-16a2056e6cf8?source=collection_archive---------13-----------------------

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

Photo by @eberhardgross

TensorFlow 走 2.0,但什么是数据流?

谷歌的研究和生产使用 TensorFlow。或许正是因为这个原因,作为使用机器学习的最大的技术公司之一,理解 TensorFlow 是什么并对其新的更新有一点兴趣是明智的。它是一个应用程序编程接口。应用程序接口(API)是一组用于构建软件应用程序的例程、协议和工具。如果你已经熟悉 TensorFlow 是什么,或者只是想查看新的更新,那么这篇文章可能不适合你——请直接在 Medium 上查看 tensor flow的新文章。在我的文章中,我将尝试解释和探索数据流,它是张量流中的一个核心概念。

什么是张量流?

tensor flow是一个免费的开源软件库,用于数据流和跨一系列任务的差异化编程。**

在这个简短的第一句话中,我们听到了两个可能令人困惑或需要澄清的概念。

  1. 数据流
  2. 可微编程

在这篇文章中,我将集中讨论第一个概念。

数据流或数据流编程

数据流编程将程序建模为操作间数据流动的有向图,从而实现数据流原则数据流原则和架构。

在数学中,有向图(或有向图)是由一组由边连接的顶点组成的图,其中边有一个与之相关的方向。

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

Retrieved 6th of October 2019 from Wikipedia on Directed graph

Flawnson Tong 在他的文章中把一个图解释为: ,在图论的上下文中,是一个结构化的数据类型,它具有 节点 (保存信息的实体)和 (可以深度学习是一种机器学习算法,而机器学习算法又是人工智能的一个子集。

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

Data is not this neat of course, gif by Matthew Butler

有些人使用术语“数据流”而不是“数据流”,这是因为可能与先前基于不确定性机器范例的“数据流架构”概念相混淆。非决定论是一种认为事件不是由或不是由决定论引起的观点。它与决定论相反,与偶然性有关。因此,这是某种加权的可能性,即某事应该发生或不发生,以及影响结果的变化的偏差(输入)。

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

Iillustration by Google on the Cloud Dataflow page retrieved the 6th of October

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

Dataflow pipeline by Sameer Abhyankar posted in Google Cloud Platform on Medium

数据流原则——基于数据流的进度表示。一篇名为 调度表示之间的等价:理论与应用 的论文是这样说的:“调度通常被表示为一组作业到一组处理器的映射;这种映射随着时间而变化。”因此,它可以被描述为一个优化问题或不同的最优或次优(不太)理想解决方案的“映射”。

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

An overview of data transformation with [Google Cloud](http://Data Transformation with Cloud Dataflow)

维基百科对数据流编程的描述非常有趣,所以我决定直接引用它:

“顺序程序可以被想象成在任务(操作)之间移动的单个工人,而数据流程序更像是装配线上的一系列工人,只要有材料,每个人都在做特定的任务。因为操作只关心数据输入的可用性,所以它们没有要跟踪的隐藏状态,并且同时都“就绪”

数据流编程语言共享一些函数式的特征,并且通常被开发来将一些函数式概念引入到更适合数字处理的语言中。在函数式编程中,程序被视为一系列无状态的函数求值。

照这样!

TensorFlow :基于数据流编程的机器学习库。

然而,它同时还是一个符号数学库,也用于机器学习应用,如神经网络。它是一个应用程序编程接口。应用程序接口(API)是一组用于构建软件应用程序的例程、协议和工具。

希望这能让你稍微开心一点,当然,这可能会引出更多的问题,而不是答案。

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

Hope this made you happy! — Gif made by @sherchle

张量流 2.0

谷歌希望扩大机器学习的规模,并发布了 TensorFlow2.0。它被描述为企业和研究人员易于使用的框架。它面向可扩展的 ML 支持的应用,将 Keras 紧密集成到 TensorFlow 中。

Keras是一个用 Python 编写的开源神经网络库。它能够运行在 TensorFlow、微软认知工具包、Theano 或 PlaidML 之上。旨在实现深度神经网络的快速实验,它专注于用户友好、模块化和可扩展。

因此,TensorFlow 2.0 优先考虑 Python 开发者(一种编程语言)。它有更完整的底层 API。低级接口。最详细的编程接口(API ),允许程序员在非常精细的级别上操作软件模块或硬件中的功能。粒度数据是详细的数据,或者是目标集中数据的最低级别。从哲学意义上来说,粒度计算可以描述一种思维方式,这种思维方式依赖于人类在不同粒度级别(即抽象)下感知真实世界的能力,以便只抽象和考虑那些服务于特定兴趣的事物,并在不同粒度之间切换。”

新的 2.0 保存了具有各种运行时的模型(部署到 web 和云)。运行时是指程序正在运行(或可执行)的时候。也就是说,当你启动一个在计算机上运行的程序时,它就是那个程序的运行时。它可以在浏览器中运行,并有多 GPU 支持。多 GPU。(多图形处理单元)使用两个或更多图形卡来支持更快的运行时间。

除此之外,还有扩展的 TensorFlow 数据集(标准化)。推荐执行急切的常规 Python。我以前写过关于急切执行的文章。 急切执行 是一种推测执行的形式,其中条件分支的两端都被执行;然而,只有当谓词为真时,才提交结果。

这是#500daysofAI 的第 125 天。如果你喜欢这篇文章,请给我一个答复,因为我确实想提高我的写作或发现新的研究,公司和项目。

Tensorflow GPU 安装变得简单:Ubuntu 版本

原文:https://towardsdatascience.com/tensorflow-gpu-installation-made-easy-ubuntu-version-4260a52dd7b0?source=collection_archive---------6-----------------------

在 ubuntu 上安装 Tensorflow GPU 对于正确版本的 cuda 和 cudnn 来说是一个挑战。一年前,我写了一篇文章,讨论了用 conda 安装 Tensorflow GPU,而不是用单行命令安装 pip。这是那篇文章的链接。

[## Tensorflow GPU 安装变得简单:使用 conda 而不是 pip

我有一个配置不错的 GPU,以前玩 FIFA 都是用它。转行 AI,本来想用 GPU 做深度学习的…

towardsdatascience.com](/tensorflow-gpu-installation-made-easy-use-conda-instead-of-pip-52e5249374bc)

这篇文章已经被阅读了超过 25 万次,但仍然有一些 Ubuntu 用户在使用正确版本的 CUDA 和 CUDNN 运行 Tensorflow GPU 时面临问题。我知道这篇文章的标题可能会误导人,但是相信我,如果你一步一步的去做,那么在 ubuntu 上正确的安装是很容易的。

目录:

  1. 检查 GPU 与 Tensorflow GPU 的兼容性!
  2. 切换到图形卡
  3. 检查 CUDA 与图形卡的兼容性
  4. 根据 CUDA 确定 Tensorflow 版本
  5. 下载 CUDA 工具包
  6. 安装 CUDA
  7. 下载 cudnn 并安装
  8. 验证 cudnn 安装
  9. 在使用 Conda 的新环境中使用 pip 安装 Tensorflow-gpu
  10. 验证 tensorflow 正在使用 GPU。

注意-你可以使用这篇文章安装任何版本的 TENSORFLOW,确保你正确的决定了 CUDA 的版本。

  1. 检查 GPU 与 Tensorflow GPU 的兼容性(从到此处
  2. 打开显卡
    进入菜单>搜索“驱动程序设置”>点击附加驱动程序

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

选择 NVIDIA 二进制驱动程序,在我的例子中是 384 版本的**。这是非常重要的记录下来,因为这个驱动程序版本将有助于我们确定 CUDA 版本。**

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

现在,如果你去一个终端,键入 nvidia-smi,你也会得到驱动程序版本。

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

3.从这里检查 CUDA 与您的驱动程序版本的兼容性。

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

在我们的例子中,因为驱动程序版本是 384.130,所以我们只能安装 CUDA 9.0

4.根据 CUDA 确定 Tensorflow 版本

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

完成这一步后,你应该对 3 件事非常清楚:
i)你要安装什么 Tensorflow 版本(tensorflow-gpu 1.12.0)
ii)你要安装什么 CUDA 版本(9.0)
iii)你要安装什么 cudnn 版本。(7)

注意:这些问题的答案会因您当前使用的驱动程序版本而异。

如果你知道这三个问题的答案,那么你已经闻到胜利的味道了。

5.下载 CUDA 工具包
转到此链接并下载您在步骤 4 中找到的 CUDA 的具体版本(本例中为 CUDA 9.0)

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

6.CUDA 安装

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

Execute the run file downloaded

你将获得软件许可证,长按回车键。现在接受除驱动程序安装之外的所有内容。

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

安装后,您将收到以下消息:

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

现在你必须在 bashrc 文件中输入特定的路径,这样你才能访问 cuda。打开终端并运行命令

sudo su
sudo gedit ~/。bashrc

(在文件末尾添加以下行)

export PATH=/usr/local/cuda/bin:/usr/lib/:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/lib/nvidia-384:$LD_LIBRARY_PATH
export CUDA_HOME=/usr/local/cuda-9.0

保存并关闭文件,然后将 bashrc 文件作为源,以使更改生效。

来源~/。bashrc

现在打开一个终端并编写命令

nvcc -V

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

您将获得运行的 CUDA 版本。

6.验证 CUDA 安装(可选):如果你对 nvcc 版本满意,那么你可以跳过这一步。

打开终端并运行以下命令:

cd /usr/local/cuda/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery

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

7.下载与 CUDA 兼容的 cudnn 并安装

进入链接并安装 cudnn。记住在这里下载 cudnn 的版本,它与 CUDA 兼容,在这里是 7。你需要注册 NVIDIA 网站来下载这个。

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

Download all the three files.

按照以下顺序安装 cudnn 包:运行时>开发人员>文档。使用命令

sudo dpkg -i<package_name></package_name>

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

8.验证 cudnn 安装

为了验证我们的 cudnn 安装,我们将测试一个 cudnn 样本。打开终端并发出以下命令:

cp -r /usr/src/cudnn_samples_v7/ $HOME
cd  $HOME/cudnn_samples_v7/mnistCUDNN
make clean && make
./mnistCUDNN

如果 cudnn 安装正确,您将会看到这样的消息:测试通过

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

9.下载 Miniconda 并安装。记得不要 root 安装。

现在创建一个安装 tensorflow-gpu 的环境。

conda create  --name tf1 python=3.6

执行此命令后,将使用 python 版安装一个名为 tf1 的新环境。现在激活环境并执行命令来安装我们在步骤 4 中找到的特定版本的 tensorflow-gpu。

source activate tf1
pip install tensorflow-gpu==1.12

10.要测试 tensorflow 安装,请遵循以下步骤:

  1. 打开终端,使用*‘源激活 tf1’激活环境。*
  2. 使用python进入 python 控制台
import tensorflow as tfsess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

现在,如果您能够在终端中看到您的 GPU 信息,那么恭喜您,您终于成功了!

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

谢谢你的时间。请通过 LinkedIn 与我联系,了解更多关于数据科学的更新和文章。

使用无服务器架构的 TensorFlow 图像识别教程—节点 JS

原文:https://towardsdatascience.com/tensorflow-image-recognition-tutorial-using-serverless-architecture-node-js-69eb1a3ce110?source=collection_archive---------18-----------------------

使用 TensorFlow JS + Serverless 的分步教程

基于卷积神经网络(CNN)的架构,如 VGG-16、GoogLeNet、ResNet、MobileNet 等。是广泛用于图像识别、从图像和视频中检测物体的模型。更多关于卷积神经网络的细节,请参考我比较老的博客

在这篇博客中,我将使用无服务器架构和 CNN 的 MobileNet 模型来解释图像识别教程。MobileNet 架构是一种适用于移动和嵌入式设备的轻量级模型。MobileNet 模型已经训练了超过 1400 万幅图像和 20,000 个图像分类。使用预先训练的模型,该模型有助于快速分类输入图像并产生结果。

无服务器架构——tensor flow 后端

在无服务器云函数中使用 MobileNet 模型的图像识别过程。因为 MobileNet 是轻量级架构,可以在云功能中运行。在这个架构中,我们将使用 Node JS 作为客户端接口和后端 REST 服务(无服务器)。

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

Figure 1: Serverless Architecture with TensorFlow MobileNet model — Node JS

上图描述了一个两层架构。

  • API 客户端接口
  • 使用 TensorFlow 作为后端的图像处理组件

TensorFlow 框架,具有 MobileNet 模型 API 包装器实现和使用节点 JS 堆栈的 API 客户端接口。

申请流程

  • 用户将使用客户端界面上传图像。客户端接口将图像转换为 base 64 数据,并将数据发布到后端 REST API 中
  • 在 AWS Lambda 中开发和部署的后端 REST API。在本教程中,我们使用 AWS Lambda
  • 无服务器框架帮助我们使用 YAML + CLI 部署将基于节点 JS 的 REST API 部署到任何云功能,如 AWS、Azure、Google Cloud &等。
  • 后端 REST API 模块使用 TensorFlow 深度学习模块分析图像并预测图像
  • JSON 数据的结果将被发送到客户端接口。客户端界面在浏览器中呈现输出结果。

API 客户端界面—流程

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

Figure 2: Client UI — Landing Page. Currently, our tutorial supports — Image Analyse Techniques module

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

Figure 3: Image Analyse Client Interface — UI

  • API 客户端界面帮助将图像上传到 API 服务器
  • 当图像上传到 API 服务器时,它会转换成 base64 编码的字符串,并调用 TensorFlow 无服务器云函数(这里是 AWS Lambda)
  • 基于 TensorFlow 的应用程序使用 Node JS 开发,部署在 AWS Lambda 中。

图像处理实用程序—输出

下面是几个输出。

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

Figure 4: Image Analyse Output

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

Figure 5: Image Analyse Output

现在,让我们一层一层、一步一步地看代码。

TensorFlow REST API —在无服务器环境中运行

首先,我们将导入 TensorFlow 节点 js 模块。细节在下面的片段中提到。

注意:-使用 Node JS 开发的后端 REST 和客户端接口的源代码都可以在我的 Github repo 中找到。请参考底部的 Github 链接。

下面的代码片段是主节点 js 函数,它作为 REST 端点导出。

第 6 行 :事件参数,包含一个体属性“event.body”从客户端接口获取图像 base 64 数据,用户上传

第 8 行: 它获取 base 64 图像数据,并作为图像写入临时路径(对于每个请求,将创建一个新的文件名。参考,第 5 行)

第 9 行: 它调用另一个名为“classify”的函数 by,传递前面创建的参数路径。path 变量包含新的图像文件路径。分类函数的细节可以在下面的代码片段中找到。输出变量结果以异步模式接收响应,该响应包含张量流图像预测结果以及概率得分。输出详情请参考上图 4 & 5。

第 5 行 :从路径中读取图像

第 6 行 :从给定图像转换三维数组

第 7 行 :加载 MobileNet 模型

第 8 行 :将输入图像的 3d 数组矩阵作为参数,对图像进行分类,得到预测的图像结果。

从 URL 加载移动网络模型

客户端界面—UI

第 7 行: 它将输入图像作为 base 64 数据提交,并将其发布到后端 REST 服务端点。变量“apiURL”从 config.json 加载 REST URL。

后端 API 部署

  • 首先,我们必须部署后端服务。后端服务是一个 REST API,它使用 TensorFlow 处理图像输入并对图像进行分类/预测
  • API 是用 Node JS 开发的
  • 使用无服务器框架,我们将把我们的 API 部署到无服务器环境中。在本教程中,我们使用 AWS Lambda 作为无服务器环境。

步骤 1 :在你的机器上下载并安装/更新无服务器框架。请参考此无服务器文档链接获取安装帮助—【https://serverless.com/framework/docs/getting-started/

安装完成后,键入"*SLS-help "*应该会得到如下图所示的输出

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

Figure 6: Serverless command to test “sls — — help”

步骤 2 :下载您的 AWS 凭证(访问&密钥)并在您的操作系统中设置为环境变量,如果您使用的是 Linux 或 Mac 操作系统,则使用“export”命令,如果您的操作系统是 windows,则使用“set”命令

导出 AWS_ACCESS_KEY_ID= < <您的 AWS 访问密钥> >

导出 AWS_SECRET_ACCESS_KEY= <>

第三步:从 Github URL 克隆源代码

git 克隆 git @ github . com:RaghavPrabhu/Deep-learning . git

成功克隆后,转到文件夹server less _ image _ tensor flow/back end _ API

第四步:在 backend_api 文件夹中执行下述命令

npm 安装

上述命令将通过读取 package.json 文件来安装所有节点模块。注意:——你也可以通过“yarn”命令来安装节点模块

步骤 5 :使用无服务器命令将我们的后端 API 部署到 AWS Lambda

sls 部署

上面的命令将在 AWS Lambda 中部署 API。请参考下面的截图了解更多细节。

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

Figure 7: Deploy backend API on AWS Lambda using Serverless command to test “sls deploy”

注意:请确保您已经在您的环境中设置了 AWS 访问和密钥。参见步骤 2。

成功部署后,在 AWS 中验证您的 Lambda 函数细节。

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

Figure 8: AWS Lambda Function Deployment Details

前端 UI 部署

第一步:转到“前端 _ 客户端”文件夹

第二步:在 backend_api 文件夹中执行下述命令

npm 安装

第四步:打开 config/default.json 文件,更新 API URL。参考下面的截图。注意:这一步很重要!!!

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

Figure 9: Config file update in default.json file

步骤 3 :运行以下命令启动客户端界面

node server.js

万岁!!!已经部署好了。

转到浏览器,键入“http://localhost”并测试。您应该会看到类似于图 2 中的屏幕。

你可以在我的 Github URL 中找到后端 API 和前端 UI 的源代码。

总结

  • 使用 node js + TensorFlow js 库构建 Tensorflow 图像检测 API
  • 使用无服务器框架将 API 部署到无服务器环境中
  • 使用节点 js 构建客户端接口,并在 config/default.json 文件中配置 API 端点
  • 使用客户端 UI 上传图像并测试图像类型
  • 本教程使用无服务器框架在 AWS Lambda 中进行了测试。随意将 API 部署到其他云功能中,如 Azure cloud function、Google cloud function、IBM openwhisk、Kubeless 等。,通过利用无服务器框架的特性。
  • 这个教程代码可以在这里找到。

TensorFlow 与 Keras 有关系—推出 TF 2.0

原文:https://towardsdatascience.com/tensorflow-is-in-a-relationship-with-keras-introducing-tf-2-0-dcf1228f73ae?source=collection_archive---------13-----------------------

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

今年早些时候,oogle 的 TensorFlow 团队宣布了其最新且相当易用的版本。对于使用过 TensorFlow 1。XX,这个版本没那么丑,没那么毛骨悚然,更人性化(技术更新和改动在下面讨论)。我将写一个 3 部分的系列,这是一个开始,也是最短的一个。这些部分主题如下:

  • TF 2.0 简介
  • TensorFlow 2.0 中的图像分类
  • TensorFlow 2.0 中的迁移学习

TensorFlow 和 Keras 是什么?

维基百科 提出 TensorFlow 是一个免费的开源软件库,用于数据流和跨一系列任务的差异化编程。从人类的角度来说,TensorFlow 是一个大规模构建机器学习模型的开源库。它是迄今为止最受欢迎的构建深度学习模型的库。它还拥有最强大的庞大的开发人员、研究人员和贡献者社区。

Keras 是一个高级神经网络 API,用 Python 编写,能够运行在 Tensorflow、Theano 或 CNTK 之上。它在研究和开发社区中非常受欢迎,因为它支持快速实验、原型和用户友好的 API。用户友好的代价是无法访问 TensorFlow 的内部细节,但合理数量的复杂事情仍然可以完成。

Tensorflow 2.0 中的新增功能

Tensorflow 致力于为正在进行的任何计算构建计算图;从增加两个数到建立一个生成性的对抗网络。一旦构建了图形,它就在所谓的**会话中执行。**对于初学者来说,这可能听起来像是一剂重药(现在你可能明白为什么 TensorFlow 1 有点难看了),这就是为什么很难,尤其是对于初学者来说,直接跳到 TensorFlow 来实现神经网络。

随着 TensorFlow 2 的出现,事情变得非常整洁、灵活,任何人都可以通过实验轻松进入深度学习领域。Tensorflow 2 实现了 Keras 和直观的高级 API tf.keras 的紧密集成,以构建神经网络和其他 ML 模型。您可以获得 Keras 的用户友好性,也可以从访问 TensorFlow 的所有低级课程中受益。这是一个完美的组合,适合不同行业和专业知识的人使用;因此,一个完美的爱情故事 TensorFlow 和 Keras。

根据 Tensorflow 2 新功能的官方评论,这些新功能可以归纳为三大类:

1)可用性

  • 随着 Keras 的集成,可用性变得非常强大。在深度学习方面具有不同专业水平的人可以使用 TensorFlow now 进行工作;这在很大程度上增加了可用性。
  • 最大的变化之一是默认的急切执行模式。简单地说,您不需要构建图形,然后在会话中执行它们来运行基本的乘法运算。你可以简单地在飞行中建立深层网络。这对为神经网络编写代码的开发人员隐藏了很多复杂性。然而,这并没有剥夺你使用该图的好处,因此这些可以通过 tf.function. 访问

2)清晰度

  • 重复的功能已被删除。为了消除这些问题,在实际代码库中做了大量的清理工作。
  • 语法更加直观(多亏了 Keras ),并且始终一致。

3)灵活性

  • 如前所述,您仍然可以为不同种类的定制任务使用低级 API。
  • 它还为变量、层和检查点提供了可继承的接口。

TensorFlow 2 的架构如下所示。

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

Tensorflow 2 Architecture

接下来会发生什么?

TensorFlow 中有更多的更新和新功能,我们将在本系列的未来博客中探索它们。在下一篇博客中,我们将讨论如何在 Tensorflow 2 中借助卷积神经网络构建图像分类器来启动计算机视觉。你可以看看我之前关于计算机视觉入门的博客,对计算机视觉有个了解。这将有助于你理解大局,也肯定有助于应对下一个博客。《Keras》的作者 Francois Chollet 最近出版了一本笔记本,作为 Tensorflow 2 的速成课程。要彻底研究 tensorflow 2,你可以查看 CourseraUdacity 上提供的两个有趣的专业。

有关 TensorFlow 2 的更多更新,请访问https://www.tensorflow.org/

您也可以在我的 LinkedIn 上联系我进行任何讨论。

张量流。JS —使用 JavaScript Web Worker 运行 ML 预测函数

原文:https://towardsdatascience.com/tensorflow-js-using-javascript-web-worker-to-run-ml-predict-function-c280e966bcab?source=collection_archive---------18-----------------------

这篇文章是关于客户端的机器学习。我将解释如何在 JavaScript Web Worker 中运行 ML 模型。该模型在 TensorFlow/Keras(使用 Python)中训练,以检测酒店评论的情绪。

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

Source: Pixabay

我是 JavaScript 开发人员,当机器学习模型在客户端(在浏览器中)运行时,我感觉棒极了。如果你决定在浏览器中运行 ML 模型,我将在这篇文章中讨论几个主题,我相信你会发现它们很有用:

  • 如何用 Python 训练 ML 模型
  • ML 模型如何转换为与 TensorFlow.js 兼容
  • 运行 TensorFlow.js 预测函数的 JavaScript Web Worker

我在用 ML 模型为一篇酒店评论预测情绪。我在 Kaggle 上发现了这个优秀的数据集— 欧洲 515K 酒店点评数据。它提供了来自 Booking.com的 51.5 万条酒店评论记录。使用这个数据集,我训练了 Keras 模型,将其转换为与 TensorFlow.js 兼容,然后包含到客户端 js 应用程序中。你可以亲自检查它是如何工作的,这个应用程序部署在 Heroku—【https://sentiment-tfjs-node.herokuapp.com/ :

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

JS app with TensorFlow.js

试着输入Bed comfort,你会得到非常低的否定分数:

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

JS app with TensorFlow.js

然后加上— V 外面很吵,负面评分会增加到中性情绪:

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

JS app with TensorFlow.js

如何用 Python 训练 ML 模型

使用 Zaid Alyafeai 帖子中解释的方法实现文本情感分类——从 Keras 到浏览器的情感分类。关于如何建立文本情感分类我就不深入解释了,你可以在 Zaid post 里看。

为了能够训练模型,我处理了酒店评论数据集,并从所有属性中提取了酒店评论文本和情感(0-正面,1-负面)。我使用数据子集来训练模型,以减少训练时间。我使用了前 10 万条评论:

df = pd.read_csv('hotel-reviews.csv', nrows=100000)
df['REVIEW_TEXT'] = df['REVIEW_TEXT'].astype(str)
print('Number of rows ', df.shape[0])

使用批量= 128(批量越大,训练越快),在 5 个时期中训练该模型。验证集被分配了 20%的训练数据:

model.fit(np.array(X_train_tokens), np.array(Y_train),
          validation_split=0.2, epochs=5, batch_size=128)

模型训练成功,验证准确率高达 94%;

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

Model training results

当模型被训练时,还有两件事要做。创建一个字典文件,它将用于编码用户语句,以供客户端预测功能处理。使用优化器保存模型,以便能够将其转换为 TensorFlow.js 友好表示。

确保在保存模型时,训练过程只进行了一次(在保存之前,您没有多次运行训练,或者关闭 Python notebook 并从头开始进行新的训练),否则保存的文件中的模型会过载,并且 TensorFlow.js 无法重用模型。

ML 模型如何转换为与 TensorFlow.js 兼容

保存模型后,将其转换为 TensorFlow.js 格式,这样将创建两个新文件(模型 bin 文件和包含元数据的 JSON 文件):

tensorflowjs_converter --input_format keras hotel-reviews-model.h5 tensorflowjs/

在此阅读更多信息— 将 Keras 模型导入 TensorFlow.js 了解如何将现有 Keras 模型转换为 TensorFlow.js,然后将其加载到 TensorFlow.js

JavaScript Web Worker 运行 TensorFlow.js 预测函数

TensorFlow.js predict 函数调用为什么需要使用 Web Worker?预测函数调用不是异步的,这意味着它阻塞主 JavaScript 线程,用户屏幕将被冻结,直到预测完成。情感分析预测需要几秒钟的时间,用户界面冻结会让用户烦恼。Web Worker 允许将长时间运行的任务委托给单独的 JavaScript 线程,而不会阻塞主线程。

JavaScript 应用基于 Oracle JET toolkit(开源库集合— knockout.js、require.js 等。).要在您的计算机上运行示例应用程序,请执行以下命令:

  1. npm install -g @oracle/ojet-cli
  2. 从应用程序根文件夹运行:ojet 恢复
  3. 从应用程序根文件夹运行:ojet serve

appController.js 中有一个函数,每次当用户停止输入文本时都会被调用——调用预测情绪。此函数创建 Web Worker(如果不存在)并将用户输入发送到 Web Worker(输入被编码并准备好用于张量创建):

if (!worker) {
  worker = new Worker("js/worker.js");
}worker.postMessage(seq);
worker.onmessage = function (event) {
  console.log('prediction: ' + event.data);
  self.negativityScore(event.data);
  self.sentiment(convertToSentiment(event.data));
};

事件侦听器被注册来处理返回消息(预测)—它通过剔除可观察变量被推送到 UI。

Web Worker 在 worker.js 文件中实现。这个文件在它自己的上下文中运行,您应该在这里隐式引用 TensorFlow.js 库。确保设置 CPU 后端,Web Worker 中的 TensorFlow.js 仅适用于 CPU 后端:

importScripts('https://cdn.jsdelivr.net/npm/setimmediate@1.0.5/setImmediate.min.js');importScripts('https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.2.7/dist/tf.min.js');tf.setBackend('cpu');

这是主代码(Web Worker 中的消息监听器)—调用 TensorFlow.js predict 函数(将用户输入转换为张量)的地方,结果通过消息返回到主线程:

onmessage = async function (event) {
  console.log('executing worker');
  seq = event.data;
  if (!model) {
    model = await createModel();
  }
  input = tf.tensor(seq);
  input = input.expandDims(0);
  predictOut = model.predict(input);
  score = predictOut.dataSync()[0];
  postMessage(score);
  predictOut.dispose();
};async function createModel() {
  const model = await tf.loadLayersModel('ml/model.json')
  return model
}

资源:

TensorFlow,认识一下 ESP32

原文:https://towardsdatascience.com/tensorflow-meet-the-esp32-3ac36d7f32c7?source=collection_archive---------4-----------------------

如何为 ESP32 设置 TensorFlow Lite 环境

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

如果我必须选择一个最喜欢的计算领域,我会选择嵌入式系统。我喜欢在资源受限的环境中优化代码所带来的挑战。

当我意识到 TensorFlow Lite 支持微控制器时,我兴奋地翻了翻桌子。

我有几个 ESP32-CAM 模块,想用于家庭安全系统。我的想法是部署一个能识别人的模型,当摄像机捕捉到一个人时就开始记录。我不想在这里使用动作感应,因为我有一只狗会触动传感器。

我认为 TensorFlow Lite 是这个用例的一个很好的工具。我可以训练一个模型来识别我桌面上的人,然后将其部署到我的 ESP32-CAM 模块中。

通读 TensorFlow Lite 文档后,很明显使用 PlatformIO 不会像调用:

platformio lib install tfmicro

除非我想用 Adafruit 库(剧透:我不要)。

通过一些仔细的试验和错误,我能够让 TensorFlow Lite 在 ESP32 上很好地与 PlatformIO 兼容。

本指南将介绍我是如何使用 PlatformIO 和 Arduino-ESP32 支持将“Hello World”示例编译并上传到 ESP32-CAM 模块的。

为 PlatformIO 部署设置 TensorFlow Lite

你要做的第一件事是安装 PlatformIO。为此,请打开终端并键入:

pip install -U platformio

现在,创建项目的根目录。这个目录还应该包含 srclibinclude 的子目录。

在项目的根目录下,创建一个名为 platformio.ini 的文件。该文件将包含 PlatformIO 初始化开发环境所需的所有信息。我的看起来像:

platformio.ini

接下来,您需要创建一个名为 custom.csv 的文件。这是 ESP32 闪存的分区信息。您可以根据应用程序的需求和 ESP32 的闪存大小格式化分区表。更多关于 ESP32 分区表的信息可以在这里找到。下面是我的 custom.csv 文件的格式:

custom.csv — The custom partition table I am using for the ESP32

完成所有设置后,继续克隆 TensorFlow 存储库(包括 TensorFlow Lite)。您可以下载. zip 文件并解压到您选择的目录中,或者使用 git 克隆:

git clone [https://github.com/tensorflow/tensorflow.git](https://github.com/tensorflow/tensorflow.git)

下载 TensorFlow 存储库后,从 TensorFlow Lite 文件夹中生成一个示例 ESP32 项目。我们想要生成一个样例项目,这样我们就可以获取生成的 tfmicro 库和样例模型。要生成示例项目,请导航到根“tensorflow”文件夹并运行:

sudo make -f tensorflow/lite/experimental/micro/tools/make/Makefile TARGET=esp generate_hello_world_esp_project

这将生成一个示例项目,它位于:

tensorflow/lite/experimental/micro/tools/make/gen/esp_xtensa-esp32/prj/hello_world

导航到 hello_world/esp-idf 目录,将 tfmicro 文件夹从 components 复制到之前创建的 lib 文件夹中。如果您计划运行示例程序以确保正确设置环境,那么将 sin_model_data.ccsine_model_data.h文件夹复制到 srcinclude 文件夹。

您的文件结构现在应该类似于:

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

Project Directory Structure

到目前为止很简单,是吧?

您几乎完成了!你只需要调整一下 tfmicro library 文件夹中的一些东西,这样 PlatformIO 就可以看到 TensorFlow Lite 需要的所有第三方库。

导航到 tfmicro 文件夹。你应该会看到两个文件夹: tensorflowthird_party

进入third _ party/flatbuffers/include,将 flatbuffers 子目录复制到 tfmicro 根目录。

接下来,进入第三方/gemmlowp ,将固定点内部目录复制到 tfmicro 根目录。

最后,将 kissfft 目录从第三方复制到 tfmicro 根目录。

此时,您可以继续删除第三方目录。

通过将所有第三方库移动到 tfmicro 根目录,PlatformIO 可以识别并使用它们。

项目的最终结构应该是这样的:

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

File structure for a TensorFlow Lite ESP32 Project

文件结构完成后,导航到lib/TF micro/flatbuffers并打开 base.h 。在 base.h 内,将第 34 行从:

#if defined(ARDUINO) && !defined(ARDUINOSTL_M_H)
  #include <utility.h>
#else
  #include <utility>
#endif

收件人:

#include <utility>

您现在完成了!剩下要做的唯一一件事就是在项目中导入和使用 TensorFlow Lite。

构建一个示例项目

为了测试 TensorFlow Lite 是否正常工作,我改编了“Hello World!”Arduino-ESP32 草图中使用的正弦模型。

下面我来指导你我是怎么做的!

包括

我做的第一件事是导入项目将使用的所有库。

Needed Libraries for TensorFlow Lite Sample Project

这些库如下:

  • Arduino。h — Arduino 支持!😃
  • math.h —这里专门用来定义 M_PI(后面会讨论)。
  • all_ops_resolver.h —定义用于运行模型的操作。
  • micro_error_reporter.h —用于错误报告。
  • micro_interpreter.h —运行模型。
  • sine_model_data.h —我们正在使用的样本模型。

全局变量

接下来,我设置变量:

TensorFlow Lite Variables

我定义的第一个全局变量是内存池,用于存储模型生成的数组。 TensorFlow 的文档指出,您可能需要从不同模型的实验中得出池的大小。为此,我只是使用了 TensorFlow 为运行正弦模型提供的示例代码。

然后我定义了模型、解释器和输入/输出节点。

设置设计

定义了全局变量之后,就该设置环境了。

在“setup()”函数中,我以 115200 波特启动串行,并导入正弦模型。

Start Serial and Import Sine

然后我实例化了 TensorFlow Lite 微解释器

最后,我将模型的张量分配到被定义为全局的内存池中,并将输入和输出变量设置到它们对应的节点。

“setup()”函数到此结束。简言之:我导入了模型,创建了解释器,并将模型加载到内存中。

控制回路设计

“setup()”函数完成后,我开始实现控制循环逻辑。

对于控制循环,我等待来自 serial 的用户输入,并将其转换为 float。然后,我检查以确保用户输入在模型的参数(0–2 * PI)范围内:

然后,我将模型的输入节点设置为已解析的用户输入,调用解释器,然后打印出结果:

部署到 ESP32

代码完成后,您可以使用 PlatformIO 部署到 ESP32,包括:

platformio run -t upload --upload-port /dev/ttyUSB0

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

Uploading to the ESP32

然后,您可以使用以下命令通过串行给出程序输入:

screen /dev/ttyUSB0 115200

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

Running Sine Model on ESP32

就是这样!我真的很惊讶 TensorFlow 可以如此轻松地将模型部署到微控制器上。我的下一篇文章将讨论如何使用 TensorFlow 创建模型,以及如何将其转换为可以由 TensorFlow Lite 运行的东西!

GitHub 项目报告:https://GitHub . com/wezleysherman/ESP32-tensor flow-Lite-Sample

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值