TowardsDataScience 博客中文翻译 2016~2018(二百一十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

多伦多机器学习峰会(2018)笔记

原文:https://towardsdatascience.com/notes-from-toronto-machine-learning-summit-2018-69ada327cc3e?source=collection_archive---------20-----------------------

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

本周早些时候,我参加了多伦多机器学习峰会。与我到目前为止参加的会议和其他技术活动相比,这是一次非常不同和令人耳目一新的经历。这篇文章包含了我在会议上的一些笔记,主要是我参加并喜欢的演讲。

会议有四种演讲:主题演讲、研究、应用、商业。让我一个一个来。

**主题演讲:共有 6 场主题演讲(每天 3 场)。**会议以孙铁麟·普塔宁(layer6.ai)、刘可莉(Rubikloud)和 Margaret Wu(格鲁吉亚合伙人)的三个主题演讲开始。由于各种原因,我错过了所有三场会谈的部分内容,但这些会谈的整体情绪似乎反映在刘可莉在《环球邮报》上的一篇文章中,题为:“人工智能不需要更多的研究人员,它需要更多的产品”。这里的 AI 是加拿大 AI 空间。总的来说,虽然研究需要资助、重视和继续,但加拿大也应该成为人工智能的行业领导者。

第二天的主题演讲来自:Philippe Beaudoin(元素。AI)、简·班尼斯特(Real Ventures)、山姆·莱特斯通(IBM)。Philippe Beaudoin 的演讲更像是一个关于人工智能、我们的生活/未来等的一般的哲学视角(就像他的:“一个你希望成为的人的网络”)。

相比之下,珍妮特·班尼斯特(Janet Bannister)的书完全是关于投资者在人工智能初创公司中寻找什么。她详细谈论了不同类型的人工智能初创公司,多伦多/加拿大的当前趋势,她过去与传统公司的经历以及他们对人工智能的反应,最后对未来的趋势进行了一些预测。这些趋势包括:

  • 技术民主化
  • 一切都超个性化
  • 所有公司都将结盟成为科技公司
  • 劳动力的自动化和商品化

Sam Lighthouse 的演讲是关于大脑启发的微芯片、神经语义计算、IBM(和其他公司)如何超越构成当今计算机基础的传统冯诺依曼架构,并探索了在芯片上构建神经网络等想法。看到这项技术在 50 年左右的时间里向何处发展,对比 20 世纪 60 年代的神经网络布线图和 IBM 现在能做的事情,是一件令人着迷的事情。

在我参加的讲座中,我喜欢两个讲座:

  • Sunnybrook 研究所的 Anne Martel 的“医学成像的机器学习”
  • 多伦多大学的彼得·魏特克的“当代量子计算能为机器学习提供什么吗?

我并不自称是这两个话题的专家。我去参加这些会议只是为了丰富我在会议上的经验,最终我得出了一些关于主题的想法,即使不是完美的理解。

应聘:这是我参加会谈最多的一届。我喜欢的几个演讲是:

  • **“沃尔玛的零售之旅:从商业智能到人工智能”**作者 prak har mehr otra——这是一个简短但有趣的演讲,讲述了他们如何在沃尔玛使用人工智能结合人类专业知识,以及为什么。虽然不是很详细,但它让我们得以一窥沃尔玛的经营规模,以及人工智能在他们的设置中可以解决的典型问题。
  • “如何应用自然语言处理来识别有害的在线对话?”IMRSV 数据实验室的 Isar Nejadgholi 这个演讲是关于建立一个分类器来识别网络媒体中不同种类的有害评论。对我来说,这感觉更像是一个研究报告,因为在这一点上似乎没有应用程序与之相关,但了解这种方法非常有趣。当我听说一种方法有效时,我想知道是什么方法失败了。
  • **“人工智能的可解释性:为什么它很重要,为什么它很难”**Xavier Snelgrove——无疑是本节中参与人数最多的演讲。虽然这个演讲更像是对人工智能可解释性所涉及的不同问题的概述,但幻灯片包含了足够的信息,可供进一步阅读。

**业务:我在这部分参加的唯一一个讲座是:“数据科学团队的敏捷”**作者 Jennifer Prendki(图八)。这应该是我在大会上最喜欢的演讲。自从我从学术界转到工业界后,我经常想知道、思考和阅读这个问题。虽然这次演讲没有彻底改变我的想法,也没有突然让我获得新的知识,但看到一群人在思考这个问题,感觉很好,这是会议中满座的会议之一。不过,我真的希望这篇文章能更长一些,更具体一些。

也有几个平行的小组讨论,但在我参加的那个小组讨论中,我有点走神,因为一个发言者不停地说,语气让我感到惊讶,我在一点后失去了上下文的线索。我没有参加晚上的活动和招聘会。

我喜欢 TMLS 的一些地方:

  • 我职业生涯的大部分时间是一名学者,我的大多数会议都是自然语言处理领域的研究(例如 ACL、COLING、IJCNLP 等),还有一次是一般人工智能(IJCAI-2007)。所以,我通常习惯在一个会议上看到很多研究报告。今年早些时候,我确实去参加了一个行业风格的技术会议(也是在多伦多),但每次演讲都像是推销,我在两个小时内就离开了会场。这次会议是一次全新的体验。它自始至终有三场平行会议,一场侧重于研究(演讲者主要是大学教授),一场侧重于应用工作(演讲者通常是行业专业人士),一场侧重于业务和管理方面(大多数演讲者是 C 级高管)。我想主题演讲是这三者的混合,还有一些人工智能风投的演讲,这些演讲给出了他们在投资人工智能初创公司时寻求什么的见解。**对我来说,在一个地方进行所有这些不同方面的交易还是第一次。**在这次会议之前,我就像下面这条推文中的这位研究员一样,厌倦了看着所有的 NLP 会议慢慢变成“我的数字比你的好”和“做深度学习或灭亡”的场所:

现在,在 TMLS 之后,我觉得有一个世界在关注 AI/ML 领域的其他东西,而不仅仅是数字游戏。

  • 我觉得很酷,一个七年级学生 Artash Nath 是海报展示者之一——对我来说也是第一次。
  • 我的另一个第一次经历是看到如此多的女性演讲者,其中许多人甚至是首席执行官。作为一名在科技行业工作的女性研究人员,你可以想象这对我有多重要(然而,我们在大多数会议上并没有看到这种多样性!)

一些我不喜欢的东西:

  • 我认为基调太短了。与其有这么多的主题演讲,不如有更少的主题演讲,这样会更长一些。演讲者在分配给他们的短时间内做了很好的工作来浓缩他们的知识!
  • 好像没有被记录下来。对于我们中想同时参加两个平行会议的一些人来说,这会有所帮助。我还参加过其他会议,会上的演讲视频后来都可以看到。

总的来说,这是一个很棒的会议!人们很友好,比我迄今为止参加过的任何会议都更容易接近!总的来说,他们似乎想帮助/指导该领域的年轻人,并对在加拿大建立良好的关系网感兴趣。a 一定要去,如果你在多伦多并且以前没有去过那里的话!

异常检测注意事项#2:全脂或低热量欺诈?

原文:https://towardsdatascience.com/notes-on-anomaly-detection-2-full-fat-or-low-calorie-fraud-9d3c8c084bf8?source=collection_archive---------0-----------------------

上次我概述了为什么剽窃是愚蠢的。

猜猜还有什么是愚蠢的?

数据捏造是愚蠢的。

让我们来看看具体情况。

首先,我有理由相信科学数据“造假”是相当罕见的。

我说的“欺诈”指的是老派的那种:坐在你的地下室,舔舔你的铅笔,然后记下虚构的数字,然后这些数字被表示为科学测量值。然后,好吧,你知道吗——所有那些讨厌的数字,从来没有完全表现自己,突然在正确的地方。稍微修改一下计算,直到一切都如你所愿,把它强加给某个不幸的合著者,出版。迪德里克·斯塔佩尔的方式。

在某些方面,这听起来很容易。有什么比坐在那里敲一些数据更直接(更快,更便宜)的呢?想想效率!

如果没人看见你会怎么被抓?

事实上,这很重要:

  1. 以上是一条做诈骗的烂路
  2. …所以只有白痴才会这么做
  3. …这也是欺诈检测技术主要提醒我们几乎完全是白痴存在的另一个原因。脚注 1

一个更好的欺诈方式是从实际做实验开始,然后从那里改变你需要的东西。

这是欺诈精简版。是低热量诈骗。“2%的欺诈,为了你的数字”。我就不信这不是不诚实。

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

我怀疑(但无法证明)聪明、不诚实的人知道这种情况下全脂和脱脂的区别。他们可能或明或暗地知道,或多或少,也可能被承认(“我们就是这样得到结果的”)或不被承认(“你说‘我的方法有问题’是什么意思,每个人都是这样做的”)。

但是他们知道。

出现这种情况的原因从直截了当、显而易见到反直觉都有。

伪造的 10 个理由

1。发明真实的假数据介于挑战和不可能之间——取决于具体情况
发明现实的汇总统计很难,发明现实的数据更难。数据点具有子结构、复杂的相互关系和数学含义,远远超出了作者在展示它们时可能考虑的范围。考虑 Larry Sanna 的论文——发现数据极不可能在组间的变化中没有足够的差异(即 SDs 的 SD 不可能低)。总的来说,那些肤浅到可以发明自己的结果的人没有聪明到预见到这样的事情。

2。真实的(但被篡改的)数据有一个现实的谱系,因为所有其他实验活动都正常进行。 招募受试者,测试细胞,服用药物,保存实验室笔记本,录制视频,进行测试,购买试剂,等等。实验活动的记录存在,这是很容易确定的。

“嘿,X 研究员!这是你编的吗?”天哪,不。这花了我们三年多一百万美元

斯塔佩尔面临的一个主要问题是,他无法解释他的调查数据来自哪里。他的书以一个疯狂的场景开始,在这个场景中,他在全国各地开车,试图为他之前发明的数据编造背景故事:

“所以,在一个火车站和两个大学校园之间,我的故事取得了相当大的进展。但是为什么我让自己这么为难呢?我为什么要告诉人们这项研究是在几百英里外的兹沃勒和格罗宁根进行的,而不是在离家近的地方?这是我在玩的某种游戏吗?我是不是在给自己制造困难,这样我就必须加倍努力去赢得比赛,这样我才能为我所做的感到骄傲…

这行得通吗?这仍然是一个相当奇怪的故事。一位忙碌的教授,他设计了一项研究,然后坐上自己的车,开到美国的另一端,独自在公共场所分发问卷,没有学生或研究助理。谁会相信这种事?"

作伪科学,第一章

3。欺诈性地篡改现实价值的过程与研究人员面临的合法问题非常相似。
研究人员可能经常怀疑他们完全出于善意所做的测量的真实性。放大器故障,电线交叉,环境温度变化,污染发生,病人撒谎和辍学,本科生说奇怪的事情。存在一大堆貌似合理的推脱“坏价值观”的借口。即使这种按摩是广泛和不诚实的,它也是一个必要和监管任务的近亲——确定怪异(或不方便)的数据是否代表测量误差。

4。摆弄乐器甚至不需要有意识的参与。愚弄别人和愚弄我们自己是一个令人不安的连续体
欺诈需要故意的虚假陈述——只有在最不寻常的情况下,研究人员才可能偶然捏造数据。但是如果你对结果有一个清晰的预期,有未隐藏的数据和强大的压力去产生想要的或预期的结果…好吧,你可以用各种方法从样本中排除数据点以服务于确认偏倚。“看到了吗?我早就知道这是答案!”

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

I see you, little man! You gon’ die!

5。离群值识别的实践是非标准化的,所以谁能说你“用错误的方式清理了数据”?一般来说,你可以选择你想要的任何一个。

这也表明了对方法论的更广泛的态度,尤其是在社会科学领域,量化是…我会友好地说特别。仔细看一下这个。仔细看了一下这个

6。上述报告(异常值识别)也不常见和/或不正式要求作为发布条件
大部分的科学工作都是在没有太多关于如何应用异常值剔除/“下降值”/“清理”程序的信息下发表的。我知道我总是唯一一个在我的评论中要求这些信息的学究。在我的工作中,这通常意味着有人获取心电图,然后对其进行分析,因此我的问题很简单:“这是如何清理的?移除了多少次心跳?每人使用了多少价值?你看到什么异位了吗?”

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

Bleep bloop. My life in a panel.

答案往往是:“以上都不是。我们没有看到任何错误。”

回答错误!你的意思是(a)“我的软件在我不注意的情况下进行了清理,我不知道它是如何工作的”或者偶尔(b)“我只是留下了错误的值,因为我不知道错误的值是什么样的,因此我的数据很糟糕”。

我们经常听说文件抽屉用于存放没有发现显著结果的已完成研究,但已发表研究中的不良值通常在那个抽屉中有自己单独的小隔间。有时甚至没有人知道那个隔间在那里。

7 .细节可以侵略性的掩埋。
如果你编造了不可能或有问题的汇总统计数据,你将有一段美妙的时间来解释你是如何毫不含糊地报告它们的。这么说吧:如果你说“1 加 1 等于 9”,那么没人需要看到你的数据就知道你错了。但是,如果你有真实的数据,你可以混淆和抑制。当然,当你发送数据时,你可能会发送一大堆格式不良、难以理解或难以分析的可怕数字。你可以发送一半有效的号码。

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

A priming researcher prepares a dataset for sharing.

(当然,你可以声称你想从其获取数据的人在‘恶意’操作,然后完全拒绝分享这些数据。)

8。欺诈是该隐的标志。拨弄只是淘气的男孩和女孩。
在科学领域,没有一个人有事后诸葛亮的职业生涯。

然而,“较轻的罪过”显然更易变。她的研究是可耻的业余的,但她最终学会了更好的,嗯,她可能是好的。她当然可以被救赎。但是“有一天,她决定不再伪造她的研究,道歉,现在是诚实的”……对不起,女士。糟糕的科学家会被打得鼻青脸肿,但欺诈是被禁止的。还有很长的路要走,你更有可能被推下去。

9。你和更好的人在一起。 不管结果如何,也不管出于什么原因,“捏造一点”比仅仅编造你的测量值要常见得多:Martinson (2012)报告称,“伪造或‘捏造’研究数据”比“基于直觉认为它们不准确而从分析中删除观察结果或数据点”这类恶作剧要少 30 倍左右。更令人大开眼界的是 John 等人(2012)的断言,即 62%的心理学家报告“在考虑了这样做对结果的影响后,决定是否排除数据”。

“由于操纵真实数据而导致的欺诈”和“由于移除不良观察而导致的有问题的研究实践”从哪里开始,谁也说不准。

10。编造描述性或汇总性的统计数据是危险的。编造数据令人担忧。篡改现有数据的范围从“看起来有点不确定”到几乎无法检测。** 如果你编均值、标准差/SEMs、F 值、p 值、t 值、卡方值等等,那么我们有几个选项。

首先,我们知道它们是如何组合在一起的——我们知道任何一个值是否意味着任何其他值的错误。这就是 StatCheck 所做的,它反算(从 df、p 值和测试统计数据)并匹配所述信息。简单有效。

我们首先知道(受一些限制)你的手段是否能存在。格里姆就是这么做的。同样,如果你的 SDs 和 SEM 可以存在。

如果你的均值和 SDs 可以存在,我们可以用 SPRITE 或类似的更复杂的方法重建它们的真实版本。如果你编造了一个不可能的均值/标准差对,我们很有可能发现这一点。

以上所有的问题是你不能在事后编造数据。你已经选择了不可能的参数,所以数字会直接拒绝符合它们。

结论

让我们现在完全不要担心简单的陈旧的草率和错误,而只是追求上面的逻辑结论。

欺诈不常见,而且相当愚蠢。

然而,“低热量欺诈”发生得更多,影响也更大。

这比直接捏造数据更常见,更难检测,可能是无意识的,显然对一些人来说,这感觉完全符合维护他们的自尊。我怀疑这比我们经常发现的完全胡说八道要普遍得多。

然而,我们仍然需要发现欺诈和异常检测技术,因为发现科学中的不良行为者可以做很多事情,其中之一就是产生大量公众对不良科学行为问题的关注。这不是一个好的宣传,但是像我这样的人会认为这是完全必要的,完全合理的。由于确定的数据操纵引起的高调撤回比任何安静的更正都会产生更多的烟雾。他们对证明科学出版/实践的主体已经病入膏肓,需要相当大的运作这一命题有着巨大的影响。

相信我:假设“13%的论文包含数学上不太可能的数值”,没有人会注意到这一点。如果你说“资深教授 XYZ 因为一桩令人讨厌的欺诈案而不光彩地辞职”,那么全世界都会来敲你的门。

但是,我再一次重复这一点,不要忘记欺诈检测只是找到那些真正犯了错误的人,他们并不多。

它并没有解决问题的大部分——正常的实践逐渐变成了糟糕的实践,不可复制或不可信任的工作不断被灌输到科学意识中。

**欺诈检测技术将而非解决这些问题。**他们需要文化、激励和数据管理的改变——简而言之,基础实践的改变。

  1. “欺诈检测技术主要提醒我们几乎完全是白痴的存在”…到目前为止。这并不意味着我们不在研究新技术等等。我们是。或者,至少,我是。

关于深度学习的矩阵演算的注记

原文:https://towardsdatascience.com/notes-on-matrix-calculus-for-deep-learning-b9899effa7cf?source=collection_archive---------8-----------------------

基于此 论文帕尔霍华德

深度学习是一个令人兴奋的领域,正在产生巨大的现实世界影响。本文是基于特伦斯·帕尔和杰瑞米·霍华德的《深度学习所需的矩阵演算》的笔记集。

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

深度学习都是线性代数。它是使用多层神经网络来解决复杂的问题。模型输入、多层中的神经元权重、激活函数等都可以被定义为向量。训练或利用神经网络所需的操作/转换本质上是非常并行的,同时应用于所有输入。向量/矩阵表示和可以在其上使用的线性代数运算非常适合于神经网络的流水线数据流模型。当输入、权重和函数被视为向量并且值流可以被视为矩阵上的操作时,数学变得非常简单。

深度学习也全是差异化!计算导数/用某种方法测量变化率在优化损失函数的训练阶段至关重要。从一组任意的网络模型权重 w 开始,目标是达到一组“最优”的权重,以便减少给定的损失函数。几乎所有的神经网络都使用反向传播方法来寻找这样一组权重。该过程包括确定权重值的变化如何影响输出。基于此,我们可以决定按比例增加或减少权重值。测量输出如何相对于权重的变化而变化与计算输出 w 相对于权重 w 的(偏)导数是相同的。对于所有层中的所有权重,对于所有训练示例,该过程重复多次。

矩阵微积分结合了数学的两个基本分支——线性代数和微积分。绝大多数人都是孤立地接触线性代数和微积分的。这两个话题本身就是重量级的。没有多少本科课程是以矩阵微积分为重点的。在研究反向传播等概念时,人们通常依靠直觉来弥合理解上的差距。大多数机器学习算法中的反向传播步骤都是关于计算导数和更新向量和矩阵中的值。大多数机器学习框架自己做繁重的工作,我们永远不会看到实际的导数被计算出来。然而,理解这在内部是如何工作的总是好的,如果你打算成为一个严肃的从业者或者从头开始开发一个 ML 库,这是必不可少的。

论文 则是面向 DL 从业者和编码者的,本质上是数学化的。关注符号以巩固你的理解是非常重要的。特别注意矢量的形状(长的或高的),变量是标量还是矢量,矩阵的维数。向量用粗体字母表示。未经训练的眼睛可能不会注意到粗体 f 和斜体 f 字体之间的差异,但这在试图理解等式时会产生很大的差异。矢量的形状和方向也是如此。我走了很多兔子洞,试图理解一些东西,却发现我最初对这些术语的理解是错误的。

一件好事是函数概念的定义方式(以及计算其导数的方法)从简单到复杂。首先,我们从由 f ( x )表示的简单参数的函数开始。函数和参数 x 都是标量(用斜体表示),我们可以用传统的求导规则来求 f(x) 的导数。第二,我们将会看到的这种函数通常有许多相关的变量;形式为 f (x,y,z)。为了计算这种函数的导数,我们使用相对于特定参数计算的偏导数。处理这种函数的微积分分支是多元微积分。

将输入变量 x,y,z 分组为粗体的向量 x ,我们可以将输入参数向量的标量函数表示为 f ( x )。这个域的演算将是向量演算,其中 f ( x )的偏导数被表示为向量本身,并且服从于各种向量运算。最后,对深度学习最有用的是同时表示多个这样的函数。我们用 f ( x )来表示一组形式为*f(x)的标量函数。*微积分对于这一领域是最普遍的,即矩阵微积分。

概括地说, f(x) 是标量变量的标量函数(使用简单的导数规则),而 f ( x )是矢量变量 x 的标量函数(使用矢量演算规则),而 f(x) 是许多标量值函数的矢量,每个函数依赖于一个输入矢量 x (使用矩阵演算规则)。摘要:本文演示了如何计算简单函数的导数,以及多元微积分中偏导数(∂/∂x)、向量微积分中梯度∇ f 函数、矩阵微积分中雅可比矩阵 J 之间的关系。不严谨地说,∇f(x)函数是 f 的偏导数以向量形式的集合。 f(x) 的雅可比基本上是一个个**∇f(x)的按行堆叠而成。**

在计算偏导数的过程中,本文做了一些假设。重要的是要记住这些概念最终将应用到的最终产品,即计算输出函数(y = w.x +b)和损失函数的偏导数。这篇论文通过预示它们将在哪里被使用而提供了一瞥。第一个假设是向量 x 的基数等于 f 中标量函数的个数。这就产生了一个漂亮的正方形雅可比矩阵。如果你想知道为什么它们需要相等,考虑这样一种情况,即神经元 xi 的每个输入都与一个权重 wi 相关联(这里的标量函数类似于 xiwi ),因此我们有多少个 x 就有多少个 w*

另一个重要的假设是关于元素的对角属性。基本上,该属性声明 f(x) 中的 ith 标量函数是(仅)向量 x 中的 ith 项的函数。同样,当您想到常见的神经元模式用例时,这更有意义。输入 xi 的贡献与单个参数 wi 成比例。假设基于元素的对角属性使雅可比矩阵(通过第一个假设变成正方形)成为对角矩阵,所有非对角项为零。

**本文接下来的几个部分解释了计算更复杂函数的导数的过程。函数从简单到复杂有几种方式。首先,考虑通过对两个向量(当然,大小相同)应用元素式二元运算符而得到的函数。这些是形式为 f(x,y) = **x + y,或max (x,y)的函数。注意,在这种情况下,x,y 是矢量。接下来,还有标量扩展函数,它是通过将标量乘/加到一个向量上得到的(可能会让我们中的一些人想起 Numpy 中的广播)。这种运算包括将标量“扩展”到与向量相同的维数,然后执行逐元素的乘法、加法运算。例如 y = x + b ( y,x 是向量)意味着 b 被扩展为向量 b 并逐元素添加到x

**第三,考虑将向量中的值折叠成单个值的函数。最常见的例子是计算神经网络的损失,通常形式为y=sum(f(x))。这里 y 是通过将向量 **f(x)的元素相加得到的标量值。文中计算了这三种情况的导数。有些函数可以更复杂,为此要使用导数的链式法则。本文描述了简单标量函数的链规则,并逐步将其扩展到最通用的向量链规则。

克莱姆甘笔记

原文:https://towardsdatascience.com/notes-on-the-cramer-gan-752abd505c00?source=collection_archive---------1-----------------------

以下讨论与最近的论文有关:

《克莱姆距离作为有偏瓦瑟斯坦梯度的解决方案》
https://deep mind . com/research/publications/Cramer-Distance-Solution-Biased-瓦瑟斯坦梯度/

这篇文章会有点长,所以我从一篇 TL 开始;博士首先,在大于 1 的维度上,*论文没有使用克莱姆距离!*在第五节的 GAN 实验中,使用了能量距离【1】。因此,该模型是使用特定内核的类似于[ 34 ]的生成矩匹配网络。由于能量距离是一个整数概率度量,由[ 5 提出的方案可以用于训练输入特征到内核,这比[ 3 改进了结果。我将在下面的第 1 节中对此进行解释。

总的来说,这是一个好主意,并且似乎给出了很好的生成器样本。不幸的是,Cramer GAN 的论文提出了一个有问题的近似,这意味着该算法中的 critic 不能正确地比较发生器和参考(目标)样本分布:即使发生器和参考分布非常不同,您也可以获得零 critic 损耗。我会在下面的第 2 节中解释这个问题。

提出类似想法并同时出现的论文[ 6 ]似乎也取得了不错的效果,使用了不同的(高斯)核和深度特征。论文[ 7 ]也是相关的,并没有使用[ 5 ]的优化,而是使用了方差控制方案,同样得到了很好的结果。

现在谈谈细节。

第一部分:能量距离,见证函数,梯度惩罚,核选择

论文中的批评者是能量距离【1】(在他们论文的第 5 页,作者声明,在生成多维样本 d > 1 时,他们使用能量距离,而不是克莱姆距离)。在[ 2 中显示,这个距离属于积分概率度量(IPM)家族,就像 Wasserstein 距离一样(相比之下,KL 和反向 KL 发散是 f-发散,而不是 IPM)。具体而言,能量距离是最大平均差异(MMD),首先用于训练[ 34 ]中的生成模型(这些被称为生成矩匹配网络)。如果您不熟悉 MMD,请参见下面的附录 B 获取简短介绍。IPM 公式是允许我们应用方法[ 5 ]训练 GAN 的基本属性。

积分概率度量通过寻找平滑函数(“见证函数”)来测量概率分布之间的距离,该函数最大化两种分布下的期望差异。因此,如果 P 是您的生成器样本的分布,Q 是您的参考样本的分布,那么您将寻找一个平滑函数 f,其中 E_X f(X) — E_Y f(Y)很大,其中 X 来自 P,Y 来自 Q,E_X 表示 P 下的期望值。方法[ 5 ]引入了一个惩罚,以在训练期间,在生成器和参考样本之间的点处,保持评论家见证函数的梯度接近 1。所以只要我们有了见证函数,就可以用[ 5 ]。

能量距离的见证函数是什么?为了弄清楚这一点,我们使用了内核的最大均值差异这一事实:

k(x,x’) = d(x,0) + d(x ',0) — d(x,x '),(1)

其中 d(x,x’)是 x 和 x’(见[ 2 ,定义 13],忽略 0.5 的因子)之间的距离,而“0”是原点(这实际上是中等字体中的零…),使用这个核,以及[8,2.3 节]中的见证函数的表达式,我们可以推导出等式 1 上面的见证函数 f*(x)的表达式。5 在克莱姆甘论文(否则似乎出现在哪里!).我在下面证明了这个结果(附录 A )。

正如[5]所建议的,你可以惩罚批评家损失中见证函数的梯度;或者可以使用[9]的早期“剪辑”方法,这是由[6]完成的,也工作得很好。

作者声称能量距离核可能是 GAN 训练的更好选择。我不相信这个论点:理论上

  • 尚不清楚为什么和不变性和比例不变性对于 GAN 训练是必不可少的。和不变性也适用于任何平移不变核,包括高斯核(证明很简单)!事实上,策克利和里索已经证明了能量距离的和与标度不变性,所以不清楚为什么作者在命题 3 中重复这些早期的证明。
  • 无偏梯度估计在更广的范围内是正确的,不仅仅是能量距离。在一定条件下,莱布尼茨规则意味着无偏估计量具有无偏梯度,MMD 对任何核都有无偏估计量[8]。

实验上,我也不相信这种核选择是该方法有效的主要原因,因为[6,7]使用不同的核,也获得了良好的结果([6]使用良好的旧高斯核)。另一方面,作者在他们的附录 D 中声称比高斯和拉普拉斯核更稳定的训练。可能[5]的方法是训练 MMD GAN 的关键,但是注意[6]使用削波,而[7]使用方差控制而不是惩罚梯度,因此[5]不是使其工作的唯一方法。

第二部分:批评家是不正确的

不幸的是,这篇论文做了一个有问题的近似,导致评论家不能正确地比较和匹配发电机和参考分布。这是可以解决的:[6]和[7]已经提出了不存在这个问题的方法,并且效果很好。

为了理解这个问题,可以将 x 和 x’视为来自发生器 P 的独立样本,y 和 y’视为来自参考分布 q 的独立样本,能量距离为:

D(P,Q) = E_{X,X’} d(X,X’) + E_{Y,Y’} d(Y,Y’) — E_{X,Y’} d(X,Y’) — E_{X ',Y} d(X ',Y)

其中 E_{X,X’} d(X,X ')是来自生成器 P 的两个独立样本之间的预期距离(同样,Y 和 Y '是来自参考 Q 的独立样本)。让我们来理解这是什么意思:第一项是来自生成器的两个样本之间的平均距离。第二个是两个参考样本之间的平均距离。最后两项都给出了发生器和参考样本之间的平均距离。换句话说,如果来自发生器的样本与参考样本具有相同的分布,则所有项都将相同,并将抵消,当 P=Q 时,给出的能量距离为零。

我们现在转向由评论家在 Cramer GAN 论文的算法 1 中实现的距离。从算法 1 中的评论家见证 f(x)的定义,我们看到用于评论家的预期“代理损失”是:

D_c (P,Q) = E_{X,X’} d(X,X’) + E_{Y} d(Y,0) — E_{X} d(X,0) — E_{X ',Y} d(X ',Y)

简而言之,有问题的近似是用原点 0 代替 y ’,在这一点上,批评家对 P 和 Q 之间距离的解释就失去了。很容易得出完全不同的 P 和 Q,但预期的临界损失为零。对于一个简单的一维示例,假设 P 将其所有样本放在原点,Q 将其所有样本放在距离原点 t 的位置。显然 P 和 Q 是不一样的,然而

E_{X,X’} d(X,X’) = 0
E_{Y} d(Y,0) = t
E_{X} d(X,0) = 0
E_{X ',Y} d(X ',Y) = t

所以 D_c (P,Q) = 0,批评家误以为 P 和 Q 是相同的。很难预测这个问题会在论文的图 9 和图 10 这样的复杂例子中引起什么问题,但是对于更小尺寸的简单玩具例子,很快就会发现 P 和 Q 没有正确匹配。最后,请注意[6]和[7]不做这种近似,不受影响。

参考

[1]能量距离对应于一维中的克莱姆距离,但是我们不使用 GANs 来生成一维中的样本。参见策克利和里佐在他们 2004 年的论文“测试高维中的相等分布”。

[2] Sejdinovic,d .、Sriperumbudur,b .、Gretton,a .和 Fukumizu,k .,“假设检验中基于距离的统计和基于 RKHS 的统计的等效性”,《统计年鉴》,(2013 年)

[3] Dziugaite,G. K .,Roy,D. M .,和 Ghahramani,Z. (2015 年)。基于最大平均偏差优化的生成神经网络训练。子宫活动间期

[4]李,y .,斯维尔斯基,k .,泽梅尔,R. (2015)。生成矩匹配网络。ICML

[5]古尔拉贾尼、艾哈迈德、阿尔乔夫斯基、杜穆林和库维尔(2017 年)。改进了瓦瑟斯坦·甘斯的训练。arXiv 预印本 arXiv:1704.00028。

[6]李春林、张文春、程、杨和博佐斯(2017 年)。甘:加深对矩匹配网络的理解。arXiv 预印本 arXiv:1705.08584。

[7]优素福·姆鲁,汤姆·塞尔库,费希尔·甘,https://arxiv.org/abs/1705.09675

[8]a . Gretton,k . m . Borgwardt,m . Rasch,M. J .,schlkopf,b .和 Smola,A. (2012 年)。两样本核检验。2012 年,JMLR

[9]马丁·阿约夫斯基,苏史密斯·钦塔拉,莱昂·博图,瓦瑟斯坦·甘,https://arxiv.org/abs/1701.07875

附录 A:见证函数的推导

根据[8,第 2.3 节],见证函数为(直到比例常数):

f*(x) = E_X k(x,X) — E_Y k(x,Y),(2)

其中 E_X k(x,X)表示内核相对于其参数之一的期望值,X 取自 P,Y 取自 q,将内核(1)代入第一项,我们得到:

E_X k(x,X)
= d(x,0) + E_X d(X,0) — E_X d(x,X)

上述表达式的第二项是常数。代入(2),

f*(x) = d(x,0) — E_X d(x,X) — d(x,0) + E_Y d(x,Y) + C
= E_Y d(x,Y) — E_X d(x,X) + C

其中 C 是常数,可以忽略。这给出了期望的见证函数。

附录 B:MMD 概述

最大平均差异(MMD)是两个概率分布之间距离的简单度量[8]。在 GAN 情况下,P 定义为发电机分布,Q 定义为参考分布。那么 MMD 的平方就是:

MMD (P,Q) = E_{X,X’} k(X,X’) + E_{Y,Y’} k(Y,Y’) — E_{X,Y’} k(X,Y’) — E_{X ',Y} k(X ',Y)

其中 k(x,X’)是 X 和 X’的“相似度”,E_{X,X’} k(X,X’)是来自生成器 p 的两个独立样本的期望“相似度”

我们如何解读这种距离?我们利用 k(x,x’)是一个核的事实,即 x 和 x’的特征的点积。当 x 和 x '相似时,它是大的,当它们不同时,它是小的。回到我们的 MMD 表达式,第一项是来自生成器的两个样本之间的平均相似性。第二个是两个参考样本之间的平均相似度。最后两项都给出了发生器和参考样本之间的平均相似性。换句话说,如果来自发生器的样本具有与参考样本相同的分布,那么所有的项都将是相同的,并且将被抵消,从而给出零 MMD。

MMD 是一种整数概率度量,就像沃瑟斯坦距离一样。该度量的见证函数在上面的附录 A 的等式(2)中给出。

关于使用什么内核:这是一个漫长而又传奇的问题!但是简单地说,一个众所周知的内核是“高斯”(指数平方)内核,

k(x,x’) = exp (- d (x,x’) * a)

其中 d (x,x’)是 x 和 x’之间的平方欧几里德距离,a 是宽度参数。另一个内核是情商。(1)在前面的文档中,这是用于获得能量距离的内核。这两种核都给出了有效的整数概率度量来衡量 P 和 q 之间的距离。还有许多其他选项,对于什么对 GANs 最好还没有明确的共识。

新型卡车、新型联合收割机:

原文:https://towardsdatascience.com/nouveaux-trucs-nouvelles-combines-197fea82a00c?source=collection_archive---------5-----------------------

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

让开发人员的生活更轻松的开源工具

不久前,处理数据的困难源于这样一个事实,即数据来自不同的地方,以不同的形式存在,其中大部分是非结构化的,或者充其量是半结构化的。将这些数据整理成可供分析并用于提供见解的形状是一个繁琐的过程,数据清理和准备是一个耗时的过程。我在其他地方提到过关于“大数据的肮脏小秘密”,事实是,“大多数数据分析师花费绝大部分时间清理和整合数据,而不是实际分析数据。”这个秘密也涵盖了数据分析师的需求,他们不断地去找数据库管理员和编码员,请求他们运行这个 SQL,然后“请再多问一个问题”。在最近的过去,获取数据的例行程序是重复和耗时的,人们正在做那些软件擅长的任务。问题是我们倾向于使用的软件工具没有高度的灵活性。在主要部分,由于开源应用程序,这些天的景观非常不同。

devOps

在基础架构级别,大量数据涌入,甚至逐渐增长的数据集都需要物理和手动操作,调试新服务器、添加内存、添加另一个磁盘都需要 John 拿出螺丝刀来完成。云改变了这一切,Peter 按需编程了更多的内存、更多的磁盘空间和更多的处理器。事实上,这些都不是新的,容器就像旧的 Unix 监狱一样:重要的是它们可以被使用的规模。现在有了新的技巧,可以通过新的工具组合和保存数据的方式来实现。随着时代的发展,我们现在该如何解决这些问题呢?首先,让我们看看发生了什么变化。

devOps 存在于三个域中;文化、工具和技术,以及建筑。

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

文化转变对后端工程师来说是一个巨大的飞跃。他们已经习惯了程序员使用敏捷技术,但是服务器和网络需要螺丝和电缆以及工程师来连接它们。打破系统工程师、系统管理员、操作人员、发布工程师、数据库管理员、网络工程师、安全专家和程序员、需求工程师、应用程序设计人员、测试人员、UX 设计人员之间的界限是这种文化转变的关键。

在技术领域,可用的工具和技术,如 JenkinsCodeship 提供了持续集成和持续部署。像(木偶主厨)这样的配置管理工具打开了流程编排——使手工流程自动化。一系列工具简化了部署,其中最前沿的是 DockerKubernetes

devOps 是由许多动机驱动的。来调节、繁殖和逆转。它包括:

  • 希望合理化依赖关系管理,供应和配置堆栈的所有组成部分。
  • 对可再现部署的要求,以便整个应用程序可以被擦除,然后准确地再现。
  • 创建同一应用程序的多个实例的能力,以及在资源调配期间的任何时间点从故障中恢复的能力。

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

noSQL

在数据库级别,关系数据库处理结构化数据,核心组件“模式”一旦保存了任何数量的数据,就不容易更改,毕竟模式是最重要的结构。新一代的数据存储, noSQLgraph 比 RDBMS 数据库更好地处理了非结构化数据。列品种如 CassandraHBase 文档库如 CouchDBMongoDB 。键值存储 CouchbaseRedis,Riak。以及 Neo4J 等图形数据库。

大数据的大父亲也不能错过这一考虑,即 Apache Hadoop ,它带有 Hadoop 分布式文件系统(HDFS)YARN一个作业调度器和集群资源管理器,以及 MapReduce 一个旨在处理大量数据的并行处理系统。还有许多其他的包可以和 Hadoop 放在一起。有许多供应商提供基于云的 Hadoop 平台,包括 AWS Elastic MapReduceIBM BigInsights

为什么 noSQL 是这样一个游戏改变者?它开辟了处理结构化、半结构化和非结构化数据的途径。因为能够处理多态数据;设计和配置数据存储所需的时间大大减少。灵活的结构允许快速部署。增加供应以处理高速度、快速增长的数据量和各种数据要容易得多。

在采用 noSql 数据存储之前,很难令人满意地建立和运行一个分布式数据库。复制提供了一种广泛而方便地分发只读数据的方法,但是让事务性数据分布在两台服务器上却是一场噩梦。克服主-主复制中隐含的怪物的唯一方法是分区、分段和分片,这两种技术都无法使用关系数据库实现灵活的部署。随着 noSql 数据存储在任意数量的服务器上自动写入数据,分片现在已经是小事一桩。noSql 数据存储被设计为在云中工作,被设计为灵活和敏捷,并且被设计为满足现代数据分析和交付需求。

平台

不仅仅是数据存储的变化标志着新的做事方式。平台已经发生了变化,PaaS ( 平台即服务)产品的进步极大地减轻了开发人员提供基础设施的复杂性;可扩展且廉价的云计算服务。数据库即服务 DaaS,如 Mlab 和 Googlebig query提供类似的平台和数据库功能。

AWS 使廉价的、可扩展的分布式云计算成为可能,即使界面有点混乱。过去,这鼓励编写自定义界面和例程来浏览和使用它,现在第三方供应商正在填补这一空白。对于开发环境,有“AWS made easy”产品,如 HerokuCloudFoundry 以及 AWS 上的elastic search&Kibana平台。

GoogleApp Engine是一个支持 Spring FrameworkDjango web framework 的平台(它也是软件控制的基础设施,提供了一个带有自己查询语言的 noSql 数据存储库)。

OpenStack 在某些方面针对平台提供商,因为它提供 IaaS(基础设施即服务)。 OpenShift 则是真正的 PaaS 它带有 Docker 打包和 Kubernetes 容器集群管理,它提供了应用程序生命周期管理功能和操作工具。

平台是现收现付的,你在上面运行的工具主要是开源的。选择哪个平台的问题和答案总是来自于“你想用它做什么?”。对于生产部署来说,直接管理自己的平台可能更便宜,但是在生产环境中,为开发和测试 PaaS 提供者提供实例更有吸引力。根据规模,基础架构基础 IaaS 可能是构建的起点,或者真正的平台基础 PaaS 可能是正确的选择。对于较小规模的生产环境(和开发),第三方平台托管解决方案可能更具成本效益。

一盒盒的把戏

集装箱化主要通过对建筑设计、开发策略和 PaaS 产生巨大影响的 Docker 发展成熟。Google 提供了 Google 容器引擎(GKE ),这是一个集群管理和容器编排系统,用于运行和管理 Docker 容器。反过来,它由 T2 的 Kubernetes T3 提供支持,这是为了快速部署应用程序而设计的;允许动态扩展,从而轻松推出更新并减少资源使用。

Docker / Kubernetes 组合提供的调节、复制和回滚功能涵盖了从“开发到生产”的整个领域。在本页提到的所有技术中,它们是使架构使开发运维成为可能的技术。在这个意义上,他们完成了 devOps 循环。

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

室内设计

现在我们已经看到了操作领域背后的工具和架构的变化;是时候看看开源是如何实现新的功能和能力的了。我们有了系统,我们要用它做什么,我们有了建筑,我们要把什么放进去,我们要怎么做。

理解的机器

似乎是为了锦上添花,AWS 和谷歌都提供了大量基于云的开发工具、分析、机器学习、计量计算和存储解决方案和基础设施。深度学习库,如谷歌的 TensorFlow 和雅虎的 CaffeOnSpark 已经开源。有易于部署的开源搜索解决方案,如弹性搜索Sphinx 。除了作为弹性堆栈一部分的搜索工具,还有弹性可视化工具 Kibana。其他优秀的可视化库,如 D3jJavaScript InfoVis Toolkit正等着提供见解。

开源的 Python 和 R 库使得统计分析更加容易。像 Clojure 和 Docjure 这样的语言非常适合处理提要或文档中包含的信息。简单的 API 访问机器学习技术,如 IBM 的 Watson 和 Amazons AML 现在由我们支配。其他机器学习即服务 MLaaS 包括: DataRobotBigMLRapidminerAlgorithma

除了 API 访问,还有其他利用机器学习的灵活方式。Algorithma、DataRobot 和 BigMl 提供了算法开发者和应用开发者接口的平台。开发人员可以简单地将开源学习算法整合到他们的应用程序中。这再次充分利用了开源的力量。大多数众所周知的算法都经过了同行评审,有很好的文档记录,并针对速度和效率进行了优化:它们可以在最有用的库和语言(Java、R、Python、Spark 等)中获得。).

有问题可以问,有答案可以得到。

通用语和多国语言

虽然面向对象编程语言包含了灵活性,但是诸如封装、继承、聚合、鸭式类型、后期静态绑定和动态多态性等概念使得代码变得更加灵活。这种灵活性是以速度为代价的,因为许多对象是单独创建和销毁的。这些概念在向用户、视图层或人机界面呈现逻辑的程序部分上工作得很好,但是当被调用来处理应用了逻辑的大量数据时,它们是非常低效的。

回归到更具表达性的语言和函数式编程范式,现在允许以较低的计算开销涉水通过大量数据,换句话说,有一些语言非常适合处理大量的列表和数据,是的,它们已经以这样或那样的形式存在了很长时间。

具有讽刺意味的是,跨越语言障碍的巨大转变来自于更多元语言的出现。我喜欢在 GWT 工作的想法,因为它允许我用 Javascript 做我不知道怎么做的事情。事实上,它将 Java 编译成 Javascript 看起来确实有点疯狂,但它确实允许你以自己想要的方式编写代码,也许现在这一切都有意义了。然而现在有太多的其他语言,在这个列表中有近 200 种编译成 javascript 其中有 CoffeeScriptDart

意味着栈为节点以及与之相伴的 NPM 等工具提供了一个入口,同时类似于鲍尔等其他包管理器,鼓励高效的生产管理。

在接口层面,编程库现在有了成熟的工具,如 GOReactAngular ,它们将优秀的旧 javascript 带到了新的地方。在移动前端的 JavaScript 框架上,比如 BootstrapFoundation ,通过 HTML、CSS 打理响应视图。这些创建现代网站的工具提出了一个问题我们还需要应用吗?尽管名字叫“will”进步的网络应用会让“apps”过时。如果“应用程序”仍有一席之地;苹果开源了 Swift,这是编程史上发展最快的语言之一。

由于我们现在已经掌握了使用旧技术和新兴技术的新方法,我们可以寻找新的方法来提供解决方案,以处理新的想法和数据组合。

首次发表于 XCiPi 博客上2016 年 2 月 13 日

11 月版:艺术与数据科学

原文:https://towardsdatascience.com/november-edition-art-data-science-4789c30da4ea?source=collection_archive---------21-----------------------

8 篇必读文章

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

我们当中可能很少有人没有看过一件艺术品并肃然起敬。我最近在芝加哥艺术学院时有机会体验了这一点。当我站在我一直以来最喜欢的画作之一,爱德华·霍普的《夜鹰》前时,我能感觉到这幅画散发出的原始能量包围着我,让我能与这位艺术家交流。在那次经历之后,我开始思考艺术的整体及其多种形式。

当被问及*“什么是艺术?”我总是倾向于直接把绘画、素描和摄影作为答案。但是我意识到我的定义太狭隘了。把艺术想象成任何视觉、听觉或表演的人工制品,它表达了艺术家的想象力和情感,同时在观察者身上产生了对人工制品的美和情感力量的欣赏,这就更全面了。唷!这个定义太拗口了!*

“艺术使我们能够发现自我,同时又失去自我。”—托马斯·默顿

好消息是这个新的定义为数据科学打开了艺术的世界。我们可能没有想到这一点,但是我们写的每一行代码都可能是一件艺术品!即使事实并非如此,数据科学中的不同技术已经在艺术领域得到应用。本月的版本重点探索不同艺术领域的各种技术。我们从我的旧定义开始,看看绘画、素描和照片。图像处理的用途首先是介绍如何使用深度学习来检测赝品,这使我们能够在市场上开放艺术品供应以及推荐系统。从那里,我们访问神经类型转移,长期短期记忆模型,并将其应用于二维和三维图像。为了结束图像处理部分,我们来看看如何制作生成性对抗网络来创建新颖的图像。

最后三篇文章涵盖了不同的艺术领域:音乐、电影和设计。在我们对音乐的观察中,我们探索了基于艺术家音乐特征的聚类以及对这些特征的深入比较。使用自然语言处理技术来分析电影的字幕,以帮助作者学习一种新的语言。最后一篇文章使用卷积自动编码器创建了一个室内设计搜索引擎和一个草图到图像引擎,然后应用于时装和纺织品设计。我希望你和我一样喜欢这个选择!快乐学习!

TDS 编辑助理 Andrew DeCotiis-Mauro

机器学习时代的艺术鉴赏

凯瑟琳黄 — 5 分钟阅读

作为一名数据科学新手,我对真正的数据科学家如何解决现实世界的问题很感兴趣。阅读了 Kaggles 上发布的许多挑战,我在寻找这些专家如何应对有趣比赛的见解。一个让我吃惊的挑战是“数字画家”挑战。它要求参赛者开发一个程序,可以识别同一位艺术家的画作。

用于艺术的数据科学、机器学习和人工智能

Vishal Kumar — 6 分钟阅读

数据科学、机器学习和人工智能是计算机科学中已经渗透到世界各地许多行业和公司的领域。它们的采用几乎肯定与过去十年“大数据”的兴起有关。

艺术家的人工智能

关明生·拉詹 — 12 分钟读完

艺术和技术的历史总是交织在一起的。历史上发生的艺术革命是由制作作品的工具促成的。燧石刀的精确性使得人类能够用猛犸象象牙雕刻出第一批形象艺术作品。在当代,艺术家使用从 3D 打印到虚拟现实的工具,拓展了自我表达的可能性。

神经网络和 3D 程序内容生成的未来

由山姆·施奈德手持 — 8 分钟读取

作为全球制作机构 MediaMonks 的一名创意技术专家,人们总是问我关于人工智能、人工智能、神经网络等方面的问题。它们是什么?他们能做什么?我们如何使用它们?

甘戈:与甘戈一起创造艺术

肯尼·琼斯 — 13 分钟阅读

我们本学期学习 GAN 的主要动机是试图将 GAN 衍生的模型应用于小说艺术的生成。深度学习中与艺术生成相关的许多工作都专注于风格,特别是特定艺术作品的风格。

Spotify 的“这是”播放列表:50 位主流艺术家的终极歌曲分析

由詹姆斯·勒 — 15 分钟阅读

每个艺术家都有自己独特的音乐风格。从献身于木吉他的艾德·希兰,到精通说唱艺术的德雷克。从能在流行歌曲中唱一些疯狂高音的阿黛尔,到在 DJ 台上创造 EDM 魔术的 Kygo。音乐是关于创造力、独创性、灵感和感情的,它是跨越差异连接人们的完美门户。

Leuk Taal:通过数据科学(和艺术)学习一门新语言

拉斐尔·皮埃尔 — 8 分钟阅读

当我开始学习荷兰语时,我惊讶地发现这种语言反映了荷兰人是多么的直接和客观。你很少会看到一个荷兰人为了掩饰而制造借口或修饰,或者假装喜欢某样东西或某个人。

des . ai . gn——用人工智能增强人类创造力

由诺曼·迪·帕洛 — 6 分钟读完

人工智能和计算机科学讨论最多的一个方面是机器****是否有创造力**。这个讨论和第一台计算机一样古老,但是最近来自生成性对抗网络和类似架构的惊人结果确实使这个讨论变得更大。**

我们也感谢最近加入我们的所有伟大的新作家,杰瑞米·s·科恩罗伯特·桑德尔德米特里·斯托罗申科克里斯·鲍拉塔马马克斯·盖尼斯法比奥·内维斯斯泰西·罗纳根比利·惠伦萨提亚·努格拉我们邀请你看看他们的简介,看看他们的工作。

11 月版:语音识别

原文:https://towardsdatascience.com/november-edition-speech-recognition-27159b2c44f5?source=collection_archive---------4-----------------------

6 篇必读文章

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

通过 Tensorflow 识别声音来检测蝙蝠

罗兰梅尔滕斯 — 10 分钟阅读。

上周我发现我的公寓后面有蝙蝠。我立即抓起我的“蝙蝠探测器”:一种将蝙蝠用来回声定位的超声波信号从听不见的频率范围转换成听得见的频率范围的装置。

你现在能听到我吗?远场语音

Jerry Lu — 9 分钟读完。

在这篇文章中,我将研究价值链的第一步,语音信号的最初拾取,并找出创业公司可以成功的机会。

教程:Python 中的异步语音识别

通过 Pres Nichols — 5 分钟读取。

一个(相当)简单的技术,用于使用 Google 有点儿有点儿令人困惑的语音识别 API

tensor flow 中的音频处理

由达里奥·卡扎尼 — 6 分钟读完。

在这篇文章中,我们将解释我们如何实现它,并提供代码,以便短时傅立叶变换可以在计算图中的任何地方使用。

语音识别:懒狗入门

由卢西恩·利塔 — 8 分钟读完。

我和一个好朋友最近在吃饭时聊起了语音识别应用。没错,我们就是那些人。隔着一张桌子,刻板的极客们对技术、创业和变革变得兴致勃勃。

用 cleanNLP 分析关于难民的公共话语

汉娜韩嫣 — 3 分钟阅读。

继上一篇文章之后,我将分析联合国难民署演讲中以行动为导向的话语,并使用 r。

我们也感谢最近加入我们的所有伟大的新作家,基里尔·叶列缅科桑吉夫·阿格拉瓦尔拉塞尔·朱尔尼费利克斯·莫尔塔库马·塞诺马克西姆·扎克斯海蒂·沃特豪斯乌戈·库普契奇卡德·基拉里塞巴斯蒂安·金特罗我们邀请你看看他们的简介,看看他们的工作。

现在我们可以理解由深度神经网络创建的图像

原文:https://towardsdatascience.com/now-we-can-understand-images-created-by-deep-neural-networks-506d0f8456dc?source=collection_archive---------7-----------------------

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

与深度神经网络(DNNs)相关的高度先进的算法的兴起,导致了创建计算机生成的图片的能力,这些图片没有告诉人眼机器制作的细节。

人们正确地指出了这个问题的潜在安全风险。然而,科学家设计了一种方法来理解这些照片。

采取措施实现更好的图像分类

深圳大学的一个研究小组开发了一个系统,该系统利用一系列特征对真实图像和生成的敌对网络(GAN)制作的图像进行分类。它着眼于真实图像和生成图像之间颜色成分的变化。

科学家们意识到,统计差异的存在取决于一个人是传统地捕捉图像——比如用相机——还是主要使用计算机来制作最终产品。

他们的研究显示,DNN 生成的图像在特定的色彩空间——图片中定义的色彩范围——看起来不同。

检查颜色统计的差异

具体来说,他们发现这两种图像在 RGB 颜色空间看起来很相似,但在 HSV 和 YCbCr 颜色空间没有统计上的相似性。

该团队在三个图像数据集上测试了他们的理论,以证实他们发现的有效性。

这些实验验证了将颜色分量特征集与二元分类器相结合允许在 GAN 样本在手时辨别两种图像之间的差异。并且,如果用户不知道 GAN 模型是否存在,他们可以使用具有一类分类器的相同特征集。

二元分类器在机器学习领域很常见。然而,如果一个数据类有大量的数据,这样的分类器可能不能充分执行,使单类分类器更合适。

在他们研究论文的摘要中,该团队解释说,当区分真实照片和深度网络生成的(DNG)照片时,他们的方法给出了高度准确的结果

竞争 dnn 如何帮助图像变得更真实

一种称为深度卷积生成对抗网络的学习架构使用两个 dnn 来生成越来越真实的图像

一个 DNN 制作图像,而另一个 DNN 检查图像的质量并发回报告,第一个 DNN 使用该报告来改进未来的性能。这些系统创造出高度逼真的艺术作品和其他高度细致的作品,证明了技术的能力。然而,深圳大学的研究人员表示,他们的工作表明,计算机还不能在真实图像中产生几种颜色属性。

人类无法检测到计算机创建的图片,但由于团队的工作,机器学习可以。科学家强调这项研究只关注一种属性。因此,未来的工作可以着眼于其他特征。然后,从事机器学习的其他人可能会更加熟悉使计算机生成的图像不同于真实事物的因素。

dnn 通常模仿 RGB 图像

在完整发表的研究论文中解释这项工作时,作者说 DNNs 通常模仿 RGB 颜色空间中的图片进行模仿。

然而,研究人员分辨图像之间差异的方法也可以改进计算机生成的图片。他们说,未来的工作应该检查与 DNG 图片相关的其他图像限制。

使得图像有效性更加可靠

人们常说,有些事情要亲眼看到才会相信。

不幸的是,在这个图像生成技术如上文所述的时代,人们很容易看到伪造的图像,并将它们误认为是真正的文章。

然而,这项新的研究带来了增强的检测方法,这可能有助于维护声誉。

例如,一家受人尊敬的报纸可能会雇用一名数据科学家,在向全世界发布图像之前,使用上述技术检查图像。或者,一家公司可能会在与员工会面讨论一张可能导致失业的照片之前做同样的事情。

技术意味着个体不一定能相信自己看到的每一个图像。

但是,来自深圳大学的科学家们帮助推动了大数据的发展,并推动了机器学习的进步,这些进步可以应用于各种工作,并减少了图像的表里不一。

图片由 Pixabay 组成

裸体检测和滥用内容分类器—研究和使用案例

原文:https://towardsdatascience.com/nudity-detection-and-abusive-content-classifiers-research-and-use-cases-d8886bf624e8?source=collection_archive---------6-----------------------

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

Web 2.0 革命导致互联网上每天产生的内容爆炸式增长。社交分享平台,如脸书、推特、Instagram 等。他们的每日活跃用户数量增长惊人,但在监控用户生成的内容方面却一直处于分裂状态。用户在评论帖子时上传不适当的内容,如裸体或使用辱骂性语言。这种行为会导致欺凌和报复色情等社会问题,也会妨碍平台的真实性。然而,如今在线生成内容的速度如此之快,以至于几乎不可能手动监控所有内容。在脸书上,每 60 秒钟就有 13.6 万张照片被上传,51 万条评论被发布,29.3 万条状态被更新。在 ParallelDots,我们通过机器学习解决了这个问题,建立了一个算法,可以以非常高的精度对裸照(裸体检测)或辱骂内容进行分类。

在我们之前的一篇博客中,我们讨论了我们的文本分析 API 如何识别 twitter 上的垃圾邮件和机器人账户,并防止他们在 Twitter 分析中添加任何偏见。添加了另一个重要的内容审核工具,我们发布了两个新的 API——裸体检测 API 和滥用内容分类器 API。

裸体检测分类器

**数据集:**从不同的网站抓取裸照和非裸照建立数据集。我们从不同的裸体图片论坛和网站抓取了大约 200,000 张裸体图片,而非裸体人体图片则来自维基百科。因此,我们能够建立一个巨大的数据集来训练裸体检测分类器。

**架构:**我们选择了 2016 年何等人提出的 ResNet50 架构的分类器。从互联网上抓取的数据集被随机分为训练集[80%]、验证集[10%]和测试集[10%]。在训练集上训练的分类器和在验证集上调整的超参数的准确率略高于 95%。

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

滥用内容分类器

**数据集:**与裸体检测分类器类似,滥用分类器的数据集是通过从互联网(特别是 Twitter)收集滥用内容来构建的。我们确定了某些与辱骂性和攻击性语言相关的标签,以及其他与非辱骂性语言相关的标签。这些推文被进一步人工检查,以确保它们被正确分类。

架构:我们使用长短期记忆(LSTM)网络来训练滥用分类器。LSTMs 将句子建模为基于上下文的遗忘-记忆决策链。通过在 Twitter 数据上训练它,我们给了它一种能力,让它能够理解含糊不清、写得很差、充满微笑和拼写错误的推文,仍然能够理解内容的语义,并将其归类为辱骂。

让分类器发挥作用:内容审核的用例

辱骂内容和裸体检测分类器是从社交媒体源、论坛、消息应用等中过滤出此类内容的强大工具。在这里,我们将讨论这些分类器可以发挥作用的一些用例。

用户生成内容的提要

如果你拥有一个手机应用程序或网站,用户可以在上面积极地发布照片或评论,你将很难保持订阅源没有辱骂内容或裸照。当前让用户标记这些内容的最佳实践是一项不可靠且耗时的任务,需要一个人工版主团队来检查每个标记的内容并采取相应的行动。在此类应用上部署滥用和裸体检测分类器可以提高您处理此类内容的响应时间。一个完美的场景是,系统会将内容标记为不适当,并在内容进入公共提要之前提醒其中一个版主。如果版主发现内容被错误地归类为裸体检测或辱骂(误报),她可以授权内容上线。这种机器增强的人类审核系统可以确保您的订阅源没有任何不适当的内容,并且您的品牌声誉保持完整。

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

论坛审核

最大的互联网发明之一是以观点、评论、问答等形式动态生成内容的能力。在论坛上。然而,这样做的一个缺点是,这些论坛经常充斥着垃圾邮件和辱骂性的内容,导致诸如欺凌等问题。在许多这样的论坛中,隐藏在匿名墙后面的这些内容会对青少年和学生造成灾难性的影响,常常导致自杀倾向。使用滥用分类器可以帮助你的论坛所有者缓和的内容,并可能禁止重复犯罪者的用户。

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

评论审核

类似于论坛审核,人们可以使用滥用分类器来保持博客的评论部分没有任何滥用内容。所有新闻媒体网站目前都在努力保持其内容的安全和不被滥用,因为它们涵盖了不同的争议话题,如移民、恐怖主义、失业等。保持评论区没有任何滥用或攻击性的内容是当今每个新闻出版商的首要任务之一,滥用分类器可以在打击这种威胁方面发挥重要作用。

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

众包数字营销活动

依靠众包内容的数字营销活动已被证明是一种非常有效的策略,可以推动品牌和消费者之间的对话,如 Dorito 的“粉碎超级碗”比赛。然而,消费者在这种竞赛中上传的内容必须被仔细监控,以保护品牌声誉。手动验证每个提交的内容可能是一项繁琐的任务,ParallelDots 的裸体检测分类器可用于自动标记裸体和辱骂内容。

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

过滤数字广告中的裸露内容

随着数字内容创作的爆炸式增长,广告交换越来越受欢迎,并且仍然是大多数博客、论坛、移动应用等的唯一盈利来源。然而,另一方面,有时主要品牌的广告会出现在含有裸露内容的网站上,损害了它们的品牌声誉。在一个例子中,农民保险的广告在一个叫 DrunkenStepfather.com 的网站上提供,这主要归功于基于交换的广告购买的增长。该网站的标语是“我们喜欢和漂亮的女孩一起玩”,并不适合投放农民保险广告。

广告交易所和服务器可以集成 ParallelDots 的裸体检测分类器 API,以识别裸体图片出版商或广告商,并在广告滚雪球般变成公关危机之前限制广告投放。

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

如何使用裸体检测分类器?

ParallelDots 的裸体检测分类器可以作为 API 与现有应用程序集成。该 API 接受一段文本或一幅图像,并实时地将其分别标记为滥用内容或裸露内容。上传一张图片这里直接在浏览器里试试裸体检测 API。此外,检查滥用内容分类器演示,这是可用的这里。深入研究 API 文档中的裸体检测和滥用内容分类器,或者查看 GitHub repo,以您选择的语言开始使用 API 包装器

两个分类器都会为传递给它的内容计算一个 0 到 1 的分数。1 分意味着该内容最有可能是辱骂性的或裸体的,而接近 0 分意味着该内容可以安全发布。

parallel dots AI API,是由 ParallelDots Inc 提供的深度学习支持的 web 服务,可以理解大量的非结构化文本和视觉内容,为您的产品提供支持。您可以查看我们的一些文本分析API和视觉智能API,并通过填写此处的表格或在 apis@paralleldots.com 给我们写信来联系我们。

用 Supervisely 和 Tensorflow 进行车牌检测(上)

原文:https://towardsdatascience.com/number-plate-detection-with-supervisely-and-tensorflow-part-1-e84c74d4382c?source=collection_archive---------0-----------------------

深度学习现在被广泛使用。神经网络在计算机视觉任务中有许多有趣的应用。本教程将向您介绍如何用supervisoryTensorflow 轻松构建车牌检测系统。

如果你没有听说过超级监管,你可以在我们的介绍帖子中了解更多。

本分步指南由两部分组成:

  • 第 1 部分:在人工生成的数据上训练神经网络。
  • 第 2 部分:在真实数据上微调神经网络。

所有资源都可以在 github 获得。

什么是超级监管?

每个数据科学家都知道什么是 Tensorflow 。几天前,我们在 Deep Systems 的团队发布了supervised,让开发者和研究人员更容易处理训练数据集。

现有技术的神经网络架构有许多开源实现。但是深度学习模型非常“数据饥渴”。

“深度学习算法有许多参数需要调整,因此需要大量数据,以便提出某种程度上通用的模型。因此,从这个意义上说,拥有大量数据是为这些方法提供良好训练集的关键。”

Quora 工程副总裁 Xavier Amatriain。

众所周知,在大多数情况下,数据科学家将大部分时间花在训练数据准备上:

  • 创建私有数据集
  • 将它们与不同格式的几个公共数据集合并
  • 添加各种数据扩充

而他在做这些的同时,很大概率会犯很多错误,或者在数据准备过程中做错一些事情。

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

Source: http://dilbert.com/strip/2014-05-07

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

Source: https://9gag.com/gag/aDoBnGK

超级解决这些问题。它提供了最佳的简单性和性能—它是一个基于 web 的框架,允许导入所有最著名的公共数据集,使用集成的注释工具创建自己的数据集,使用各种数量的扩展将数据集合并和导出为不同的格式等等。

在本教程中,我们将向您展示如何使用 Supervisely 来解决现实世界中的车牌检测任务。

预览训练数据

用真实数据创建大型特定任务数据集几乎总是既困难又昂贵。通常的做法是在可能的情况下生成人工数据集。

幸运的是,我们可以为我们的任务做到这一点。出于教学目的,我们生成了 10k 图像数据集,在带有噪声、小旋转和不同比例的随机背景上带有号码牌。为了简单起见,我们将使用灰度图像。这个数据集可以在 Supervisely 的数据集库中免费获得。

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

Here are the few examples of artificially generated images with number plates.

要开始使用该数据集,请创建登录进入 Supervise.ly 账户。

注册后,您将在您的帐户中看到以下内容:

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

要开始使用“牌照”数据集,请单击“导入”选项卡,然后单击“数据集库”子选项卡。在此页面上,您可以看到可用现成数据集的列表(该列表将被积极丰富)。

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

让我们点击“车牌”数据集。下一步是为创建的项目键入名称。姑且称之为“Anpr 教程”:

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

然后点击“下一步”按钮。选择所有复选框,然后单击“上传”。

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

您将被重定向到任务列表。从数据集库中导入数据集的任务将在几秒钟内完成。

现在你可以点击主菜单中的“项目”标签。你会看到项目“Anpr 教程”(左图)里面有单个数据集“人造的”(右图):

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

单击数据集打开注记工具。下面的 gif 展示了注释器工具的一些功能。在本教程中,我们将只使用它来预览图像。

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

所以。现在我们有一个数据集的帐户和项目。在我们进行模特训练之前,只剩下一步了。我们应该导出这个数据集。

导出培训数据

在我们开始之前,让我说几句关于数据集导出功能的话。当我们设计神经网络时,我们从计算图的角度来考虑它。这是流行的深度学习框架背后的核心抽象。计算图由数学运算和变量组成。

我们开发了强大的数据集导出工具,该工具提供了用计算图形配置导出的可能性。我们可以定义将应用于所选数据集中每个图像的操作顺序。

只需单击主菜单中的“导出”选项卡,然后将 json 配置(如下所示)粘贴到文本框中。

[
  {
    "dst": "$sample01",
    "src": [
      "Anpr tutorial/artificial"
    ],
    "action": "data",
    "settings": {
      "classes_mapping": {
        "Licence plate": "plate"
      }
    }
  },
  {
    "dst": "$sample_bb",
    "src": [
      "$sample01"
    ],
    "action": "bbox",
    "settings": {
      "classes_mapping": {
        "plate": "plate_bbox"
      }
    }
  },
  {
    "dst": [
      "$sample_train",
      "$sample_test"
    ],
    "src": [
      "$sample_bb"
    ],
    "action": "if",
    "settings": {
      "condition": {
        "probability": 0.98
      }
    }
  },
  {
    "dst": "$train_tagged",
    "src": [
      "$sample_train"
    ],
    "action": "tag",
    "settings": {
      "tag": "train",
      "action": "add"
    }
  },
  {
    "dst": "$test_tagged",
    "src": [
      "$sample_test"
    ],
    "action": "tag",
    "settings": {
      "tag": "test",
      "action": "add"
    }
  },
  {
    "dst": "artificial_samples",
    "src": [
      "$train_tagged",
      "$test_tagged"
    ],
    "action": "save",
    "settings": {
      "images": true,
      "annotations": true
    }
  }
]

系统会自动在右侧生成这样的图:

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

让我们看一下我们的例子。蓝框是数据变量,紫框是操作。关于所有可用导出层的详细说明,您可以在这里找到。

在本例中,我们从项目“Anpr 教程”的数据集“人造”中获取图像。此数据集的所有标注都是多边形,因此我想将它们转换为边界框。在这种情况下,它并不重要,但在其他教程中,例如,当我们从 Cityscapes 数据集导出汽车和行人周围的边界框时,它将非常有用(所有注释都显示为多边形)。

然后我们分割数据集进行训练和测试。每个图像以 98%的概率落入训练集中。此后,所有训练图像将保存为标签“测试”,所有测试图像-标签为“测试”。

好吧,让我们点击“开始导出”按钮。您将被重定向到包含导出任务的页面。等待几秒钟,直到“人工样本”任务完成。

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

现在,您可以单击“三点”按钮或“下载”图标,下载包含培训/测试图像和注释的结果档案。

该档案的结构如下:

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

让我们看看它是什么。整体存档是项目,“Anpr 教程 _ _ 人工”是数据集。“img”目录包含图像,“ann”目录包含 json 格式的每个图像的注释。

训练模型

需求:安装了 GPU 和 docker 的电脑。

首先,我们应该通过键入以下命令来克隆教程存储库:

git clone [https://github.com/DeepSystems/supervisely-tutorials.git](https://github.com/DeepSystems/supervisely-tutorials.git) && cd supervisely-tutorials/anpr

之后,将下载的数据集提取到“数据”目录。您应该得到以下“数据”目录结构:

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

现在让我们转到“docker”目录。它包含 Dockerfile 和两个用于构建映像和运行容器的脚本。在“anpr/docker”目录中运行以下命令:

./build.sh
./run.sh
# now you are inside the container.
jupyter notebook

“jupyter notebook”命令的输出如下:

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

只需复制最后一个链接并粘贴到浏览器。您链接中的令牌将与我的不同。在您的浏览器中,您将看到:

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

我们打开“experiment1.ipynb”吧。点击“单元格->全部运行”。该示例将:

  • 加载所有训练和测试数据
  • 可视化一些带有注释的随机图像
  • 训练神经网络并保存到“数据/模型 _artif”
  • 加载模型并在随机测试图像上进行测试
  • 随机训练图像上负载模型和测试

单元格[12]的输出如下。它只是可视化一些随机图像及其来自训练集的注释。

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

然后模型训练 20 个纪元。输出应该是这样的:

Epoch: 0, Score: 632.081665, Epoch per minute: 0.000000
Epoch: 1, Score: 0.031625, Epoch per minute: 7.076456
Epoch: 2, Score: 0.020695, Epoch per minute: 7.555644
Epoch: 3, Score: 0.015778, Epoch per minute: 7.724735
Epoch: 4, Score: 0.011812, Epoch per minute: 7.804142
Epoch: 5, Score: 0.007921, Epoch per minute: 7.864671
Epoch: 6, Score: 0.005887, Epoch per minute: 7.877275
Epoch: 7, Score: 0.003385, Epoch per minute: 7.888540
Epoch: 8, Score: 0.002968, Epoch per minute: 7.895694
Epoch: 9, Score: 0.002555, Epoch per minute: 7.902217
Epoch: 10, Score: 0.002133, Epoch per minute: 7.925616
Epoch: 11, Score: 0.001715, Epoch per minute: 7.935624
Epoch: 12, Score: 0.001581, Epoch per minute: 7.936112
Epoch: 13, Score: 0.001396, Epoch per minute: 7.969603
Epoch: 14, Score: 0.001210, Epoch per minute: 7.999257
Epoch: 15, Score: 0.001140, Epoch per minute: 8.019996
Epoch: 16, Score: 0.001603, Epoch per minute: 8.059043
Epoch: 17, Score: 0.001414, Epoch per minute: 8.080978
Epoch: 18, Score: 0.001150, Epoch per minute: 8.102449
Epoch: 19, Score: 0.001129, Epoch per minute: 8.097572
Epoch: 20, Score: 0.001273, Epoch per minute: 8.128981
Epoch: 21, Score: 0.001324, Epoch per minute: 8.141784
Epoch: 22, Score: 0.000929, Epoch per minute: 8.133494
Epoch: 23, Score: 0.001333, Epoch per minute: 8.143423
Epoch: 24, Score: 0.000930, Epoch per minute: 8.146000
Epoch: 25, Score: 0.000900, Epoch per minute: 8.138766
Epoch: 26, Score: 0.000948, Epoch per minute: 8.148882
Epoch: 27, Score: 0.000853, Epoch per minute: 8.138941
Epoch: 28, Score: 0.001174, Epoch per minute: 8.148271
Epoch: 29, Score: 0.000871, Epoch per minute: 8.154097
Epoch: 30, Score: 0.000740, Epoch per minute: 8.143948
Finished in 221.023122 seconds.

之后,加载保存的模型并预测随机测试图像的边界框。这里我们可以看到模型做得很好。

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

让我们看看随机列车图像上的模型预测。该模型完美地预测了火车图像的包围盒。

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

我希望你一切顺利。如果没有,欢迎在评论中提问。

现在,我们来详细看看一些脚本部分。我想简要讨论两个关键时刻:

  • 我如何处理来自主管的培训数据
  • 神经网络体系结构

在接下来的教程中,了解注释格式将非常有用。对于每个图像,我们都有 json 文件。这里有一个例子:

{
    "name": "00009975_H314CO08",
    "tags": [ ],
    "objects": [
        {
            "classTitle": "plate",
            "description": "",
            "tags": [
                "H314CO08"
            ],
            "bitmap": *null*,
            "points": {
                "interior": [ ],
                "exterior": [
                    [
                        32,
                        24
                    ],
                    [
                        32,
                        40
                    ],
                    [
                        95,
                        40
                    ],
                    [
                        95,
                        24
                    ]
                ]
            }
        }
    ],
    "size": {
        "width": 128,
        "height": 64
    }
}

这个 json 文件只包含一个 json 对象。现在,我将向您解释一些字段:

  • 【名称】:对应的图像名称
  • “标签”:图像标签(字符串数组)。
  • “size”:以像素为单位的具有图像“宽度”和“高度”的对象。
  • “objects”:给定图像的注释数组。

注释对象的字段:

  • “classTitle”:对象类名。它本教程我们只有一个类,它是“板”。但是在我们的其他教程中,你将使用多个职业。
  • “tags”:给定对象的字符串标记数组。在这里我们可以看到,我存储地面真相号码牌文本有机会在未来做光学字符识别。
  • “点”:具有两个字段的对象。管理存储特定格式的对象。“外部”场是对象的外部轮廓。“内部”场是孔轮廓的阵列。

现在是讨论神经网络架构的好时机。这个网很小,但它可以很容易地检测出我们任务中的车牌,而且质量很好。此外,该模型速度非常快,可以在嵌入式设备上使用。

下面是网络计算图的示意图:

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

模型非常简单:它是基本卷积、relu 和池操作的序列,最后是几个完全连接的层。模型预测车牌包围盒的坐标。

结论

在这部分教程中,我们已经向您展示了如何使用 Supervisely 和 Tensorflow 轻松构建车牌检测系统。我们使用人工生成的数据来训练简单但有效的神经网络。

在本教程的下一部分,我们将在真实数据上微调我们的模型。这种两阶段训练是深度学习研究人员的常见做法。

详细讲解如何使用 Supervisely 进行训练数据准备,有助于我们在以后的教程和日常工作中进行数据处理。

欢迎在评论中提出任何问题,并订阅我们的博客。我们将定期添加新的教程和最新神经网络架构的解释。

谢谢大家!

数值积分:龙贝格积分

原文:https://towardsdatascience.com/numerical-integration-romberg-integration-3f54002ab538?source=collection_archive---------3-----------------------

使用数值方法积分

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

我欣赏这种整合的概念,主要是因为在我们在课堂上讨论的方法中,这是唯一一种考虑消除其错误的方法。虽然不是全部,但淘汰真的很有帮助。

首先,让我们也用自顶向下的方法来处理这个问题。我们一般先讨论数值积分,然后再讨论龙贝格积分。

数值积分

历史背景

要得到名字背后的原因,这个是需要的部分。

数值积分也被称为“数值积分”或“定积分的数值逼近”。它的名字来自古代计算曲线图形面积的方法,其中最著名的是“圆的平方”问题,这意味着找到一个与给定圆面积相同的正方形。

主要动机

顾名思义,数值积分就是对一个函数进行积分。然而,我们不是已经会积分了吗(还记得数学 50 系列)?对,但也要记住,我们用公式来积分,并不是所有必须积分的函数都可以用这些公式来积分。他们只是普通的特例。

通过公式不可积分的积分的例子有:

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

它们可能看起来很简单,不像拥挤积分那样疯狂,但是它们仍然超出了我们以前学过的特殊公式的范围。

假设和答案的性质

我们设定假设,所以我们不会一次又一次地讨论它们。还有,答案的本质,明确我们应该期待什么样的答案。

假设:

  1. 一般认为积分的区间是有限的
  2. 在很大程度上假设被积函数‘f’是连续光滑的

答案性质:“我们寻求单一数字的答案”

这意味着我们不是在寻找一个函数或者一个符号公式。这将数值求积与微分方程的解、不定积分的计算以及许多符号计算的软件包区分开来。

最后一件事之前,移动过渡到龙贝格。众所周知,积分是一个无穷和。我们在这里做的是用一个有限和来逼近一个无限和。

现在我们过渡到龙贝格。

假设在跳到这里之前,已经掌握了复合梯形法则的知识。尽管我们在下面讨论另一个先决条件。

先决条件:理查森推断

主要思想

Richardson 外推法主要是一种提高某些数值方法精度的简单方法。这个可以消除错误。虽然它只能消除以下形式的错误:

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

理查森外推一般形式的推导

这一部分将说明如何通过理查森外推法消除误差。

假设:

  1. 我们有一个近似的方法来计算某个量 G
  2. 结果取决于参数“h ”,因此 g(h)的近似值由下式给出:G = g(h) + E(h)

正确推导:

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

方法:龙贝格积分

既然我们已经建立了先决条件,让我们进入主要的事情。

龙贝格整合

龙贝格积分法结合了复合梯形法则和理查森外推法。

下面是集成过程的概述:

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

这正是我们正在做的

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

这告诉我们,我们需要计算两个箭头从哪里来,来计算两个箭头指向哪里。积分的最精确估计总是数组的最后一个对角线项。这个过程一直持续到两个连续对角线项之间的差变得足够小。

以上概述可以总结为公式:

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

  • CTR 的意思是复合梯形法则

用 Romberg 积分求积分

放下所有需要的工具后,我们展示如何使用它们。我们先给出一个例子,然后我们给出建议的一般过程

举例:

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

首先,我们得到所有的工具(公式):

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

然后我们得到了上面的矩阵 R,因为这是我们将要填写的

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

一般流程

因此,我们实际上可以看到建议的解决方案模式。我们总结如下:

**挑战:**使用龙贝格积分计算积分

**需要公式:**复合梯形法则和龙贝格

流程:

提示:拿着另一张包含矩阵 R 的纸

  1. 计算 h
  2. 使用 CTR 计算前两行的第一列
  3. 对于 i>1,使用 Romberg 公式计算该行中的下一列
  4. 对每一行重复步骤 1-3,直到它收敛到所需的解决方案。

总的来说,

数值积分只是积分的近似,对于不能用特殊公式计算的积分是有用的。其中一种方法是龙贝格积分。从课堂上教授的方法中可以看出,这是通过使用 Richardson 外推法消除误差的唯一方法(尽管不是所有误差都被消除),如推导中所示。

尽管复合辛普森的 1/3 规则胜过复合梯形规则和 Rombeg,但 Romberg 仍然保持着高效的王牌,并且还采用了复合梯形规则的稳健性。

数值插值:自然三次样条曲线

原文:https://towardsdatascience.com/numerical-interpolation-natural-cubic-spline-52c1157b98ac?source=collection_archive---------2-----------------------

探索分段插值的强大功能

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

Photo by Mitchell Luo on Unsplash

当我第一次听说这个方法时,我被它迷住了,尤其是它的推导过程。这篇文章将向你展示我是如何破解它并使它变得更简单的。我们将使用自上而下的方法,确保你在阅读的时候能够更好地理解它。

数值插值

简而言之,它要求:

我们如何使用一个函数来拟合所有这些数据点呢?

我们所指的函数也叫做插值函数插值函数

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

插值、近似和曲线拟合之间的区别

插值通常与逼近和曲线拟合相混淆。它们之间差异的关键在于它们与数据的吻合程度以及使用的适当性。

插值与逼近

在插值中,你精确地拟合所有的数据点,而近似,顾名思义,就是近似

就适当性而言,内插法适用于平滑此类噪声数据,而不适用于数据点易受实验误差或其他重大误差源影响的情况。拥有大量数据点也会增加插值的负担。另一方面,近似主要适用于计算特殊函数的库例程的设计。这是由这些函数的性质决定的——精确的值被认为是不重要的,并且在某种程度上,当近似值起作用时是低效的。

插值与曲线拟合

在曲线拟合中,我们不会拟合所有的数据点。这就是为什么我们有残差的概念。在插值中,它强制函数拟合所有数据点。

现在我们知道我们在谈论哪一类,让我们缩小到用于插值的函数族。

用于插值的函数族

(2)这里考虑的两个函数族:

  1. 多项式内插法
  2. 分段插值

扰流板:自然三次样条正在进行分段插值。但是让我们稍后解释这两种方法来欣赏它们。

1。多项式插值

多项式插值是最简单也是最常见的插值类型。它的一个特点是总是有一个最多 n-1 次的唯一多项式通过 n 个数据点。

有许多方法来计算或表示一个多项式,但它们归结为同一个数学函数。一些方法是单项基,拉格朗日基和牛顿基。正如你所注意到的,它们是以它们的基础命名的。

弊端:

  1. 高次多项式→适当选择基函数和插值点可以减轻与高次多项式相关的一些困难
  2. 过度拟合→将单个多项式拟合到大量数据点,这可能会在插值函数中产生不令人满意的振荡行为

随着不同方法的诞生,分段插值解决了这些复杂问题。

2.分段插值

分段插值通过用低次多项式拟合大量数据点来解决这些问题。由于我们只使用低次多项式,我们消除了过度的振荡和不收敛。

**一般概念:**给定一组数据点,在每个区间使用不同的多项式,这样我们在连续的点上插入几个插值。这就是为什么会有诸如结、断点或控制点之类的术语——这些是插值函数从一个多项式变为另一个多项式的横坐标。

**主要关注:**似乎牺牲了插值函数插值的光滑性,使得图形可能有“拐角”,这意味着导数在这些点处是不连续的。

**目标:**考虑到所有这些概念和主要关注点,我们的目标是找到一个平滑的插值函数,并且在节点之间没有太大的变化。

既然我们已经讨论了自然三次样条的归属,因此该方法也应该继承所有这些一般特征。我们现在讨论下面的方法。别担心,我们会理解我们将要讨论的每一部分。

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

方法:自然三次样条

一、为什么叫自然三次样条?

**‘Spline’—**这个只是指 k 次的分段多项式 k 次连续可微 k-1 次

从那以后,

‘自然三次样条’—是一个分段三次多项式,它是两次连续可微的。它比多项式“硬”得多,因为它在数据点之间不太容易振荡。

仍然没有任何意义吗?让我们将它形象化,并解释我们稍后将通过机械模型使用的零件的数学术语。

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

figure from: Numerical Methods in Engineering with Matlab, 2ed by Jan Kiusalaas

让我们想象一下,有一个弹性条钉在软木板上。现在介绍要点:

  1. **段:**样条曲线的每一段都是三次多项式。
  2. **在销钉处:**斜率(一阶导数)和弯矩(二阶导数)是连续的
  3. **在端点:**没有弯矩。在数学语言中,这意味着样条在端点的二阶导数为零。由于这些端点条件在梁模型中自然出现,因此生成的曲线称为自然三次样条曲线。
  4. 图钉:代表数据点或后面公式中使用的术语【结】

现在我们已经清楚了一般的概念,让我们把这些概念具体化。我们用推导来说明它是如何产生的。

二。推导

这个比较长,但是对于懂导数和积分的人来说是可以理解的。

答:大图

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

figure from: Numerical Methods in Engineering with Matlab, 2ed by Jan Kiusalaas

其中有 *n 个节点(k 个)*是数据点(x,y),f 是两个节点之间的插值。

由于我将数学视为建模,我们从插图开始。这将作为具体告诉我们要解释什么,也是我们的地图,而我们做推导。

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

B .要求

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

C .引出适当的

正确的推导由两部分组成——每一部分得出一个方程——我们将使用它并在计算中发挥重要作用。

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

有了所需的公式后,我们展示如何使用它们。

三。怎么用它做插值?

我们通过一个例子来说明它的用法,然后概括这个过程。

例#1: 用自然三次样条确定 x = 1.5 处的 y。数据点如下:(2,1),(1,0),(5,0),(3,0),(4,1)

解决方案:

我们首先明白它想要什么。它的主要要求是—使用自然三次样条函数为包含 x = 1.5 的线段找到一个插值函数,该插值函数将对给定的所有数据点进行插值,并知道其对应的 y 坐标。

或者以更简单的方式:(1)插值函数(2) y 在 x=1.5 时

我们首先得到我们的公式:

用于插值器

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

为绳结

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

我们必须重新排列这些值来简化这个过程

:(1, 0), (2, 1), (3, 0), (4,1), (5,0)

然后我们知道具体的结

注意:k1=k5=0,所以我们只考虑 i=2,3,4

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

然后我们替换相应的值,这样:

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

这又产生了一个线性方程组:

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

结可以通过求根技术消除、替换、高斯消除、LU 分解等来解决。

我们在这里使用高斯消去法:

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

跳过我们的详细计算:

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

然后我们知道焦点在 x = 1.5 时得到 y

我们发现 x 在哪个纽结中:1.5 在 x1 = 1 和 x2 = 2 之间

因此,我们使用第一个和第二个结,使得:

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

替代我们的价值观:

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

因此,

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

现在我们已经看到了它是如何工作的,我们推广这个过程,给出一个使用自然三次样条找到某个 x 处的 y 的问题的解决方案。

一般流程:

必须被视为一个建议而已。有很多方法可以做到这一点。

**给定:**数据点

**求:**插值函数 fi,i+1(x)在某 x 处考虑 y。

流程:

  • 第一个主要步骤:配方和准备

我们将需要这些公式,所以最好在开始计算之前解决所有的公式:

  1. 为了绳结

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

2.对于分段的插值函数

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

3.确保横坐标(x 坐标)按升序排列,因为我们考虑的是每段的功能。

*第二个主要步骤:使用上述公式 1 求解结(k)

  1. I 的替代
  2. 替换整个值
  3. 形成线性方程组后,从 i=2,3,…,n-1 得到纽结

*第三个主要步骤:求解 fi,i+1(x_c)

  1. 首先找出 x_c 属于哪个结
  2. 得到 fi,i+1(x)
  3. 得到 fi,i+1(x_c)

总的来说,

可以说自然三次样条是一种非常有趣的插值方法。我们知道插值是用一个函数来拟合所有给定的数据点,我们知道多项式插值在某些时候可以只使用一个多项式来完成这项工作。当我们只考虑低次多项式时特别有用,但对于高次多项式,过度拟合潜伏在深处,产生不需要的振荡,不能提供任何对数据的洞察。一个可取之处是分段插值,它使用不同的低次多项式,这对于大型数据集特别有用。可以看出,在分段实现中有更多的工作要做,但是考虑到大数据集的方法的复杂性超过了相当长的实现。

参考资料:

JM·索里亚诺爵士的 CS131 课堂讲稿

米(meter 的缩写))希斯。科学计算:介绍性调查。

K.阿特金森和韩。初等数值分析。

J.基乌斯拉斯。用 Matlab 实现工程中的数值方法。

为赶时间的人准备的数字指南

原文:https://towardsdatascience.com/numpy-guide-for-people-in-a-hurry-22232699259f?source=collection_archive---------14-----------------------

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

Photo by Chris Ried on Unsplash

NumPy 库对于数据科学家来说是一个重要的 Python 库,您应该熟悉它。Numpy 数组类似于 Python 列表,但要好得多!操纵 Numpy 数组比操纵 Python 列表容易得多。您可以使用一个 Numpy 数组来代替多个 Python 列表。Numpy 数组的计算速度也比列表快,在执行数学和逻辑运算时效率极高。这是一个强大的工具知道!

本文是一个快速的备忘单,提供了 Numpy 基础知识的概述以及有用的方法。我将介绍如何以多种方式初始化 Numpy 数组,访问数组中的值,执行数学和矩阵运算,以及使用数组进行屏蔽和比较。我发现 Numpy 数组在解决 Python 编码难题时非常有用。

让我们开始玩吧。

Numpy

首先,您必须用下面的代码导入 Numpy。

import numpy as np

创建 Numpy 数组的多种方法

与列表不同,您不能创建空的 Numpy 数组。下面是根据您的需要初始化 Numpy 数组的多种方法。

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

如果您有一个想要转换成 Numpy 数组的列表,我们可以很容易地转换它。

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

访问数组中的元素

我们可以访问单个项目或一部分数据。与列表类似,第一个元素的索引是 0。例如,array1[0,0]表示我们正在访问第一行和第一列。元组[0,0]中的第一个数字表示行的索引,第二个数字表示列的索引。

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

广播

“术语广播描述了 numpy 在算术运算中如何处理不同形状的数组.”—SciPy.org

广播是一种获得两个数组的外积的方法。

根据文档,“在两个数组上操作时,NumPy 按元素比较它们的形状。在以下情况下,二维是兼容的

  1. 他们是平等的,或者
  2. 其中一个是 1

如果不满足这些条件,就会抛出一个ValueError: frames are not aligned异常,表明数组具有不兼容的形状。"

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

为了成功地得到外积,我们使用reshape.这个方法改变数组的形状,这样我们就可以使它兼容 Numpy 操作。

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

数学和矩阵计算

我喜欢 Numpy 数组的原因之一是它非常容易操作。仅用一行代码就可以进行连接、加法、乘法、转置!

下面是一些 Numpy 数组的各种算术和乘法运算的例子。以下未涉及的操作可在此处的文档中找到。

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

其他很酷的特性包括串联、拆分、转置(将项目从行切换到列,反之亦然),以及获取对角线元素。

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

上面,axis = 0 告诉计算机我们想要通过行来连接。如果我们想通过列来连接,我们使用 axis = 1。

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

比较和遮罩

我们可以用 Numpy 数组做的一件有用的事情是比较一个数组和另一个数组。在比较中返回一个布尔矩阵。

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

我们可以利用这个布尔矩阵。也就是说,我们可以进行布尔掩蔽。用这个布尔矩阵作为掩码,我们可以用它来选择我们感兴趣的数据的特定子集。

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

此外,我们还有各种其他比较运算符来比较两个数组,比如==(相等)、!=(不相等)、<=(小于或等于)。我们甚至可以组合两个布尔语句&(用于“与”条件)或|(用于“或”条件)。

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

感谢阅读!希望你喜欢。如果你使用 Numpy 还有其他有用的技巧,请在下面评论。你可以在这里找到上面代码的 Jupyter 笔记本。

numpy——Python 变得高效

原文:https://towardsdatascience.com/numpy-python-made-efficient-f82a2d84b6f7?source=collection_archive---------9-----------------------

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

“person holding sticky note” by Hitesh Choudhary on Unsplash

几天前,我的一个朋友问我他如何使用 git 命令来更改提交消息的名称。因为我已经在我的一篇文章中记录了同样的内容,所以我能够指引他去那里,他也能够自己做出必要的改变。就在那时,我意识到我的工作不仅帮助了未来的自己,也帮助了我的朋友和同事。因此,我决定记录下我将学到的任何新东西,因为它可能也会指导其他人。

在本文中,我将介绍 Numpy 的基础知识以及我最近了解到的一些策略。我将每个print()语句的输出作为注释包含在 Github gist 语句的后面。整个项目也可以作为理解 Numpy 库。

Numpy(数字 Python)

几天前,当我研究机器学习时,我开始使用 Python 的 Numpy 库。在看过如此多的视频系列和文件后,我确信它的巨大潜力和它带来的计算效率。

对于数据密集型计算,Numpy 为我们提供了广泛的方法,使 Python 中的数据操作变得非常快速和简单。虽然在循环过程中,Python 的执行速度比 Fortran 等其他语言慢,但 Numpy 通过将重复代码转换为编译形式来加快 Python 的操作。

NumPy 是使用 Python 进行科学计算的基础包。— 数量

这确实是真的。它提供了大量的选项,并且人们可以用简单的语句做大量的事情,这是非常了不起的。

import numpy as np

首先,我首先使用 Python 的 import 语句导入 Numpy。我把它命名为np,这样我就不用每次使用它的一个函数时都写numpy。这是导入库时遵循的一般惯例。

数字阵列

Numpy 数组非常类似于 Python 列表,但有一个特殊条件,即它的所有元素都必须是同一类型。我们使用函数array()在 numpy 中定义一个数组。它接受第一个参数作为数组,第二个参数作为元素类型,例如 intfloat 等。在这个例子中,我们定义了一个包含 int (integer)类型的元素 1、2、3 和 4 的数组。

我们可以索引元素。numpy 数组中的 Index 也是从 0 开始的,所以integerArray[0]指的是第一个为 1 的元素。我们也可以定义一个范围,比如[:2],它打印从 0 到 1 的所有值。创建这样一个数组非常有用,因为它有巨大的潜力,就像简单地检查数组中的一个元素一样2 in integerArray返回True

此外,我们可以使用concatenate()函数连接两个 numpy 数组。创建不同的数组也变得非常容易。我们可以使用函数zeros()创建任意给定大小的 0 数组,使用ones()创建任意给定大小的 1 数组,并通过定义一个range()而不是实际的 Python 列表来创建一个随机数数组。每个函数还接受第二个参数作为可选的元素类型。

多维数组

我们可以使用 numpy 库在 Python 中定义多维数组。只需将完整的数组集定义为数组字段的第一个参数。在上面的例子中,我们创建了一个二维数组(矩阵)。使用reshape()函数可以将一维数组转换成二维数组,反之亦然。

concatenate()函数也适用于 numpy 中的多维数组。默认情况下,连接发生在第一维上。然而,我们也可以使用axis参数定义串联轴。对于表示为matrix[row][column]的矩阵,我们可以通过使用axis = 0连接行或使用axis = 1连接列来连接。

Numpy 数组操作

我们可以在 numpy 数组上应用多种操作。

Numpy 重载了所有的基本函数,以便它们可以对数组进行操作,例如加号运算符+、乘号运算符*等。都是为数组重载的。平方根和对数等特殊函数也是可用的。这些操作是按元素进行的,因此当与多个数组交互时,它们必须都具有相同的形状。还有许多其他可能的操作,如expsincostanabs。我们还可以sort(),找到min()max(),确定unique()值,矩阵的diagonal()元素和sort()元素。如果我们在 min 或 max 前面加上arg,也可以得到数组中最小值或最大值的索引。

比较数组

numpy 数组也可以进行元素比较。这些函数返回布尔值,可以再次用于从结果为真的数组中提取值。

向量和矩阵运算

上面提到的所有函数都非常有用,并导致了使用向量和矩阵的更大目标。所有函数都处理向量和矩阵,使我们能够将 Numpy 用于统计和机器学习应用。

这个清单并没有到此为止。numpy 库中内置了最重要的函数,如dot()cross()矩阵运算。令人惊讶的是,我们也可以计算outer()inner()

随机阵列

使用 numpy,很容易定义随机数组和随机矩阵。

np.random使我们能够定义随机数组。如果自变量包括单个整数,例如上面示例中的5,函数rand()定义一个随机数组;如果自变量是整数的组合,例如上面矩阵示例中的(5,4),函数rand()定义一个随机矩阵。这个函数返回 0 到 1 范围内的值,但是如果我们想要整数,我们应该使用randint()。它将第一个参数作为起始值,第二个参数作为结束值,第三个参数作为数组的形状。

数字策略

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

“four person fist bumping” by rawpixel on Unsplash

我们现在非常熟悉 numpy 数组以及可以在其上执行的无限功能。在部署这些功能时,我们使用了一些固有的策略,包括:

  1. 通用函数
  2. 聚集
  3. 广播
  4. 切片、蒙版和花式索引

我们已经在上面的例子中使用了它们,但是现在我们可以明确地定义和区分它们。我在 PyCon 2015 youtube 视频中发现了这些关于丢失循环的策略。

通用函数

这些函数被定义为对数组元素进行元素操作的函数,不管它是一个单维数组还是多维数组。

上面的例子使用通用函数将数组arr的每个元素乘以 10,生成一个新的数组。

聚合函数

当我们希望总结数组中包含的信息时,这些函数非常有用。

上面的例子显示了我们如何使用std()函数来计算数组元素的标准偏差,它大约是2.87

广播

这些是通用函数如何在 numpy 数组上操作的一组规则。

在上面的例子中,我们看到一方面我们有一个矩阵mat,另一方面我们有一个数组arr。在添加这两个时,broadcasting 复制数组两次(理解为用两行创建一个临时矩阵作为[1,1,1])并添加这两个,这是可能的,因为它们现在具有相同的维度并产生结果。

切片、蒙版和花式索引

最后一个策略也包含了一些技巧。

我们可以使用一系列索引来索引数组,例如上面示例中的0 to 4。当我们将值设置为[:5]时,它从索引0的开头开始读取,直到比索引4的结尾小 1。

屏蔽使我们能够使用运算符来获得满足条件的数组中每个元素的布尔答案。如果条件满足,返回值为True,否则为False。例如,在上面的例子中,当我们定义掩码bigArray > 6 | bigArray < 3时,我们得到掩码为[True True True False False False False True True True]。然后,我们可以使用它来定义要在bigArray数组中读取的值,并获得输出。

花式索引是指我们定义一个索引列表,然后用它来获取bigArray数组的元素。

最后,我们可以将它们结合起来。在上面的最后一个例子中,我们首先选择值大于 6 的所有值,因此我们得到布尔值[False False False False False False False True True True],它通过bigArray[bigArray > 6]返回[7,8,9],我们从中选择第一个元素,从而得到输出[7]

结论

本文详细介绍了什么是 Numpy 数组及其众多的功能和策略。理解 Numpy 有助于我们理解基于它的许多其他库,例如 Sklearn。

希望你喜欢我的作品。请分享、评论和表达你的想法和观点。

Numpy 与 Tensorflow:矩阵计算的速度

原文:https://towardsdatascience.com/numpy-vs-tensorflow-speed-on-matrix-calculations-9cbff6b3ce04?source=collection_archive---------0-----------------------

你好社区!

在这篇文章中,我想分享我在矩阵计算方面的经验。在这篇文章的最后,我们将会更清楚地看到两个库中的哪一个必须用于不需要运行数小时的计算。

我面临的任务是编写这个公式:

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

其中 uv 是大小为 2 的向量,取自一组数千个向量。这实际上是计算庞加莱球空间模型中两个向量之间距离的公式的一部分(更多内容请见后面的帖子!).

因为问题的本质,我需要计算每一对向量的公式。为了加快计算速度,我选择只使用矩阵运算,而不使用循环。在这篇文章的最后,有一个附录,详细介绍了我为“矩阵化”循环所做的操作。

现在的问题是:Numpy 和 Tensorflow 哪个库完成它更快?我们去看看!

代码和设置

这篇文章中使用的所有代码都可以在我的 GitHub 知识库中找到,这里是。

我运行代码的系统是在 Crestle 上的 Jupyter 笔记本,在那里使用了 NVidia Tesla K80,TensorFlow 版本 1.2.0,Numpy 版本 1.13.0。

为了构建下面的图 1,我传递了维数从(100,2)到(18000,2)不等的矩阵。作为度量标准,我测量了挂钟时间,每个标绘点是三次运行的平均值。由于曲线行为的明显单调性,我避免计算每一点的方差。这是执行时间的图表:

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

Plot 1: Execution time for the considered formula.

什么!?CPU 上的 Numpy 比特斯拉 K80 GPU 上的 TensorFlow 还快?甚至,矩阵越大,Numpy 越快?这怎么可能?

深入挖掘

好吧,也许我做错了什么。最好四处看看。

我登陆这个网络帖子,实际上作者 Dimitrios Bizopoulos,展示了完全相反的情况。这里谁错了?

让我们检查他的支票。他尝试的一个操作是矩阵的乘法,Numpy 用 np.dot(),TensorFlow 用 tf.matmul()。我们开始吧!

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

Plot 2: Execution time for matrix multiplication, logarithmic scale on the left, linear scale on the right.

好的,右边的两条最快的曲线对应于在提到的帖子的第一张图中绘制的曲线。然而,要注意的是,切换到对数标度(左图),我们看到对于大小为

但是两条截然不同的张量流曲线呢?

为获得结果而运行的两个张量流代码之间的差异取决于生成矩阵的方式。在最快的一个中,我让 TensorFlow 生成曲线,所以这发生在 GPU 中;在最慢的一个中,我传递给 TensorFlow 已经存在的矩阵。

所以我们在这里浪费了大量的时间:从系统内存到 GPU 内存的矩阵拷贝。

此外,如果我们注意到 Numpy 曲线和最慢的张量流曲线具有非常相似的增长方式,我们也可以假设 Numpy 是通过矩阵在内存中传递的方式而减慢的。但是为了验证这一点,需要进行更深入的分析。

那么,如果我们不是将 vector 传递给初始代码(庞加莱球中的距离),而是告诉 TensorFlow 生成它,会发生什么呢?

最终检查

所以这是最后的检查:我们试图将我们的公式也用于 GPU 上生成的向量,从而避免将它们从系统内存传递到 GPU 内存。这对于任何范围来说都是无用的,因为我们需要对真实数据进行操作,而不是对随机数进行操作,但这将有助于理解正在发生的事情。

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

Plot 3: Execution time for the considered formula. In the fastest curve the vectors are generated in the GPU.

与前面的情况一样,TensorFlow 的瓶颈显然是从系统内存到 GPU 内存的复制,但当向量已经在 GPU 中时,计算将以我们预期的速度进行。

结论

TensorFlow 是一个深度学习库,它被设计成在 GPU 上的性能最好。GPU 安装在 PCIe 总线上,与该总线的通信比 CPU 和系统内存之间的通信慢得多。

因此,只有当数据上有大量计算要做,以至于系统-GPU 传输时间相对于实际计算时间变得可以忽略不计时,我们才具有使用 GPU 的优势。这不是我的案子。

附录:构建矩阵运算

我就是这么做的,为了简单起见,把解释限制在三个向量:[a1,a2],[b2,b2],[c1,c2]。

在分子上,我们必须计算两个向量之间欧几里得差的平方范数。摆姿势(a-b) = (a1-b1) +(a2-b2):

0,(a-b),(a-c)

(b-a),0,(b-c)

(c-a),(c-b),0

对于分母,我们需要单个向量的欧几里德范数。摆姿势 A= a1 + a2:

(1-A)(1-A)、(1-A)(1-B)、(1-A)(1-C)

(1-B)(1-A)、(1-B)(1-B)、(1-C)(1-C)

(1-C)(1-A)、(1-C)(1-B)、(1-C)(1-C)

最后,结果就是我们想要的矩阵。姿势 f(a,B)= 1+2 *(A-B)/(1-A)(1-B)):

0,f(a,b),f(a,c)

f(b,a),0,f(b,c)

f(c,a),f(c,b),0

遵循用张量流语言编写示例

[ NVIDIA /论文摘要]深度神经网络中的随机分层精度

原文:https://towardsdatascience.com/nvidia-paper-summary-stochastic-layer-wise-precision-in-deep-neural-networks-882c43de4526?source=collection_archive---------7-----------------------

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

GIF from this website

我的一个朋友向我推荐了这篇论文,我觉得它很有趣。

请注意,这篇帖子是为了我未来的自己复习这篇论文上的材料,而不是从头再看一遍。

摘要

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

低精度权重已经被提出作为使深度神经网络更有记忆效率以及对敌对攻击更鲁棒的方法。并且许多网络是通过跨网络的所有层的统一精度来实现的,本文的作者引入了一种学习方案,其中 DNN 通过学习随机地探索多个精度配置,因此网络能够学习最优精度配置。

简介

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

由于最近在深度学习方面的进步,许多与计算机视觉和自然语言处理(以及更多)相关的领域都有了很大的突破。然而,训练这些网络通常是昂贵的,因此对 GPU 的需求很高。(比如像网上的 CNN)。许多旨在减小网络规模的研究集中在使权重为二进制或三进制权重和激活。(这占用更少的存储器,并且可以通过位操作实现计算效率。).在本文中,作者引入了训练网络时的一个额外的超参数,即每例精度的配置。(网络将通过 back prop 找到最佳点。)

相关工作

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

有两种方法来减小网络的规模,1)网络压缩,其中预训练的网络被最小化,同时不妨碍准确性,2)网络修剪技术。(这两种方法各有优劣。)作者的工作主要集中在降低网络中权/激活的精度,本文的三个贡献是…
1)确认低精度运算的总位数和加速比之间的线性关系。
2)引入基于梯度的学习精度方法
3)实证证明作者端到端训练策略的优势

高效低精度网络

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

低精度学习是一个过程,其中存储在浮点 32 中的权重减少到 1/2 位整数值。(而且大部分研究都集中在量化权重和激活上。)一般来说,量化会导致较低的精度,然而,情况并非总是如此,量化可以作为正则化,并且实际上实现更好的性能。

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

如上所述,由于使用了较少的比特数,我们能够获得更高的速度。看到这个数字,人们自然会问,网络的最佳精度是多少?本文作者对此问题进行了研究。

学习精度

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

(e.g. 444444 indicates 6 quantized layers, all assigned 4 bits).

如上所述,当每一层都统一调整其精度时,我们可以看到该模型能够实现最低的误差。然而,当涉及到学习最佳精度的两个问题是…

1)如果对最大精度没有限制,网络将只会增长,因为它导致更低的损耗
。2)量化涉及离散运算,其是不可微分的,因此不适合简单的反向传播。

第一个问题通过固定总净精度来解决,第二个问题通过采用能够通过离散随机操作反向传播梯度的技术来解决。

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

由于量化过程包括离散化连续值,为了成功地训练网络,需要一些数学技巧。(注意:在使用 Gumbel-Softmax(也称为具体分布)的这一节中,实际上涉及了相当多的数学计算,但是,我不打算详细讨论)。

精确分配层

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

Example training Process

为了实现精确分配网络,作者引入了一种新的层,其中存在一个可学习的超参数 pi,它定义了 Gumbel-Softmax 分布。(并且每个分布与每个不同的层相关联。).作者指出,在训练的开始阶段允许温度降得太低会导致高方差梯度,同时还会鼓励很大程度上不均匀的比特分配,从而损害网络的泛化能力。为了解决这个问题,作者们对精度位进行了硬赋值。

实验

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

本文作者在 MNIST 和 ILSVRC12 两个数据集上尝试了两种不同的 CNN 网络。本文作者比较了均匀分配网络权值的情况和通过反向传播学习精度的情况。如上所述,当网络本身能够学习精度时,它会提供更好的性能。训练错误如下所示。(对于 MNIST 数据集)

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

作者发现一个有趣的事实是,网络分配更多的比特给更后面的层。(并且对于早期层,仅分配几个比特。)

结论与未来工作

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

本文作者介绍了 DNN 的精度分配层,并表明它比均匀分配的低精度模型具有更好的性能。(这是通过网络的能力来实现的,网络能够通过 back prop 找到最佳精度。).作者写道,他们将把这个想法扩展到对抗性攻击以及所提出的模型的变体。

遗言

我从来没有想过控制网络的精度会作为一个正则化方案。

参考

  1. 莱西、泰勒和阿雷比(2018 年)。深度神经网络中的随机分层精度。Arxiv.org。检索于 2018 年 7 月 8 日,来自 https://arxiv.org/abs/1807.00942

美丽的游戏:用随机模型预测英超联赛

原文:https://towardsdatascience.com/o-jogo-bonito-predicting-the-premier-league-with-a-random-model-1b02fa3a7e5a?source=collection_archive---------7-----------------------

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

Image by Michal Jarmoluk from Pixabay

剧透:一点点随机性其实 有助于 (而且不,你甚至不需要机器学习)

《美丽的游戏》

“做预测是没有意义的。这不值得猜测,因为没有什么是一成不变的,足球中的事情总是在变化。”

克里斯蒂亚诺·罗纳尔多

人们喜欢足球,因为每场比赛都是不可预测的。上赛季,西布罗姆维奇队在一系列糟糕的表现后降级,使他们在英超联赛中跌至谷底。

你猜怎么着?

他们对 6 强的战绩最令人印象深刻:对热刺(1 胜 1 平)和利物浦(2 平)不败,在老特拉福德击败曼联,将利物浦淘汰出足总杯,让曼城在 90+4 '进球后拼血、甜、泪以 3 分脱身。

足球的每一刻都很重要。如果你正在观看一场比赛,把目光移开一秒钟,你可能会错过一场重要的比赛和一个突如其来的进球。英国喜剧演员卡尔·唐纳利是这么说的:

“我在看 2010 年世界杯西班牙和巴拉圭的比赛。太无聊了,所以我去了厕所,错过了那两分钟内的 3 个点球。”

在比赛的任何时候,进球都有可能发生。虽然决定球队得分的因素有很多,但是进球的时间却是随机的。

让我们绘制一张上赛季 EPL 每场比赛进球数的柱状图。

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

现在,如果你认为这个直方图似乎遵循某种分布,那么你就在正确的轨道上。实际上,我们可以通过一点推理来推导出这种分布:想象一场足球比赛有 90 个一分钟的时间段,在每个时间段中,我们可以以相等的概率“放入”一个进球。

上个赛季,平均每场比赛有 2.7 个进球,这意味着平均*,我们在任何一分钟看到进球的几率是 2.7/90 = 0.03。不是很高,但足以让我继续比赛。如果我们随后模拟 90 分钟并记录进球数量,这种模拟的长期分布将遵循离散泊松分布(由红色线段连接的黑点表示)*

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

现在,为了证明我没有挑选泊松分布来证明我的观点,让我们看看过去 8 个赛季 EPL 的总进球数。

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

瞧,泊松分布又起作用了。

泊松分布有什么酷的?

每当先前事件(先前目标)的时间对未来事件没有影响时,就会出现这种分布

只要有理由假设事件可以在任何时候意外发生,与之前的事件无关,那么就有理由期待泊松分布。

这种随机性是非常显著的!!!想想这里所有的复杂性。所有教练在边线上的呐喊,球迷的尖叫,球员脑袋里的想法,到目前为止的进球数,上场时间等等。这些都不会影响下一个进球的概率。

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

None of the tactics matters when it comes to the probability of the next goal being score. Image by anncapictures from Pixabay.

这是一种纯粹随机产生的模式。

这很有效。它对足球比赛有效,对踢马致死 有效,甚至对癌症 有效。

在没有机器学习模型的情况下预测 EPL

你都看到了。人们已经尝试了多种不同的方法来预测足球比赛的最终比分。从线性回归、随机森林到深度神经网络等等。

诀窍是:要对一场比赛做出合理的预测,我只需要对泊松分布和两支球队的一些背景信息做一些非常简单的事情。

让我们试着预测一下上周日阿森纳对曼城的比赛!!!

最近 5 个赛季,主场面对曼城,阿森纳场均 1 球失球 1.37 个。不是一个令人印象深刻的记录。仅仅通过这些数字,我们就可以知道阿森纳将会经历一段艰难的时期。

通过收集这样的统计数据(你应该很高兴我已经为你做了数据收集和争论这里,我们可以模拟每一对之间的比赛。

我们可以重复模拟 10,000 或 100,000 次,并记录最可能的结果。最有可能的比分是阿森纳 1:2 落败,发生的概率是 24%。

实际结果呢?

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

Image from author. Screenshot from Google Search.

对于 4 行代码来说,这是一个不错的预测。

当你有一对在过去 5 年里很少有历史成绩的队伍时,要使平均成绩变得有意义就有点难了。例如:上个赛季是布莱顿和霍伍阿尔比翁 34 年后首次尝试顶级联赛,因此布莱顿和 PL 中其他球队之间没有太多数据。对于这些场景,我使用以下策略:

每支球队使用四个参数:主场和客场的平均进球数(SH)和平均失球数(SA)。当两支球队相遇时,我通过均值等于 1/2(SH + CA)的泊松分布样本为主队生成进球,同时考虑主队的进攻实力和客队的防守实力。相反,访问者的目标是从均值等于 1/2(CH + SA)的泊松分布中抽取的。

匹配的完整代码显示在这里

这是我对第一轮的预测和实际结果

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

同样,考虑到我们只是随机模拟比分,这是一个很好的结果。我们正确识别了 10 场比赛中的 7 场比赛的结果(赢/平/输),并正确预测了其中 3 场比赛的比分。

打我自己的联赛

一旦你可以模拟一场比赛,没有什么可以阻止我们推广我们的方法来模拟整个赛季,并进行排名。在每次模拟中,我们可以记录谁是冠军,谁获得冠军联赛,谁被降级。聚集成千上万的模拟,我们有自己的预测最终排名。

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

As an Arsenal fan, I’m not happy to see such a insignificant chance to title. Well, we are still better than Tottenham !!!

让我们一年后再来这里看看我是否接近了。

模拟的完整代码可以在这里找到

一锤定音

我不想给你大肆宣传泊松分布和随机性。因为足球(和生活)远不止于此。

到目前为止,我希望你喜欢讽刺的是,如果我们假设足球是 100%不可预测和随机的,那么泊松分布就会出现,我们就变得更容易预测。本质上:

足球的(假定的)不可预测性使得比分预测更容易!!!

这是我的妙语。

然而,足球中的真实故事不是关于随机性,而是关于超越它。阿瑟·温格上赛季在阿森纳的噩梦(在连续输掉 7 场客场比赛后排名第 6。天哪,太可怕了!!!不能用一连串的坏运气来解释。当西汉姆在安菲尔德 0:4 输给利物浦时,这不仅仅是一个随机的进球序列。西汉姆在高压下崩溃,利物浦用阵容质量资本化。我在 100 万次比赛中只遇到过一次这样的比分,但任何观看比赛的人都会说利物浦理所应当得到它(他们错过了至少 3 次明显的机会)。**

球员以高度同步的方式移动,球根据物理原理移动,经理们战略性地考虑战术。所有这些因素都给游戏带来了结构性,打破了我们关于随机性的小假设,并给预测带来了挑战。

所以罗是对的,但是 原因不对。

足球很难预测,不是因为它随机,而是恰恰相反,因为它有一些美丽的结构。

看看我在统计学和数据科学方面的一些趣事:

[1] Pandit,J. J. (2016),普鲁士军队中的马脚致死事件——以及大型组织中的其他“从未发生的事件”。麻醉,71:7–11。doi:10.1111/ANAE . 13261

[2]Tomasetti,C. & Vogelstein,B. (2015),组织间癌症风险的差异可以通过干细胞分裂的数量来解释。科学,347:78–81

目标检测和计数

原文:https://towardsdatascience.com/object-detection-10f3601e4175?source=collection_archive---------3-----------------------

使用不同技术的对象检测、识别

对象检测,尤其是识别可以使用不同的技术来完成,如 OpenCV 函数的组合。对我来说,用 R 语言构建一个快速模型,然后花几周时间编写冗长的 C++或。它的 NET 代码。我从一个人计数器开始,作为对象检测的实际应用,并拍摄了经过办公室的人的镜头。

首先需要使用 FFmpeg 从视频中准备图像。然后选择一个背景图像,创建一个有物体的图像和背景图像之间的差异矩阵。正如可以在 我的博客 上找到的,我已经创建了一个用于光栅图像处理和矢量化的 R 库—faster raster,这可以用于对象检测,因此想法是通过一些梯度检测区域来矢量化差异矩阵。

在这张图片上,有一个变体#1,其中图片矩阵由简单的 RGB 值表示。他们的比较让我对这个人的影子有了很强的物体探测能力(参见课程代码):

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

因此,下一个想法(代码中的变量#2)是计算颜色(红/绿,绿/蓝)之间的差异,然后与背景进行比较。这清理了阴影检测,但引入了另一个问题,即大量黑暗区域的检测,这可能是由较差的 CMOS 相机颜色检测能力引起的:

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

然后我决定减去颜色(红-绿,绿-蓝),效果很好。我还增加了检测区域重量的过滤,并在视频中显示出来。正如你所看到的,当一个黑色物体穿过黑色背景时,还有另一个问题——它被分成两个或三个部分:

在本例中,我只是添加了代码来连接这些区域,并计算连接对象的新中心。添加了跟踪线和两个绿色边距,以检测沿同一方向通过的对象:

可以看到,模型本身花了一页代码,大部分是为了可视化。然而,模型中不包括以下项目:

  • 背景图像——它必须适应天气、白天和其他条件(就像有人在观察区域的中央留下了一个包)。
  • 清点物体——只需检查穿过绿色空白处的向量
  • 多目标检测——基于路径近似的需求识别算法。
  • 连接对象识别-需要对形状中线进行聚类,通过平均权重和路径近似将连接区域分割成更小的区域。

物体检测 R 源代码

library("png");
library("raster");
library("fasteraster");

X <- 48 * 2 ;
Y <- 27 * 2;
from <- 140;
to <- 200;

matrixFromFrame <- function (idx)
{
  v <- readPNG(sprintf("in/%03d.png", idx));
  rgb <- lapply(1:3, function(x) as.matrix(aggregate(raster(v[ , , x]), fact = 5)));
  rgb <- lapply(rgb, function(x) t(x)[1:X, Y:1]);
  #1 return(rgb);
  #2 return(list(rgb[[1]] / rgb[[2]], rgb[[2]] / rgb[[3]]));
  return(list(rgb[[1]] - rgb[[2]], rgb[[2]] - rgb[[3]], (rgb[[1]] + rgb[[2]] + rgb[[3]]) / 3));
}

processFrame <- function(idx, back)
{
*#  png(file = sprintf("out/final%03d.png", idx), width = 640, height = 480);*
  rggb <- matrixFromFrame(idx);
  diff <- (rggb[[1]] - back[[1]]) ^ 2 + (rggb[[2]] - back[[2]]) ^ 2;
  pol <- raster2vector(diff, 0.001, 100, 100);
  plot(0, type = "l", xlim = c(1, X), ylim = c(1, Y));
  rasterImage(readPNG(sprintf("in/%03d.png", idx), native = TRUE), 1, 1, X, Y);
  abline(v = 30, col = 'green');
  abline(v = 70, col = 'green');
  lapply(pol, function(x) lines(rbind(x, x[1,]), col = 'blue'));
  zone <- rasterZoneAnalyzer(diff, 0.001, 100, 100);
  zone <- zone[zone[ , 2] > 10, , drop = FALSE];
  *#text(zone[ , 3], zone[ , 4], labels = zone[ , 2], col = 'red');*
  track[[idx - from + 1, 1]] <<- sum(zone[, 2] * zone[, 3]) / sum(zone[, 2]);
  track[[idx - from + 1, 2]] <<- sum(zone[, 2] * zone[, 4]) / sum(zone[, 2]);
  lines(track, col = 'red');
  points(track, col = 'red', pch = 20);
*#  dev.off();*
}

track <- matrix(nrow = to - from + 1, ncol = 2);
back <- matrixFromFrame(100);
lapply(from:to, function(x) processFrame(x, back));

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

代码你可以在这里找到: R 源代码

附言(同 postscript);警官(police sergeant)

对于个人问题,请在 Linkedin 或脸书上联系我,有时我会在那里发布关于人工智能的简短新闻和想法。
如果有 AI 方面的需求,或者需要组建数据科学咨询团队,联系我

对象检测算法:跨域对象检测

原文:https://towardsdatascience.com/object-detection-algorithms-cross-domain-object-detection-e87d3cfd3045?source=collection_archive---------6-----------------------

在今天的帖子中,我将介绍计算机视觉任务,它解决了域转移问题,即跨域物体检测(CDOD)

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

Photo by Marvin Kuhn on Unsplash

近年来,计算机视觉领域,尤其是基于深度学习的目标检测任务取得了长足的进步。开发的方法通常假设有大量带标签的训练数据可用,并且训练和测试数据来自相同的分布。然而,这两个假设在实践中并不总是成立的。更准确地说,通常不是。如何处理这种情况并构建能够很好适应新环境的鲁棒检测器?如何在解决现实问题中使用跨域物体检测

在我们之前的帖子中,一阶段或两阶段的方式我们描述了基于深度学习的对象检测算法,它可以在。这些方法实现了检测器的主要目标——预测对象的位置并将检测到的对象分配到正确的类别。在今天的帖子中,我们将介绍另一个与对象检测算法相关的计算机视觉任务,该任务处理域转移问题,即跨域对象检测(CDOD)。CDOD 作为深度学习的一个新分支而诞生,以应对上面列出的挑战。这篇文章旨在描述跨领域物体检测任务的最新方法。

目标检测任务中的域适应

想象一下这样一种情况,您训练您的模型在 Cityscapes 数据集[1]上检测常见的对象,如建筑物、汽车或行人,该数据集包含大量来自德国街道的带注释的对象。然后,您在数据集的测试子集(白天的图像)上测试您的模型,一切似乎都运行良好。接下来,你在一些夜间或雾天的图像上测试相同的检测器——最终汽车检测系统应该在各种驾驶场景下工作——你意识到你的模型不再能够正确检测行人或汽车(见图 1。).

上述问题的原因是测试图像的域的改变。该模型在源分布(日常场景)上被训练,但是在不同的目标分布(夜间或有雾的场景)上被测试。在这里,领域自适应(DA)可以派上用场。DA 是计算机视觉中一个重要而富有挑战性的问题。该方法的无监督版本的主要目标是基于源域中的给定图像来学习目标域中的图像的条件分布,而不用看到相应图像对的任何示例。也有自适应的方法,使用来自几个领域的成对图片(不同场景中的相同镜头)[3],但是在简单的图像到图像翻译的情况下,它们不是很流行。

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

Fig. 1. Adapting a pedestrian detector trained on labeled images from daytime conditions to unlabeled images from other conditions. Adapted from Ref. [2].

DA 可能以两种方式出现:当两个域彼此相似时,通过一个域和另一个域之间的直接转移(一步域适应),或者在源和目标之间几乎没有相似性的情况下,通过几个中间域逐步从一个域到另一个域(多步域适应)[4]。

随着领域适应技术在图像分类任务中带来的成功,预期 DA 也将改进对象检测任务的性能。在这项任务中,我们必须考虑目标域中的标记数据量(假设我们有许多来自源域的标记图像),并将跨域对象检测的类型分类为:

  • 完全监督:所有目标数据都有注释,
  • 半监督的:只有目标训练数据集的某些部分被注释,
  • 弱监督:我们处理一些不良注释类型,例如点状注释,
  • 无监督:不注释目标数据。

解决域转移的机制

在对象检测的情况下,有多种方法来执行域自适应。以下总结主要基于李等人的综述论文[5]。在他们的综述中,作者区分了不同类型的域适应,主要取决于用于准备域转换的技术,即基于差异的,基于重建的,基于对抗的,混合的和其他的(未分类)。

在基于差异的方法中,通过用目标数据微调基线检测器网络来减少畴变。该数据可以作为标记或未标记的图像呈现。在第一阶段目标领域中缺少注释的情况下,我们应该通过应用在源领域中的标记数据上训练的检测模块来创建伪标记。以这种方式获得的注释可以被细化,或者可以直接进入最后阶段,在最后阶段,基线检测器使用来自源域的原始标记数据和目标域中伪生成的注释被微调(重新训练)。图二。展示了一个基于差异的方法的例子[6]。

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

Fig. 2. Discrepancy-based approach proposed in Ref. [6].

另一方面,基于重建的技术假设使源样本与目标样本相似(反之亦然)有助于提高对象检测的性能。在这种情况下,实验可以分为两个重要的部分。一开始,我们应该通过将图像从一个域(通常是源)转换到另一个域(通常是目标)来生成人工样本。为此,可以探索一种基于循环生成对抗网络的模型。我们在关于生成培养皿中生长的细菌菌落的不常见人工样本的文章中更详细地描述了一个给定的模型。在第一步之后,创建的数据集用于训练检测器模型。在这一阶段,源图像注释被直接(类似于图 3 所示的方法。)或者在一些改进之后转移到假生成的图像。通过添加来自两个域的带标签的照片,可以增强网络性能[7]。

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

Fig. 3. An overview of the reconstruction-based system proposed in Ref. [7].

检测器旁边的基于对抗的方法使用域鉴别器来识别数据点来自哪个域。该网络进行对抗性训练,以缩小源和目标之间的领域差距。适应框架可以以多种方式设计。例如,在参考文献。[8]作者假设对抗训练应该在提取的特征上进行,因此准备两个适应组件:一个在图像级别(图像比例、图像风格、照明等)。),另一个在实例级别(背景中的对象外观、对象的大小等)。).提议的框架如图 4 所示。

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

Fig. 4. Overview of Domain Adaptive Faster R-CNN model from Ref. [8]. The network uses a standard adversarial training together with a reverse gradient layer (GRL) — sign of gradient is reversed when passing the layer during back propagation.

当然,一些作者[9]结合了上述几种机制,这种技术通常会产生更好的性能。基于差异和重构的机制是创建这种类型的混合的最流行的选择。还有几个其他的方法,文章的作者[5]没有设法适合任何上述类别。这里,作为一个例子,可以提到图诱导原型对齐[10]。

结束语

在对具有不同照明条件或场景的图像执行检测的情况下,对从一个域绘制的照片训练的标准神经网络失败。为了补救这一点,近年来已经提出了几种允许跨域对象检测的方法。在很大程度上,他们将一个领域的照片改编为另一个领域的照片,然后进行对象检测。

CDOD 的领域适应也涉及合成到真实图像的翻译。在目标域中只有少量样本的情况下,可以使用一些经典方法来生成照片,例如将一些按尺寸切割的对象放在来自公共数据集的多样性照片上,然后使它们看起来更真实。在下一步中,上述进行跨域检测的机制使得能够识别目标域中的对象,对于这些对象,收集注释可能是昂贵的。

另一方面,在 DA 步骤中,单个输入图像可能对应于多个可能的输出,这里出现了通用/多域对象检测的问题。消除这个问题的通用检测器的适当设计仍然是一个公开的问题。

我们希望你喜欢这次阅读。如果您正在寻找关于物体检测解决方案的更多详细信息,请随时查看更多定制建议。

由欧洲区域发展基金下的欧盟基金共同资助的项目,作为精明增长业务方案的一部分。
项目作为国家研发中心的一部分实施:快速通道。

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

文学

[1] Cordts,Marius 等人,“语义城市场景理解的城市景观数据集”进行中。IEEE 计算机视觉和模式识别会议(CVPR) (2016)

[2]罗伊乔杜里,阿鲁尼。使用自我训练使物体检测器自动适应新的领域。CVPR (2019 年)

[3]朱,严军等,“多模态意象翻译研究”更正内容:arXiv 预印本 arXiv:1711.11586 (2017)

[4]王,梅,等.“深度视域适应研究综述”《神经计算》,第 312 卷,第 135–153 页(2018 年)

[5]李,,等.“深层域自适应目标检测:综述”更正:arXiv 预印本 arXiv:2002.06797 (2020)

[6] Khodabandeh,Mehran 等人,“一种用于域自适应对象检测的鲁棒学习方法”。ICCV (2019 年)

[7] Arruda,Vinicius F .等人,“使用无监督图像到图像翻译的跨域汽车检测:从白天到夜晚”,载于 IJCNN (2019 年)

[8]陈,余华,等,“用于野外目标检测的域自适应快速 R-CNN”。CVPR (2018 年)

[9] Inoue,Naoto 等,“通过渐进域自适应的跨域弱监督对象检测”。CVPR (2018 年)

[10]徐,,等.基于图诱导原型比对的跨域检测."CVPR (2020)

原载于 2020 年 11 月 20 日 https://neurosys.com

PyTorch 中的目标检测和跟踪

原文:https://towardsdatascience.com/object-detection-and-tracking-in-pytorch-b3cf1a696a98?source=collection_archive---------2-----------------------

检测图像中的多个对象并在视频中跟踪它们

在我之前的故事中,我讲述了如何用你自己的图像在 PyTorch 中训练一个图像分类器,然后用它进行图像识别。现在,我将向您展示如何使用预训练的分类器来检测图像中的多个对象,然后在视频中跟踪它们。

图像分类(识别)和物体检测有什么区别?在分类中,你识别图像中的主要物体,整个图像被一个类分类。在检测中,多个对象在图像中被识别、分类,并且位置也被确定(作为边界框)。

图像中的目标检测

有几种用于对象检测的算法,其中最流行的是 YOLO 和 SSD。对于这个故事,我将使用 YOLOv3 。我不会进入 YOLO(你只看一次)如何工作的技术细节——你可以在这里阅读——但重点是如何在你自己的应用程序中使用它。

所以让我们直接进入代码吧!这里的 Yolo 检测代码是基于埃里克·林德诺伦约瑟夫·雷德蒙和阿里·法尔哈迪论文的实现。下面的代码片段来自一个 Jupyter 笔记本,你可以在我的 Github repo 中找到。在运行之前,您需要运行config文件夹中的download_weights.sh脚本来下载 Yolo weights 文件。我们从导入所需的模块开始:

from models import *
from utils import *import os, sys, time, datetime, random
import torch
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
from torch.autograd import Variableimport matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image

然后,我们加载预训练的配置和权重,以及在其上训练了 Darknet 模型的 COCO 数据集的类名。在 PyTorch 中,不要忘记在加载后将模型设置为eval模式。

config_path='config/yolov3.cfg'
weights_path='config/yolov3.weights'
class_path='config/coco.names'
img_size=416
conf_thres=0.8
nms_thres=0.4# Load model and weights
model = Darknet(config_path, img_size=img_size)
model.load_weights(weights_path)
model.cuda()
model.eval()
classes = utils.load_classes(class_path)
Tensor = torch.cuda.FloatTensor

上面也有一些预定义的值:图像大小(416px 正方形)、置信度阈值和非最大抑制阈值。

下面是返回指定图像检测结果的基本函数。注意,它需要一个枕头图像作为输入。大部分代码处理的是将图像的大小调整为 416 像素的正方形,同时保持其纵横比并填充溢出。实际检测在最后 4 行。

def detect_image(img):
    # scale and pad image
    ratio = min(img_size/img.size[0], img_size/img.size[1])
    imw = round(img.size[0] * ratio)
    imh = round(img.size[1] * ratio)
    img_transforms=transforms.Compose([transforms.Resize((imh,imw)),
         transforms.Pad((max(int((imh-imw)/2),0), 
              max(int((imw-imh)/2),0), max(int((imh-imw)/2),0),
              max(int((imw-imh)/2),0)), (128,128,128)),
         transforms.ToTensor(),
         ])
    # convert image to Tensor
    image_tensor = img_transforms(img).float()
    image_tensor = image_tensor.unsqueeze_(0)
    input_img = Variable(image_tensor.type(Tensor))
    # run inference on the model and get detections
    with torch.no_grad():
        detections = model(input_img)
        detections = utils.non_max_suppression(detections, 80, 
                        conf_thres, nms_thres)
    return detections[0]

最后,让我们通过加载一个图像,获得检测,然后用检测到的对象周围的边界框来显示它,将它放在一起。同样,这里的大部分代码处理图像的缩放和填充,以及为每个检测到的类获取不同的颜色。

# load image and get detections
img_path = "images/blueangels.jpg"
prev_time = time.time()
img = Image.open(img_path)
detections = detect_image(img)
inference_time = datetime.timedelta(seconds=time.time() - prev_time)
print ('Inference Time: %s' % (inference_time))# Get bounding-box colors
cmap = plt.get_cmap('tab20b')
colors = [cmap(i) for i in np.linspace(0, 1, 20)]img = np.array(img)
plt.figure()
fig, ax = plt.subplots(1, figsize=(12,9))
ax.imshow(img)pad_x = max(img.shape[0] - img.shape[1], 0) * (img_size / max(img.shape))
pad_y = max(img.shape[1] - img.shape[0], 0) * (img_size / max(img.shape))
unpad_h = img_size - pad_y
unpad_w = img_size - pad_xif detections is not None:
    unique_labels = detections[:, -1].cpu().unique()
    n_cls_preds = len(unique_labels)
    bbox_colors = random.sample(colors, n_cls_preds)
    # browse detections and draw bounding boxes
    for x1, y1, x2, y2, conf, cls_conf, cls_pred in detections:
        box_h = ((y2 - y1) / unpad_h) * img.shape[0]
        box_w = ((x2 - x1) / unpad_w) * img.shape[1]
        y1 = ((y1 - pad_y // 2) / unpad_h) * img.shape[0]
        x1 = ((x1 - pad_x // 2) / unpad_w) * img.shape[1]
        color = bbox_colors[int(np.where(
             unique_labels == int(cls_pred))[0])]
        bbox = patches.Rectangle((x1, y1), box_w, box_h,
             linewidth=2, edgecolor=color, facecolor='none')
        ax.add_patch(bbox)
        plt.text(x1, y1, s=classes[int(cls_pred)], 
                color='white', verticalalignment='top',
                bbox={'color': color, 'pad': 0})
plt.axis('off')
# save image
plt.savefig(img_path.replace(".jpg", "-det.jpg"),        
                  bbox_inches='tight', pad_inches=0.0)
plt.show()

你可以把这些代码片段放在一起运行代码,或者从我的 Github 下载笔记本。以下是图像中物体检测的几个例子:

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

视频中的目标跟踪

现在你知道如何检测图像中的不同物体了。当你在视频中一帧一帧地做的时候,你会看到那些跟踪框在移动,这种可视化可能会很酷。但是,如果那些视频帧中有多个对象,您如何知道一帧中的对象是否与前一帧中的对象相同?这被称为对象跟踪,并使用多次检测来识别特定对象。

有几个算法可以做到这一点,我决定使用排序,这是非常容易使用和相当快。 SORT(简单的在线和实时跟踪)是亚历克斯·比雷、葛宗元、莱昂内尔·奥特、法比奥·拉莫斯、本·乌普克罗夫特在 2017 年发表的一篇论文,该论文提出使用卡尔曼滤波器来预测先前识别的物体的轨迹,并将它们与新的检测结果进行匹配。作者亚历克斯·比雷也写了一个多功能的 Python 实现,我将在本文中使用它。请确保您从我的 Github repo 中下载了 Sort 版本,因为我必须做一些小的更改才能将其集成到我的项目中。

现在来看代码,前 3 个代码段将与单个图像检测中的相同,因为它们处理在单个帧上获得 YOLO 检测。不同之处在于最后一部分,对于每个检测,我们调用 Sort 对象的 Update 函数来获取对图像中对象的引用。因此,与前一个示例中的常规检测(包括边界框的坐标和类别预测)不同,我们将获得被跟踪的对象,除了上述参数之外,还包括对象 ID。然后,我们以几乎相同的方式显示,但添加了 ID 并使用不同的颜色,以便您可以轻松地看到视频帧中的对象。

我还使用了 OpenCV 来读取视频并显示视频帧。请注意,Jupyter 笔记本在处理视频时非常慢。您可以使用它进行测试和简单的可视化,但是我还提供了一个独立的 Python 脚本,它将读取源视频,并输出一个包含被跟踪对象的副本。在笔记本上播放 OpenCV 视频并不容易,所以可以保留这段代码用于其他实验。

videopath = 'video/intersection.mp4'%pylab inline 
import cv2
from IPython.display import clear_outputcmap = plt.get_cmap('tab20b')
colors = [cmap(i)[:3] for i in np.linspace(0, 1, 20)]# initialize Sort object and video capture
from sort import *
vid = cv2.VideoCapture(videopath)
mot_tracker = Sort()#while(True):
for ii in range(40):
    ret, frame = vid.read()
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    pilimg = Image.fromarray(frame)
    detections = detect_image(pilimg) img = np.array(pilimg)
    pad_x = max(img.shape[0] - img.shape[1], 0) * 
            (img_size / max(img.shape))
    pad_y = max(img.shape[1] - img.shape[0], 0) * 
            (img_size / max(img.shape))
    unpad_h = img_size - pad_y
    unpad_w = img_size - pad_x
    if detections is not None:
        tracked_objects = mot_tracker.update(detections.cpu()) unique_labels = detections[:, -1].cpu().unique()
        n_cls_preds = len(unique_labels)
        for x1, y1, x2, y2, obj_id, cls_pred in tracked_objects:
            box_h = int(((y2 - y1) / unpad_h) * img.shape[0])
            box_w = int(((x2 - x1) / unpad_w) * img.shape[1])
            y1 = int(((y1 - pad_y // 2) / unpad_h) * img.shape[0])
            x1 = int(((x1 - pad_x // 2) / unpad_w) * img.shape[1]) color = colors[int(obj_id) % len(colors)]
            color = [i * 255 for i in color]
            cls = classes[int(cls_pred)]
            cv2.rectangle(frame, (x1, y1), (x1+box_w, y1+box_h),
                         color, 4)
            cv2.rectangle(frame, (x1, y1-35), (x1+len(cls)*19+60,
                         y1), color, -1)
            cv2.putText(frame, cls + "-" + str(int(obj_id)), 
                        (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 
                        1, (255,255,255), 3) fig=figure(figsize=(12, 8))
    title("Video Stream")
    imshow(frame)
    show()
    clear_output(wait=True)

在您使用笔记本之后,您可以使用常规 Python 脚本进行实时处理(您可以从摄像机获取输入)和保存视频。这是我用这个程序制作的视频样本。

就这样,你现在可以自己尝试检测图像中的多个对象,并在视频帧中跟踪这些对象。

如果你想在自定义图像数据集上检测和跟踪你自己的物体,你可以阅读我的下一个故事,关于 在自定义数据集 上训练 Yolo 进行物体检测。

Chris Fotache 是一名人工智能研究员,在新泽西州工作。他涵盖了与我们生活中的人工智能、Python 编程、机器学习、计算机视觉、自然语言处理等相关的主题。

物体检测,和朋友吃饭…

原文:https://towardsdatascience.com/object-detection-dinner-with-friends-ea1caab3b666?source=collection_archive---------6-----------------------

每天,在人工智能的所有领域都可以看到许多进步,当然,在计算机视觉学习领域也不例外。

几天前,谷歌研究团队发表了一篇关于提议的用于物体检测的**# tensor flow API**的文章。为此,我想提出一个小小的挑战。我们能自动检测出与朋友共进晚餐的元素吗?

为此,我们最好使用预先训练的模型,我们有一些现成的选项可供使用:

  • SSD _ mobilenet _ v1 _ coco _ 11 _ 06 _ 2017
  • SSD _ inception _ v2 _ coco _ 11 _ 06 _ 2017
  • rfcn_resnet101_coco_11_06_2017
  • 更快 _ rcnn _ resnet 101 _ coco _ 11 _ 06 _ 2017
  • 更快 _ rcnn _ inception _ resnet _ v2 _ atrous _ coco _ 11 _ 06 _ 2017

所有型号都使用 COCO,(上下文中的常见对象)您可以在这里看到详细信息

让我们来看看我们的原始图像,它是由晚宴的一名参与者假想拍摄的:

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

而我们来看一个使用 #TensorFlow 的快速实现,对于我的分析,最佳答案是使用faster _ rcnn _ inception _ resnet _ v2 _ atrous _ coco _ 11 _ 06 _ 2017显示的。【 faster_rcnninception_resnet 】。基于官方演示的代码。

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

这样,我们就检测到了类、出现次数、标签……当然,我们可以在照片上涂色,使实现更加友好。

目前,这个模型是有限的,因为它使用了 COCO,但我们希望像这样的模型有更多的贡献。

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

  • 顺便说一下,回到我们的例子,我们可以非常快速地计算照片中的瓶子数量…

目标检测:端到端的理论视角

原文:https://towardsdatascience.com/object-detection-using-deep-learning-approaches-an-end-to-end-theoretical-perspective-4ca27eee8a9a?source=collection_archive---------1-----------------------

对物体探测领域最有影响力的论文的详细介绍

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

我们都知道图像分类问题。给定一幅图像,你能找出它属于哪一类吗?我们可以用 ConvNets 和使用预训练网络的迁移学习解决任何新的图像分类问题。

作为固定特征提取器的 conv net。获取一个在 ImageNet 上预训练的 ConvNet,移除最后一个完全连接的层(该层的输出是 ImageNet 等不同任务的 1000 个类分数),然后将 ConvNet 的其余部分视为新数据集的固定特征提取器。在 AlexNet 中,这将为每个包含分类器之前隐藏层激活的图像计算 4096-D 向量。我们称这些特征为 CNN 代码。如果这些代码在 ImageNet 上训练 ConvNet 期间也达到了阈值(通常情况下),则这些代码被重新赋值(即阈值为零)对性能非常重要。为所有图像提取 4096-D 代码后,为新数据集训练一个线性分类器(如线性 SVM 或 Softmax 分类器)。

作为补充说明:如果你想了解更多关于 convnets 和迁移学习的知识,我想推荐这个关于计算机视觉中的深度学习的可怕课程。本课程讨论各种 CNN 架构,涵盖图像领域的各种问题,包括检测和分割。

但是在图像领域有很多有趣的问题。我们今天要关注的是分割、定位和检测问题。

那么这些问题是什么呢?

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

所以这些问题被分成 4 大类。在接下来的几行中,我将尝试在我们深入探讨之前简要解释这些问题:

  1. 语义分割: 给定一幅图像,我们能否将每一个像素归类为属于特定的一类?
  2. **分类+定位:**我们能够将图像分类为一只猫。太好了。*我们是否也可以通过在猫的周围画一个边界框来获得该猫在图像中的位置?*这里我们假设图像中有一个固定的数字(一般为 1)。
  3. 物体检测:分类+定位问题的一个更一般的情况。在真实世界的设置中,我们事先不知道图像中有多少对象。那么我们能否检测出图像中的所有物体,并在它们周围画出边界框?
  4. 实例分割: *我们可以为图像中的每个单独的对象创建遮罩吗?*不同于语义切分。怎么会?如果你看顶部的第四张图片,我们将无法使用语义分割程序区分两只狗,因为它会将两只狗合并在一起。

在本帖中,我们将主要关注物体检测。

分类+定位

因此,让我们首先尝试理解,当图像中只有一个物体时,我们如何解决这个问题。分类+定位案例。CS231n 笔记中说得很清楚:

把本地化当成一个回归问题!

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

**输入数据:**我们先来说说这种模型期望什么样的数据。通常在图像分类设置中,我们使用(X,y)形式的数据,其中 X 是图像,y 是分类标签。

在分类+本地化设置中,我们通常以(X,y)的形式存储数据,其中 X 仍然是图像,y 是包含(class_label,X,y,w,h)的数组,其中,

x =边界框左上角的 x 坐标

y =边界框左上角的 y 坐标

w =以像素为单位的边界框宽度

h =以像素为单位的边界框高度

**模型:**因此在这个设置中,我们创建了一个多输出模型,它以一幅图像作为输入,有(n_labels + 4)个输出节点。n_labels 每个输出类的节点和给出(x,y,w,h)预测的 4 个节点。

亏损:在这种情况下,亏损是非常重要的。通常,损失是 Softmax 损失(来自分类问题)和回归 L2 损失(来自边界框坐标)的加权和。

损失=阿尔法*软最大损失+(1-阿尔法)*L2 损失

由于这两个损失将在不同的规模,阿尔法超参数需要调整。

这里有一件事我想注意一下。我们正在尝试进行对象定位任务,但我们仍然有我们的 convnets 在这里。我们只是增加了一个输出层来预测边界框的坐标,并调整了我们的损失函数。这是整个深度学习框架的精髓所在——将各层堆叠在一起,重用组件来创建更好的模型,并创建架构来解决自己的问题。这就是我们将会看到的未来。

物体检测

那么这种使用回归的定位思想是如何映射到物体检测的呢?并没有。我们没有固定数量的物体。所以我们不能有 4 个输出来表示边界框坐标。

一个天真的想法可能是将 CNN 应用于图像的许多不同的作物,CNN 将每个作物分类为对象类或背景类。这很棘手。你可以创造很多这样的作物。

地区提案:

如果有一种方法(通常称为区域建议网络)可以自动为我们找到一些裁剪区域,我们就可以在这些区域上运行我们的 convnet 并完成对象检测。这就是选择性搜索(Uijlings 等人,“T4【目标识别的选择性搜索”,IJCV 2013)为 RCNN 提供的。

那么地区提案是什么:

  • 找到可能包含物体的图像区域
  • 跑起来比较快;例如,选择性搜索在几秒钟内在 CPU 上给出 2000 个区域建议

地区提案是如何制定的?

***😗****

因此,本文从使用[13] (P. F. Felzenszwalb 和 D. P. Huttenlocher)的一些初始区域开始。高效的基于图表的图像分割。IJCV,59:167–181,2004 年。1, 3, 4, 5, 7)

基于图的图像分割技术通常用图 G = (V,E)来表示该问题,其中每个节点 v ∈ V 对应于图像中的一个像素,E 中的边连接某些相邻像素对。权重与每条边相关联,这是基于它所连接的像素的某些属性,例如它们的图像强度。根据不同的方法,可能有也可能没有连接每对顶点的边。

在本文中,他们采用了一种方法:

每个边(vi,vj )∈ E 具有相应的权重 w((vi,vj)),其是相邻元素 vi 和 vj 之间的相异度的非负度量。在图像分割的情况下,V 中的元素是像素,并且边的权重是由该边连接的两个像素之间的不相似性的某种度量(例如,强度、颜色、运动、位置或某种其他局部属性的差异)。在基于图的方法中,分段 S 是将 V 划分成多个分量,使得每个分量(或区域)C ∈ S 对应于图中的一个连通分量。****

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

Efficient GraphBased Image Segmentation Example

正如你所看到的,如果我们在这些遮罩周围创建边界框,我们将会丢失很多区域。我们希望将整个棒球运动员放在一个边界框中。我们需要以某种方式将这些初始区域分组。

为此,对象识别的选择性搜索的作者将分层分组算法应用于这些初始区域。在这种算法中,他们根据颜色、纹理、大小和填充的不同相似性概念,将最相似的区域合并在一起。

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

The Algorithm for region Proposal used in RCNN

RCNN

上面的选择性搜索是他们在 RCNN 论文中使用的区域提议。但是 RCNN 是什么,它如何使用区域提议?

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

物体检测系统概述。我们的系统

(1)获取输入图像,(2)提取大约 2000 个自下而上的区域提议,(3)使用大型卷积神经网络(CNN)计算每个提议的特征,然后(4)使用特定类别的线性 SVM 对每个区域进行分类。

除此之外,作者还使用了特定于类的边界框回归器,它采用:

输入:(Px,Py,Ph,Pw)-建议区域的位置。

目标:(Gx,Gy,Gh,Gw)-该区域的地面实况标签。

我们的目标是学习一种将建议区域§映射到地面真实框(G)的变换

培训 RCNN

RCNN 的输入是什么?

因此,我们从 RPN 战略和标签的基本事实(标签、基本事实框)中获得了一个图像、区域建议

接下来,我们将所有具有≥ 0.5 IoU(交集/并集)重叠的区域提议与一个基础事实框视为该框类的正面训练示例,其余视为负面。我们训练班级特定的 SVM 氏症

因此,每个地区的提案都成为一个培训范例。并且 convnet 给出该区域提议的特征向量。然后,我们可以使用特定于类的数据来训练我们的 n-SVM。

测试时间 RCNN

在测试时,我们使用特定于类的支持向量机来预测检测盒。在测试的时候,我们会得到很多重叠的检测框。非最大抑制是对象检测流水线的组成部分。首先,它根据分数对所有检测框进行分类。选择具有最大分数的检测框 M,并且抑制与 M 有显著重叠(使用预定阈值)的所有其他检测框。这个过程递归地应用于剩余的盒子

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

https://www.pyimagesearch.com/wp-content/uploads/2014/10/hog_object_detection_nms.jpg

RCNN 的问题:

  • 训练很慢。
  • 推断(检测)慢。使用 VGG16 时每幅图像 47s——因为需要多次运行 Convnet。

对速度的需求。因此出现在同一作者的图片中:

快速 RCNN

所以来自同一作者的下一个想法:为什么不创建输入图像的卷积图,然后只从卷积图中选择区域?我们真的需要运行这么多网络吗?我们可以只运行一个 convnet,然后对 convnet 计算出的特征应用区域建议作物,并使用简单的 SVM 对这些作物进行分类。

类似于:

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

来自论文:图为快速 R-CNN 架构。快速 R-CNN 网络将整个图像和一组对象提议作为输入。网络首先用几个卷积(conv)和最大汇集层处理整个图像,以产生 conv 特征地图。然后,对于每个对象提议,感兴趣区域(RoI)池层从特征图中提取固定长度的特征向量。每个特征向量被馈入一系列全连接(fc)层,这些层最终分支成两个兄弟输出层:一个层产生 K 个对象类加上一个包罗万象的“背景”类的 softmax 概率估计,另一个层为 K 个对象类中的每一个输出四个实数值。每组 4 个值对 K 个类之一的精确边界框位置进行编码。

这个想法在一定程度上依赖于所用模型的架构。我们是从 VGG16 取 4096 瓶颈层吗?

所以作者提出的架构是:

**我们对三个预训练的 ImageNet [4]网络进行了实验,每个网络有五个最大池层和五到十三个 conv 层(有关网络详细信息,请参见第 4.1 节)。当一个预训练的网络初始化一个快速的 R-CNN 网络时,要经历三次变换。首先,最后一个最大池层由 RoI 池层替换,RoI 池层通过设置 H 和 W 与网络的第一个完全连接层兼容来配置(例如,对于 VGG16,H = W = 7)。第二,网络的最后一个全连接层和 softmax(其被训练用于 1000 路 ImageNet 分类)被替换为之前描述的两个兄弟层(K + 1 个类别上的全连接层和 softmax 以及类别特定的边界框回归器)。第三,网络被修改以接受两个数据输入:图像列表和那些图像中的 ROI 列表。

这显然有点混乱和“令人毛骨悚然”,让我们来分析一下。但为此,我们需要了解 VGG16 架构。

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

最后一个池层是 7x7x512。这是网络作者打算用 ROI 池层来代替的层。该池层获得了作为输入的区域提议的位置(xmin_roi,ymin_roi,h_roi,w_roi)和先前的特征地图(14x14x512)。

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

现在,ROI 坐标的位置以输入图像的单位表示,即 224×224 像素。但是我们必须应用 ROI 合并操作的层是 14x14x512。因为我们使用 VGG,我们将把图像(224 x 224 x 3)转换成(14 x 14 x 512)——高度和宽度除以 16。我们可以将 ROI 坐标除以 16,映射到特征图上。

在深度上,卷积特征图已经编码了图像的所有信息,同时保持了它相对于原始图像编码的“事物”的位置。例如,如果图像的左上角有一个红色方块,并且卷积层为其激活,则该红色方块的信息仍将位于卷积特征图的左上角。

投资回报池是如何实现的?

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

在上面的图像中,我们的区域建议是(0,3,5,7),我们将该区域分为 4 个区域,因为我们希望有一个 2x2 的 ROI 池层。

你如何在小于目标规模的区域进行投资回报率池化?如果区域提案大小为 5x5,投资回报池层大小为 7x7。如果发生这种情况,我们只需将每个单元格复制 7 次,然后最大合并回 7x7,就可以将大小调整到 35x35。

在替换了汇集层之后,作者还将 1000 层的 imagenet 分类层替换为全连接层和 K + 1 个类别上的 softmax(对于背景+ 1)和类别特定的边界框回归器。

训练快速神经网络

快速 RCNN 的输入是什么?

非常相似:所以我们有一个图像,来自 RPN 策略的区域提议和标签的基本事实(标签,基本事实框)

接下来,我们将所有具有≥ 0.5 IoU(交集/并集)重叠的区域提议与一个基础事实框视为该框类的正面训练示例,其余视为负面。这一次我们有一个密集层,我们使用多任务损失。

所以每一个 ROI 都成了训练样本。主要区别在于多任务丢失的概念:

快速 R-CNN 网络具有两个兄弟输出层。第一个输出离散概率分布(每个 RoI),p = (p0,.。。,pK),超过 K + 1 个类别。通常,p 由 softmax 通过全连接层的 K+1 个输出来计算。第二个兄弟层为 K 个对象类中的每一个输出边界框回归偏移 t= (tx,ty,tw,th)。每个训练 RoI 都标记有基本事实类 u 和基本事实包围盒回归目标 v。我们在每个标记的 RoI 上使用多任务损失 L 来联合训练分类和包围盒回归

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

其中,Lcls 是 softmax 分类损失,Lloc 是回归损失。u=0 表示 BG 类,因此,只有当我们有任何其他类的边界框时,我们才会增加损耗。此外:

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

问题:

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

Runtime dominated by region proposals!

快速 RCNN

下一个被问到的问题是:网络本身能做区域提议吗?

直觉是:使用 FastRCNN,我们已经在 CNN 中计算了一个激活图,为什么不通过几个层来运行激活图以找到感兴趣的区域,然后通过预测类+ bbox 坐标来完成向前传递呢?

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

区域提案网络如何运作?

论文中的一个主要观点是锚的概念。锚点是固定的边界框,以不同的大小和比例放置在整个图像中,在首次预测对象位置时将用作参考。

首先,我们定义图像上的锚点中心。

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

Anchor centers throughout the original image

在 VGG16 网络的情况下,锚中心相隔 16 px,因为(14×14×512)的最终卷积层以因子 16(224/14)对图像进行子采样。

这是主播的样子:

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

Left: Anchors, Center: Anchor for a single point, Right: All anchors

  1. 所以我们从一些预定义的区域开始,我们认为我们的对象可能带有锚点。
  2. 我们的 RPN 对哪些区域具有对象和对象边界框的偏移进行分类。如果边界框> 0.5 的锚点的 IOU 为 1,否则为 0。
  3. 减少区域建议的非最大抑制
  4. 基于建议的快速 RCNN 检测网络

更快的 RCNN 损耗:

然后用 4 个损失联合训练整个网络:

  1. RPN 分类对象/非对象
  2. RPN 回归框坐标偏移
  3. 最终分类分数(对象类别)
  4. 最终框坐标偏移

结果:

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

Final Results on VOC Dataset

请随时在 LinkedIn 上与我联系,在 Twitter / Medium 上关注我,或者给我发消息征求意见。继续收听,继续学习。

免责声明: 这是我自己用网上很多博客和幻灯片的投入对这些论文的理解。如果你发现我的理解有问题,请告诉我。我一定会纠正自己,然后发帖。

参考文献:

  1. http://cs231n.github.io/transfer-learning/#tf
  2. http://cs 231n . Stanford . edu/slides/2017/cs 231n _ 2017 _ lecture 11 . pdf
  3. 高效的基于图的图像分割-http://people.cs.uchicago.edu/~pff/papers/seg-ijcv.pdf
  4. 用于精确对象检测和语义分割的丰富特征层次(RCNN 论文)-https://arxiv.org/pdf/1311.2524.pdf
  5. 物体识别的选择性搜索
  6. ***【https://deepsense.ai/region-of-interest-pooling-explained/ ***
  7. https://towardsdatascience . com/fasterrcnn-explained-part-1-with-code-599 c 16568 CFF
  8. https://stack overflow . com/questions/48163961/how-do-you-do-ROI-pooling-on-areas-small-than-the-target-size
  9. https://medium . com/@ smallfishbigsea/faster-r-CNN-explained-864d 4 FB 7 E3 f 8
  10. https://tryo labs . com/blog/2018/01/18/fast-r-CNN-down-the-rabbit-hole-of-modern-object-detection/
  11. 更快的 R-CNN:利用区域提议网络实现实时目标检测
  12. https://www . slide share . net/Wenjing Chen 7/deep-learning-for-object-detection
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值