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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

FreeLB:一种通用的文本对抗训练方法

原文:https://towardsdatascience.com/freelb-a-generic-adversarial-training-method-for-text-92ac25828495?source=collection_archive---------34-----------------------

一种改进文本和自然语言处理对抗训练的新的通用技术。

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

图片由来自 Pixabay 的 Gerd Altmann 提供

2013 年,Szegedy 等人发表了“神经网络的有趣性质”。这篇论文的一大要点是,模型可能会被的反面例子所愚弄。这些例子包含了某种人类肉眼无法察觉的扰动,但却可以完全欺骗模型。本文还发现,对立的例子可以在不同数据上训练的模型中推广,也就是说,所有这些模型都被一个具有同样难以察觉的扰动的例子所愚弄。

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

计算机视觉领域中的一个对立的例子(来自 Goodfellow 的《解释和利用对立的例子》,参见下面的参考资料)

Goodfellow 等人在 2014 年发表了“解释和利用对抗性例子”作为这项工作的后续,以进一步分析为什么对抗性例子如此普遍以及如何生成它们。这产生了对抗性训练的概念,其中除了训练数据集之外,还使用生成的对抗性样本来训练模型,以使模型更加健壮和可推广。这里有一个警告:健壮性和可推广性在某些领域(计算机视觉)是不一致的,而在其他领域(NLP)则是互补的。因此,对抗性训练有助于模型变得更加健壮,并可能更具普遍性。

自从 Goodfellow 的论文以来,对抗性训练技术继续变得更加优雅和有效,从而使模型对恶意示例更加健壮。这项来自微软 Dynamics 365 AI Research 的新工作提出了一种新的针对 NLP 域的对抗训练算法 FreeLB (Free Large Batch ),该算法通过向单词嵌入添加对抗扰动并最小化输入样本周围不同区域内的结果对抗风险,来促进嵌入空间中更高的鲁棒性和不变性。这不同于先前的工作,先前的工作通过添加随机的单词/句子,通过拼错单词,或者通过将文本输入解释成完全不同的句子结构,向文本输入添加对抗性扰动。通过在嵌入级别添加扰动,这种方法可以引入一些示例,如果我们只是简单地修改输入文本,这些示例是不可能生成的。

FreeLB 利用“免费”培训策略(Shafahi 等人,2019;张等(2019)用多样化的对立样本来扩大每个训练批次的大小,而不需要比当前最先进的算法投影梯度下降(PGD)额外的成本。具体来说,PGD 试图找到一组参数来最小化标准球内任何 r 的最大风险,如下所示:

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

其中 D 为数据分布, y 为标签, L 为某损失函数。与 PGD 在最后一步只使用 X+r 输出的梯度相比,FreeLB 每次迭代都取 r 输出的梯度的平均值,相当于把输入看成是 K 倍大的虚拟批次,【 X+r1,X+r2,…,X+rk】。具体公式是:

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

该团队在几个下游任务中使用这种 FreeLB 技术微调了 BERT 和 RoBERTa 语言模型。在 GLUE 基准测试中,BERT 测试分数从 78.3 增加到 79.4,而 RoBERTA-large 模型的分数增加了 0.3,达到 88.8。经过微调的 RoBERTa-large 还能够在 ARC-Easy (85.44%)和 ARC-Challenge (67.75%)基准测试中实现一流的性能。最后,在 CommonsenseQA 基准测试上的实验表明,FreeLB 可以被推广,并提高 RoBERTa-large 模型在其他任务上的性能。

如果你想了解更多关于 FreeLB 如何工作的细节,这里有一个链接链接到 FreeLB 的文章,点击这里查看更多的出版物和团队的其他工作。

参考文献

  1. 克里斯蒂安·塞格迪沃伊切赫·扎伦巴伊利亚·苏茨科夫琼·布鲁纳杜米特鲁尔汉伊恩·古德菲勒罗布·弗格斯神经网络的耐人寻味的性质 (2013),arXiv 预印本,arXiv:1312.61999
  2. 伊恩·j·古德菲勒黄邦贤·史伦斯克里斯蒂安·塞格迪解释和利用反面例子 (2014),国际学习表征会议,ICLR,2015
  3. 亚历山大·马德里亚历山大·马克洛夫路德维希·施密特迪米特里斯·齐普拉斯阿德里安·弗拉多走向抗对抗性攻击的深度学习模型 (2017),arXiv 预印本 arXiv:1706.06083
  4. A.Shafahi,M. Najibi,A. Ghiasi,Z. Xu,J. Dickerson,C. Studer,L. Davis,G. Taylor,T. Goldstein,对抗性训练免费!,神经信息处理系统,NeurIPS 2019
  5. 张定淮,张天元,陆,朱占兴,董斌,你只传播一次:最大原理无痛对抗训练,神经信息处理系统,NeurIPS 2019
  6. 于成哲干孙思齐汤姆·戈尔茨坦刘晶晶FreeLB:语言理解的强化对抗训练(2019) ,学习表征国际会议,ICLR 2020

谁做的薯条客观上是最好的?

原文:https://towardsdatascience.com/french-fries-the-final-frontier-of-data-science-674ec8f1d74c?source=collection_archive---------33-----------------------

薯条:数据科学的最后前沿

二月份,我们的数据科学团队就我们去哪家餐厅做的炸薯条最好的问题展开了争论。

我们决定在整个二月/三月举办一场比赛,看看谁才是真正的薯条之王。挪过去三月狂,你好淀粉狂

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

淀粉疯狂:比三月疯狂少得多的运动比赛(但更美味)——由艾美奖·史密斯Unsplash 拍摄

我把我们的发现打成了第一篇关于薯条的学术论文,并提交给了 arXiv。

它立即遭到拒绝。😦

然而,这里有一个关于客观上最好的薯条的故事,或者如我所称:

对圣莫尼卡市区薯条主观质量的客观分析

警告:这篇文章很可能会让你对薯条产生饥饿感

摘要

这一切 都是从一次团队午餐开始的。我们总是点薯条。几次午餐后,我们开始问这个问题:我们圣莫尼卡办公室附近最好吃的薯条是什么?你怎么确定“最好”呢?作为一家数据科学公司,我们知道这不能简单地通过在各种餐馆吃薯条来确定,我们必须围绕科学的严谨性和特定的限制来构建我们的分析,这样我们才能对我们的发现充满信心…如果结果不能通过同行评审来重现,那还有什么意义呢?因此,淀粉疯狂诞生了; 一场比赛,一群数据书呆子客观地评选出圣塔莫尼卡哪家餐馆的炸薯条是主观上最好的。

介绍

1802 年,托马斯·杰斐逊在白宫的一次晚宴上提供了“法式土豆”。从那里,薯条诞生了。土豆被切成片并油炸成了美国菜肴中的一种主食。

尽管与汉堡和快餐联系最紧密,但大多数餐馆都供应炸薯条。由于它们无处不在,人们肯定会问这样一个问题:“谁的薯条最好吃?”食物配方的简单性使得这个问题特别有趣,因为厨师只有几个变量可以用来制作他们理想的炸薯条。

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

作为一个加州人,In-n-Out 薯条在我心中占有特殊的位置。

此外,一些机构每天生产大量的薯条——这种大量生产会降低薯条的质量吗?他们必须将很大一部分业务集中在生产美味的薯条上,这一事实是否比以高端菜肴闻名的餐厅质量更好?

我们想借此机会谈谈房间里的研究大象——如果这项研究首先是重要的话。事实上,我们建议:

是的。

无论规模大小,对知识的追求都是令人钦佩的,而且还没有对圣莫尼卡市中心地区的炸薯条质量进行过任何研究。我们可能还没有几百万美元的炸薯条基金供我们支配,但是我们有毅力和动力(和调色板)来完成这个项目。我们很高兴能给人类资料库增加一点新知识。

1。方法

1.1 位置

我们必须首先选择将要参加比赛的薯条。最简单的抽样方法是选择离我们办公室不到 10 分钟步行路程的地方可以买到的薯条。幸运的是,我们的办公室位于圣莫尼卡市中心,那里不缺油炸食品;事实上有太多了。为了缩小搜索范围,我们只需在 Yelp 上输入“最好的炸薯条”,然后选择前 12 个结果。由于 fry 风格(见第 1.2 节),有几个位置最终被替换,但这种方法产生了一批强有力的竞争者。

为了避免评委根据薯条的产地产生偏见,每个地点都被随机分配了一个基于流行电视节目的虚假身份。图 1 是将真实的餐馆映射到其虚假身份的关键。从今以后,所有的餐馆都将使用虚假的名字。

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

图 1:为了消除位置偏见,给每个参赛者的虚假身份表

1.2 样式&采购

薯条有很多种,不幸的是,比较不同风格的薯条就像比较苹果和橘子一样,因此我们必须标准化我们的薯条类型。我们选定了最常见的样式——咸马铃薯薯条。这排除了像华夫饼干薯条和甘薯薯条等流行的变体,但仍然允许参与者之间的创造性和多样性。

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

我们通过只评判经典的马铃薯薯条,将风格偏好/偏见保持在最低限度——照片由艾美奖·史密斯Unsplash 上拍摄

一次判断一批薯条不是一个可行的选择,因为这将需要四倍于当前实验分配的时间,并使锦标赛(1.3.2)不可能进行。时间的增加将不可避免地导致法官的疲劳。相反,我们试图在不降低每批薯条完整性的情况下,一次收集每轮所需数量的薯条。

尽管我们尽最大努力尽可能接近同时获得鱼苗批次,但我们的检索并非没有缺陷,有些人可能会认为一批鱼苗经过的距离与该批次的分数成反比。我们在 3.2 节的讨论中详尽地回顾了这个猜想。

负责拿薯条的人被指示点薯条时说:“我可以点一份薯条吗?”餐馆根据这份订单制作的任何风格都被认为是他们典型的油炸风格。

1.3 实验设计

类似于 FIFA 世界杯的比赛设计,Starch Madness 由两部分组成:小组赛(1.3.1)和锦标赛(1.3.2)。在小组赛阶段的出色表现使你有资格参加锦标赛。

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

图 2:小组赛分组。“经典”电影的区分是主观的(但却是正确的)

1.3.1 小组赛阶段

12 份参赛炸薯条中的每一份都被随机分成 4 组,每组 3 名参赛者,称为分组,在小组赛阶段进行评分。使用的评分是 1.4 中定义的 F.A.T 系统。裁判被指示使用 F.A.T .系统(1.4)而不是比较来自一个部门的薯条来得分。

这是一个重要的区别,因为对每个鱼苗产生一个客观的分数比一个比较分数更能显示鱼苗的强度。此外,如果一个特定的部门有三个优秀的(或糟糕的)批次,他们应该被允许参加锦标赛发挥他们的实力,而不是他们的部门的整体实力。图 2 概述了这些划分。

1.3.2 锦标赛玩法

图 2:小组赛分组。“经典”电影的区分是主观的(但却是正确的)

虽然这不是比较炸薯条最科学严谨的方法,但它确实很有趣。在此阶段,前 8 个最高等级的炸薯条批次被播种并放置在单个剔除支架中。每场一对一的比赛都是由裁判盲目投票决定谁更喜欢弗莱。通过锦标赛,获胜者将被加冕。

【The F . A.T 系统

O 评判薯条的首要障碍之一是如何标准化评分。要做到这一点,人们必须回答一个深刻的哲学问题,“什么是好的薯条?”我们的薯条专家团队将薯条的质量分为三类:

风味。

外观。

质地。

这个由三部分组成的评分标准被出色地命名为“F.A.T 系统”这些都代表了一份好薯条的核心属性。通过根据这些指标对批次进行评级,我们可以满怀信心地决定哪种油炸食品是最好的。这些指标都采用 5 分制评分,1 分为最低,5 分为最高。这三个数字的平均值产生了 fry 的整体质量,并帮助裁判在锦标赛中做出重要的投票决定。

1.5 评委

薯条由能干的 RETINA.ai 团队评判,他们对薯条的热爱仅次于他们对数据收集和分析的热爱。这些法官的优点在 3.5.2 中得到很好的辩护

2.结果

A 小组赛阶段结束后,每位选手都在 F.A.T .系统中进行了评分,我们制作了以下数据表:

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

以绿色突出显示的人获得了足够高的 F.A.T 分数,有资格参加比赛。那些没有突出显示的低于麦当劳线,因为麦当劳不仅是合格的分数最低的薯条,而且平均分数为 2.43/5,可以被认为是一个普通的薯条。

还应该指出的是,小 Ruby 的得分绝对令人难以置信,比任何其他竞争者高出近 0.5 分,接近满分 4.44/5。另外一个有趣的结果是,小鲁比和汉堡休息室的得分高于大美式薯条,这是一种专门供应薯条的食品卡车。

麦当劳线以上的所有参赛者都进入了种子锦标赛,导致锦标赛结构如图 3 所示。使用虚假身份是因为这是评委在比赛中看到的相同支架。

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

图 3:锦标赛比赛等级的合格薯条

第一轮过后,洛斯·波洛斯·赫曼诺斯 & 莫斯·艾斯利如预期获胜,洛斯·波洛斯·赫曼诺斯横扫 JJ 餐厅7-0。然而,在垫底的两场比赛中,两场比赛都令人失望。Krusty Krab 以 6-1 赢得决定性胜利,而开心汉堡店在一场激烈的辩论中以 4-3 险胜。 Krusty Krab 击倒破釜酒吧*,而且这样做很有效,这是非常令人惊讶的,因为如前一节所述,破釜酒吧(伟大的美国薯条)只有卖薯条——然而他们在季后赛中一场比赛都没赢。*

最后的四场比赛如预期的那样进行,第一名洛斯波洛赫曼诺斯以 7 比 0 击败第四名莫斯艾斯利酒吧和第六名克鲁斯蒂克拉布击败第七名鲍勃汉堡。冠军赛是 ESPN 的经典之作。种子 6 号 Krusty Krab ,在整个锦标赛中只有 1 票反对,迎战种子 1 号 Los Pollos Hermanos ,他的小组赛分数明显高于其他任何人,比他们的冠军对手高出 1.44 分。但最终,经过激烈的辩论和评判,处于劣势的一方以 4 比 3 赢得了冠军。

嗨,Ho Burger ( Krusty Krab )被冠以淀粉疯狂的胜利者!

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

在一个令人惊讶的失败者的故事中,Krusty Krab (HiHo Burger)尽管是第 6 号种子,却赢得了淀粉疯狂!

3.讨论

现在我们有了每种薯条的客观分数,我们有机会从 F.A.T 分数平均值中看到某些属性对薯条质量的影响

3.1 价格是否意味着质量?

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

图 4:价格和鱼苗质量的关系

当看着炸薯条的价格和质量时,有一件事非常明显:比赛中最贵的炸薯条,Misfit,也被评为最差。事实上,不匹配是一个异常值,以至于将其作为数据点实际上改变了鱼苗价格和质量之间的关系,从正变到负。

在没有不匹配的情况下,价格和质量之间的相关性是适度正的(0.40 皮尔逊相关系数),而与不匹配的相关性是零到负的(-0.08 皮尔逊)。简单总结一下:

  • 价格确实意味着质量,但最多只有 10 美元
  • 不合时宜的(也许任何/所有高于 10 美元的薯条)是一种敲竹杠。你最好去麦当劳

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

说到麦当劳——最便宜的选择实际上是你能得到的最好的价格。虽然绝对质量确实会随着价格的上涨而提高,但它不会提高到每花一美元就能提高质量的程度。事实上,在麦当劳花一美元生产的油炸食品质量比旁边的餐馆高 38%。如果你在寻找最好的“性价比”,麦当劳是最好的选择。

3.2 距离是否暗示质量?

评委打分时的一个主要讨论是,离我们办公室的距离是否意味着薯条更好还是更差。这背后的原因很简单,因为薯条在新鲜和热的时候是最好的,如果我们不得不步行几分钟回到办公室,它们可能会比离我们办公室更近的一批薯条失去更多的热量。

双方都有强有力的论据。为了支持这个理论,Umami burger 是最远和最低评级的薯条之一,Little Ruby,Plan Check 和 HiHo 都进入了季后赛,并且离我们的办公室非常近。然而,最近的餐厅 Misfit 得分最低,Great American Fries 虽然很远,但质量仍然非常高。很明显,解决这个问题的唯一方法是

统计数据!

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

位置邻近性及其与鱼苗质量的关系。从左上顺时针移动命名的象限

我们在地图上标出了每家餐馆的位置,找到了从每家餐馆到我们办公室的欧几里得距离,并在地图上做了标记。首先,即使从数据中去除不匹配,也只有 10%的方差可以通过线性或指数关系(0.1 R2 值)来解释,因此距离降低质量的假设被拒绝。距离质量图为这些餐馆提供了一个有趣的策略。通过将数据除以麦当劳线和平均距离,我们可以创建 4 个象限/段。

象限 I 可以被标记为“容易下注”,每家餐馆都很近,而且质量很高。

象限 II 可以贴上“值得一游”的标签,因为它们距离更远,但质量仍然很高。

象限 III 可以被贴上“不值得旅行”的标签,因为它的质量低于麦当劳,距离高于平均水平。

最后象限 IV 可以被贴上“看似糟糕”的标签,因为虽然它们离办公室很近,但它们甚至不是短途旅行。象限 IV 的名称也源于这样一个事实,即我们经常去不适合的地方,因为它离我们很近,我们已经开始相信他们的薯条非常好。我们的研究表明这是不正确的,我们频繁的访问只是让我们产生了偏见

3.3 外部因素是否影响了我们的投票?

3.3.1 喜剧性的虚假身份

虚假身份被添加到餐馆中,以便人们在投票时不会基于他们之前在该餐馆的经历而产生偏见。然而,在我们试图掩盖他们的身份时,我们可能通过与虚构的餐馆来自的电影宇宙的联系引入了新的偏见。具体来说,如果一家餐厅被赋予了喜剧的身份,并且因为我们与该电影/节目的积极关联,我们给它的评分更高,会怎么样?或者反过来说,如果一家餐厅被赋予了非常严肃的电影/节目身份,并且正因为如此,评委们更加仔细地审查油炸食品,会怎么样?人们对待《沉默的羔羊》的态度会比《阿呆和阿呆》更消极吗?

答案是没有。用喜剧拆分薯条,我们得到的 t 检验 p 值为 0.52。虚假身份的喜剧价值并没有影响我们的投票。

3.3.2 天气

我们在二月和三月进行了这些实验——洛杉矶的冬天。在我们的一些回合中,气温达到了令人不寒而栗的 58 度——这影响了我们的投票吗?寒冷的天气会让热薯条味道更好,从而导致更高的 F.A.T .分数吗?还是阴天让我们变得忧郁,因此对我们吃的薯条更挑剔?

答案是。如果天气温度在 60 度以上,我们可以通过 t 检验得出 p 值为 0.74。外面的天气没有影响我们的投票

3.3.3 星期几

在 Fryday 上评判 fries 会影响我们的投票吗?,p 值 0.55 否定了这个假设。

3.4 Yelp 评分可以表示 F.A.T 得分吗?

elp 是一项以众包餐馆评级为荣的服务。许多人在决定是否应该去某个地方吃饭之前,通常会先查看 Yelp。在选择一个地方吃最好的炸薯条时,我们能使用同样的策略吗?人们希望随着 Yelp 总评分的增加,薯条的质量也会提高。

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

图 Yelp 分数和鱼苗质量的关系

不幸的是,事实并非如此。如图 8 所示,评价高的 Yelp 食用者不能生产出和他们的餐馆一样高的平均评价的薯条。即使我们剔除了不合时宜的异常值,好的 Yelp 餐厅也低于 Yelp-FAT 线,这只是简单地显示了 Yelp 分数和 F.A.T .分数之间的 1:1 关系——高于 Yelp-FAT 线(如 3.0 Yelp 分数)的餐厅生产的薯条的厚度高于 Yelp 分数所显示的厚度。我们对 4.0+餐厅未能生产 4.0+薯条的解释是,Yelp 评分不仅包括其他食物,还包括餐厅的氛围。Yelp 分数高的餐馆往往比分数低的餐馆有更好的就餐体验,尽管他们的薯条质量相同或更差。

3.5 解决潜在的混淆变量

3.5.1 季后赛排名

每个人都喜欢失败者的故事,因此,尽管在小组赛和锦标赛中弄瞎了每家餐厅,知道排名可能会迫使投票者在比赛结束时选择失败者。锦标赛的鱼苗质量比小组赛高,所以这是完全可能的。未来如何控制这一点是为了避免告诉排名,但也要在比赛中多次改变虚假身份,从而消除评委在之前的品尝中产生的任何偏见。

3.5.2 判断敏锐度

为了解决这样的担忧,即法官本身有偏见,不能代表那些没有参与研究的人的分数,这也是可能的。然而,每个法官都通过了薯条法官认证程序(图 9 ),因此他们的专业知识对于薯条质量来说是足够准确的。

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

图 9:所有评委收到的认证计划标志

4。结论

安京薯条是一个与所有读者相关的主题,我们希望在圣莫尼卡地区之外继续我们的研究。虽然我们的资源将我们限制在圣莫尼卡和单一淘汰,下一步可能是扩大区域和审判。我们都很感兴趣,如果这些结果适用于所有餐厅,或者如果有餐厅声称拥有最好的薯条,并希望参加挑战。

对于那些不相信圣莫尼卡炸薯条的油炸质量的研究主题值得发表的人,我们强烈主张应该永远鼓励对知识的追求,无论影响有多小或应用有多专业。

我们希望所有阅读过本书的人能够以同行评议的形式进行自己的薯条质量评估,并公布任何有趣的结果。炸薯条质量的研究领域还很年轻,已经成熟,可以发表更多的文章了。

对终极薯条的探索仍在进行中,数据科学家在未来的道路上扮演着重要的角色。

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

人类对完美炸薯条的追求的可视化——照片由 Matthew KalapuchUnsplash 上拍摄

希望你喜欢,

亚当·弗莱·布朗内尔

机器学习中的频繁主义者与贝叶斯方法

原文:https://towardsdatascience.com/frequentist-vs-bayesian-approaches-in-machine-learning-86ece21e820e?source=collection_archive---------4-----------------------

线性回归和贝叶斯线性回归的比较

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

作者照片

贝叶斯统计推断和频率主义统计推断之间一直存在争论。20 世纪,频繁主义者主导了统计实践。许多常见的机器学习算法,如线性回归和逻辑回归,都使用频率主义方法来执行统计推断。虽然贝叶斯主义者在 20 世纪之前主导了统计实践,但近年来,贝叶斯学派的许多算法,如期望最大化、贝叶斯神经网络和马尔可夫链蒙特卡罗,在机器学习中得到了普及。

在本文中,我们将在机器学习的背景下讨论它们的区别和联系。我们还将使用两种算法进行说明:线性回归贝叶斯线性回归。

假设

为简单起见,本文中我们将使用θ来表示模型参数。

Frequentist 方法假设观测数据是从某个分布中抽样得到的。我们将这种数据分布称为似然性:P(Data|θ),其中θ被视为常数,目标是找到使似然性最大化的θ。例如,在逻辑回归中,假设数据是从伯努利分布中抽样的,而在线性回归中,假设数据是从高斯分布中抽样的。

贝叶斯方法假设数据和假设的概率(指定数据分布的参数)。在贝叶斯理论中,θ是一个变量,假设包括假设 P(θ)的先验分布和数据 P(Data|θ)的可能性。对贝叶斯推理的主要批评是先验的主观性,因为不同的先验可能得出不同的后验和结论。

参数学习

频率学家使用最大似然估计来获得参数θ的点估计。对数似然表示为:

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

通过最大化对数似然或最小化负对数似然(损失函数)来估计参数θ:

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

Bayesians 不是点估计,而是使用 Bayes 公式估计参数的完全后验分布:

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

您可能已经注意到,分母的计算可能是 NP 难的,因为它在θ的所有可能值上都有一个积分(或分类情况下的求和)。你可能也想知道我们是否能得到θ的点估计,就像 MLE 所做的那样。这就是最大后验概率 ( )估算发挥作用的地方。MAP 绕过了后验分布的繁琐计算,而是试图找到使后验分布最大化的θ的点估计。

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

由于对数函数是单调的,我们可以在对数空间重写上述等式,并将其分解为两部分:最大化似然性和最大化先验分布:

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

这个看起来不像 MLE 吗?

事实上,这两者之间的联系是 MAP 可以被视为对正则化损失函数执行 MLE,其中先验对应于正则化项。例如,如果我们假设先验分布为高斯分布,则 MAP 等于 L2 正则化的 MLE 如果我们假设先验分布是拉普拉斯分布,那么在 L1 正则化的情况下,MAP 等于 MLE。

还有一种方法可以得到后验分布的点估计:期望后验(EAP) 估计。MAP 和 EAP 的区别在于 MAP 得到的是后验分布的众数(最大值),而 EAP 得到的是后验分布的期望值。

不确定

频率主义者和贝叶斯方法之间的主要区别是他们在参数估计中测量不确定性的方式。

正如我们前面提到的,常客使用 MLE 来获得未知参数的点估计,他们不会给可能的参数值分配概率。因此,为了衡量不确定性,频率主义者依赖于零假设和置信区间。然而,需要指出的是,置信区间并不直接转化为假设的概率。例如,95%的置信区间,只意味着你生成的 95%的置信区间将覆盖真实的估计,但是说它以 95%的概率覆盖真实的估计是不正确的。

另一方面,贝叶斯在可能的参数值上有一个完整的后验分布,这允许他们通过整合完整的后验分布来获得估计的不确定性。

计算

由于在许多参数上的整合,Bayesians 通常比 frequent ists计算更密集。有一些方法通过使用共轭先验或使用采样方法或变分推理来近似后验分布来降低计算强度。

例子

在本节中,我们将了解如何使用两种算法进行训练和预测:线性回归和贝叶斯线性回归。

线性回归(频率主义者)

我们假设线性回归模型的以下形式,其中截距包含在参数θ中:

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

假设数据按照高斯分布分布:

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

使用 MLE 最大化对数似然,我们可以得到θ的点估计,如下所示:

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

一旦我们从训练数据中学习了参数θ,我们就可以直接使用它来对新数据进行预测:

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

贝叶斯线性回归(贝叶斯)

如前所述,贝叶斯方法是对先验和可能性都进行假设:

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

使用这些假设和贝叶斯公式,我们可以得到后验分布:

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

在预测时,我们使用后验分布和可能性来计算后验预测分布:

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

请注意,参数和预测的估计值都是全分布。当然,如果我们只需要一个点估计,我们总是可以使用 MAP 或 EAP。

结论

机器学习的主要目标是使用从训练数据中学习到的参数进行预测。我们应该使用频率主义者还是贝叶斯方法来实现目标取决于:

  1. 我们想要的预测类型:点估计或潜在值的概率。
  2. 我们是否有可以整合到建模过程中的先验知识。

顺便说一下,我们之前讨论过判别模型和生成模型。一个常见的误解是将判别模型称为频率主义模型,将生成模型称为贝叶斯模型。事实上,频率主义和贝叶斯方法都可以用于判别或生成模型。你可以参考这个帖子获得更多的澄清。

我希望你喜欢阅读这篇文章。😃

学习率常见问题

原文:https://towardsdatascience.com/frequently-asked-questions-on-learning-rate-6defb4e45d2e?source=collection_archive---------32-----------------------

学习率问题和答案

这篇文章旨在解决我的学生经常问的关于学习速度的常见问题,也称为步长。所以,我发现以问答的形式收集它们很有用!你应该能够找到所有你想知道的关于学习率的信息。

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

eberhard grossgasteiger 在 Unsplash 上的照片

什么是学习率,它的目的是什么?

神经网络计算其输入的加权和,并将其传递给激活函数以获得输出。为了获得准确的预测,称为梯度下降(GD)的学习算法在从输出向输入反向移动的同时更新权重。当对训练集的每个样本进行更新时,我们称之为随机梯度下降(SGD)。

梯度下降优化器通过最小化损失函数(L)在多次迭代中估计模型权重的好值。这就是学习率的来源。它控制模型学习的速度,或者说,控制权重更新以达到 l 的最小值的速度。新(更新后)和旧(更新前)权重值之间的关系表示如下:

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

学习率取负值吗?

梯度∂L/∂w 是损失函数增加方向的向量。因此,-∂L/∂w 是 l 递减方向上的向量。由于η大于 0,因此是一个正值,-η∂L/∂w 在 l 递减方向上朝着它的最小值前进。如果η是一个负值,那么你正在远离最小值。它正在逆转梯度下降所做的事情,甚至使神经网络不学习。如果你考虑一个负的学习率值,你必须在上面的等式中做一个小的,但是必要的改变,这样你就可以保持最小化损失函数:

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

学习率的典型值有哪些?

学习率的典型值范围从 10 E-6 到 1。这里,你必须知道已经为 GD、具有动量的 GD 和 SGD 建立了,对于任何优化问题,如果学习率小于 1/L,梯度下降收敛到局部极小值,其中 L 是损失函数关于参数的 Lipschitz 光滑性。

坡度上选择不当的学习率会有什么问题?

达到最小梯度所需的步长直接影响模型的性能:

  • 小的学习率消耗大量的时间来收敛,或者由于梯度消失,即梯度变为零而不能收敛。
  • 较大的学习率使模型面临超过最小值的风险,因此它将无法收敛:这就是所谓的爆炸梯度。

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

消失(左)和爆炸(右)渐变(图像来源

因此,您的目标是调整学习率,使梯度下降优化器以最少的步骤数达到 L 的最小值。通常,您应该选择一个理想的学习速率,该速率既要足够低,以便网络收敛到有用的值而不会导致梯度消失,又要足够高,以便可以在合理的时间内对模型进行训练而不会导致梯度爆炸。

除了你对学习速率的选择,损失函数的形状,以及你对优化器的选择,决定了你能多快收敛到目标最小值。

错误选择的重量学习率有什么问题?

当我们的输入是图像时,学习率设置不当会导致噪声特征,如下图所示。恰恰相反,平滑、干净和多样的特征是良好调节的学习速率的结果。正确和不正确地设置学习率决定了你的模型的预测质量:一个良好的训练或者一个未收敛的网络。

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

由神经网络的第一层产生的标绘特征:不正确地(左)和正确地(右)设置学习率的情况(图像信用

能否先验地计算出最佳学习率?

对于简单的模型来说是可能的。对于复杂的问题,从理论推导中计算出能产生最准确预测的最佳学习率是不可行的。为了发现给定数据集上给定模型的最优学习率值,必须进行观察和经验。下一个问题的目的是了解你可以用来设定学习率的不同选择。

我们如何设定学习率?

通过参考我在文献中读到的内容,我区分了 4 种主要方法,你可以选择它们来调整你的模型的学习率。下面是配置η值所需了解的一切。

  • 固定学习率的使用:

您为学习率设定了一个值,您将在整个学习过程中使用该值。在这里,两种方式是可能的。第一种是琐碎而简单的,不需要任何努力。它包括使用实践中常用的通常值,即 0.1 或 0.01。第二种方法更相关,因为你必须寻找适合你的特定问题和神经网络结构的正确的学习速率。如前所述,学习率的典型值范围从 10 E-6 到 1。因此,你在这个范围内粗略地搜索 10 的各种顺序,以找到你的学习速率的最佳子范围。然后,在粗搜索找到的子范围内,用小的增量来细化搜索。你在实践中可能会看到的一个启发是在训练时观察损失,以找到最佳的学习率。

  • 学习率计划的使用:

与固定的学习速率不同,这种替代方案要求η值根据时间表在训练期内变化。这里,你从一个大的学习率开始,在模型的训练过程中逐渐降低学习率。这是合乎逻辑的!在学习过程的开始,权重被随机初始化,并且远未被优化,因此大的变化步长是足够的。随着学习过程接近尾声,需要更精确的权重更新。通常每隔几个历元就减少一个学习步骤。学习率也可以在固定数量的训练时期衰减,然后在剩余的时期保持恒定在一个小值。

我从阅读材料中得出的两个流行的时间表方案是在平稳状态下降低学习率和学习率衰减。在第一种方案中,对于固定数量的训练时期,每次丢失稳定期,即停滞时,学习率降低。关于第二种方案,学习率被降低,直到它达到接近 0 的小值。在这里,我区分了学习率的三种衰减方式,即阶跃衰减、指数衰减和 1/t 衰减。

  • 给新币加动量:

它包括在经典 SGD 方程中增加一项:

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

由于 Vt-1,这个增加的项考虑了权重更新的历史,这是过去梯度的指数移动平均的累积。这平滑了 SGD 的进程,减少了它的振荡,从而加速了收敛。然而,这需要设置新的超参数γ。除了具有挑战性的学习速率η的调整之外,还必须考虑动量γ的选择。γ设置为大于 0 小于 1 的值。其常用值为 0.5、0.9、0.99。我将不详细讨论动量。这将在另一篇文章中处理。

  • 自适应学习率的使用:

与上述方法不同,不需要手动调整学习速率。η由优化器调整,以根据权重的重要性执行更大或更小的更新。此外,确保了模型中每个权重的学习率。自适应梯度(Adagrad)、Adadelta、均方根传播(RMSProp)和自适应矩估计(Adam)是自适应梯度下降变体的例子。在这里,你要知道,没有单一的算法对所有问题都是最好的。

这里概述了学习率配置的主要方法。它提供了一个简明扼要的图形表示,方便您的理解!

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

学习率有哪些实用的经验法则?

  • 学习率是你的模型所依赖的最重要的超参数。所以,如果你被迫设置一个且只有一个超参数,你必须优先考虑学习率。你可以参考我以前的一篇文章来了解另一个重要的神经网络超参数:激活函数

[## 全面综合了主要激活函数的优缺点

激活函数:神经网络最重要的超参数之一,必须仔细选择…

medium.com](https://medium.com/analytics-vidhya/comprehensive-synthesis-of-the-main-activation-functions-pros-and-cons-dab105fe4b3b)

  • 模型学习率的调整是耗时的。因此,没有必要执行网格搜索来找到最佳学习速率。为了达到成功的模型,找到一个足够大的学习率,使得梯度下降有效地收敛,但是不要大到它永远不收敛。
  • 如果你选择一种非自适应学习率设置方法,你应该意识到这个模型会有成百上千的权重,每一个都有自己的损失曲线。所以,你必须设定一个适合所有人的学习速度。此外,损失函数实际上并不具有清晰的 U 形。它们往往具有更复杂的形状,有几个局部最小值。
  • 自适应方法极大地简化了适当学习率配置的挑战性任务,这使得它们更常用。此外,它通常收敛得更快,并且优于其学习速率被非自适应方法不适当地调整的模型。
  • SGD with momentum、RMSProp 和 Adam 是最常用的算法,因为它们对几种神经网络体系结构和问题类型具有鲁棒性。

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

我希望它对新的深度学习实践者足够有用和清晰。如果这篇文章中没有提到的新问题突然出现在你的脑海中,请随时提问!也许把上面的问答做得更详尽一些会有用。

一篇关于动量的文章正在进行中。敬请期待!

简单解释了假设检验以及 I 型和 II 型错误

原文:https://towardsdatascience.com/friendly-introduction-to-hypothesis-testing-and-type-i-type-ii-errors-6044d3c60236?source=collection_archive---------50-----------------------

如何为实验选择正确的测试,并根据统计证据做出决定?

合著者:艾米特·库马尔

“事实是顽固的东西,但统计数字是易驾驭的.”
马克·吐温

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

照片由像素像素拍摄

我最近在阅读 A/B 测试时偶然发现了假设测试的概念。

维基百科将假设检验定义为:

统计假设,有时也称为验证性数据分析,是一种在观察通过一组随机变量建模的过程的基础上可检验的假设。统计假设检验是一种统计推断方法。通常,比较两个统计数据集,或者将通过采样获得的数据集与来自理想化模型的合成数据集进行比较。为两个数据集之间的统计关系提出了另一个假设,并与这两个数据集之间没有关系的理想零假设进行了比较。如果根据阈值概率(显著性水平),数据集之间的关系不太可能实现零假设,则认为这种比较具有统计显著性。当确定某项研究的什么结果会导致拒绝预先指定的显著性水平的无效假设时,使用假设检验。

读这本书的人可能会认为有人这样写,所以很少有人能理解它。真正的挑战是大多数教程依赖于统计学家喜欢使用的大量术语和语言。

在这篇文章中,我将尝试用简单的方式解释假设检验以及第一类和第二类错误,而不使用太多的数学知识。

我建议提前阅读这篇文章,因为置信区间和误差幅度的概念将有助于理解假设检验。

真实世界的例子

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

路易斯·基冈-Skillscouter.com 在 Unsplash 上的照片

假设一家在线教育公司希望借助一项新功能来提高学生的参与度。参与度定义为观看课程的分钟数除以可用内容的总分钟数。让我们假设参与度的值在 1 到 10 之间。由于该公司不确定新功能是否会提高参与度,他们想在学生样本中进行测试。

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

现在,如果我们从总体中随机抽取 n 名学生的样本(具有均值 μ_p 和标准差σ_ p),中心极限定理告诉我们以下内容:

  • 如果我们从替换总体中随机抽取足够多的样本,那么样本均值的分布将是近似正态的。
  • 抽样分布的平均值( μ_s )可用于估计真实总体平均值, μ_p
  • 抽样分布的样本标准差( σ_x)σ_p/√n 给出(即总体的标准差除以样本中的观察数)。

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

我们现在有了总体中所有样本大小为 n=20 的样本均值分布。现在,让我们向随机抽取的 20 名学生介绍这项新功能,然后计算新的参与度。假设这 20 名学生的新平均参与度是*。*

我们想知道新的*、、*在抽样分布中落在哪里?换句话说,我们想找到 z 值?

z 得分基本上是标准偏差( σ_x) 的数量,通过该数量,值 Xₑ 高于或低于平均值 μ_s

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

现在让我们问一个问题“随机选择一个大小为 20 的样本,得到一个至少为 8.94 的平均值的概率是多少?”概率将等于1-蓝色阴影区域的面积* *。我们可以使用 z 表来获取数值。我们发现 10.06 的 z 值非常大,超出了图表范围!这仅仅意味着概率很小,几乎不可能偶然得到 8.94 的平均值,或者换句话说,新功能似乎对学生的参与度有影响。

这里我们需要定义一个阈值,如果概率低于这个阈值,我们可以安全地假设所获得的结果不太可能是偶然获得的,并且该结果是由于一些干预(在我们的例子中引入了一个新的特性)。统计学家确定了三个常规水平,称为 α 水平,也称为显著性水平。

  • α = 0.05(5%)
  • α = 0.01(1%)
  • α= 0.001(0.1%)

如果得到特定样本均值的概率小于 α ,则不太可能发生。

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

这里,我们假设在引入新功能后,平均参与度会增加。在现实生活中,我们不能做出这样的假设,因为相反的情况也是可能的。为了解决这种不确定性,我们使用双尾测试,将 α 对称地分成两部分。分割 α 会导致两个不对称的 z 临界值。

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

注意:对于双尾检验,z-临界值与用于计算置信区间的值相同。参考本文了解更多关于置信区间的信息。

在特定的 α 水平上,我们在任一情况下都有两种可能的结果(单尾或双尾)。样本均值( 、Xₑ )要么位于临界区域之外,要么位于临界区域之内。我们将这两种结果称为零假设( 、Hₒ )或替代假设( 、Hₐ )。

零假设( 、Hₒ )假设经过某种干预后,当前人口和新人口之间没有显著差异。

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

当我们确定变化的方向时,我们选择单尾检验。双尾检验是一个保守的选择,因为我们可能会弄错方向。

给定一个样本均值,我们可以拒绝一个零假设(【hₒ】)或者拒绝失败。拒绝零假设( Hₒ )可以用以下方式解释:

  • 我们的样本均值落在临界区域内。
  • 平均值的 z 得分的绝对值大于 z 临界值的绝对值
  • 获得样本均值的概率小于 α 水平

第一类和第二类错误

这种类型的统计分析容易出错。在上面的例子中,可能的情况是,所选的 20 名学生已经非常投入,而我们错误地认为高平均投入比是因为新功能。下图显示了可能发生的四种不同情况。

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

熟悉机器学习的人可能会观察到,类型 I 错误基本上是假阳性,类型 II 错误是假阴性。

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

https://www . Reddit . com/r/Mcat/comments/ao 6 Ovi/type _ I _ and _ type _ ii _ errors/

***I 型错误(*假阳性)

  • 解读:你预测的是正的,是假的。
  • 你预言一个男人怀孕了,但他没有。

第二类错误(假阴性)

  • 解读:你预测的是负数,这是假的。
  • 你预言一个女人没有怀孕,但她确实怀孕了。

我希望假设检验这个术语将不再是一个陌生的概念。虽然这篇介绍遗漏了一些技术部分,但是有很多非常好的资源,可以提供更多的细节。我总是乐于接受问题和建议。在 LinkedIn 上联系我,别忘了点击👏🏻如果你喜欢邮报。

Friendshipify:一个用于朋友的播放列表生成器

原文:https://towardsdatascience.com/friendshipify-a-playlist-generator-for-friends-f79297f08b03?source=collection_archive---------45-----------------------

用 Spotify API 和 Flask 构建的多用户歌曲推荐器 webapp

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

亚历山大·波波夫Unsplash 上拍照

你有没有在和朋友的长途旅行中被困在听自己不喜欢的音乐?

你的朋友问你想听什么,你说“你喜欢什么音乐就放什么。”所以他们开始演奏他们的音乐,你意识到他们喜欢的音乐是你不能忍受听的。现在你后悔没有在把音乐控制权交给他们之前说出来,公路旅行才刚刚开始。

我也遇到过几次这种情况。我和我的搭档对音乐的品味截然不同。他大多喜欢说唱,也时不时听听 ska 和朋克。我什么都喜欢一点,但是我听什么主要取决于我的心情。我们的品味在另类/独立音乐的一个非常特定的子集上重叠。在四个小时的车程中,我们轮流将歌曲添加到 Spotify 队列中,但我们仍然受困于对方的歌曲。

像这样的情况让我希望有一种方法,我们只能播放我们都喜欢的歌曲。我建立了 Friendshipify 来拯救我们,使我们不再陷入这种境地。

Friendshipify 根据两个用户的喜好交集生成一个播放列表。每个用户提供三首歌曲,应用程序将把它们作为他们的“音乐品味”,并策划一个两个用户都会喜欢的歌曲播放列表。试试这里的!

方法概述

使用 Python 编写的数据收集管道收集了大约 40,000 首歌曲。这些管道利用 Spotify API(通过 Spotify,一种 Python 包装器)来收集歌曲、元数据(如艺术家信息和流派)以及 Spotify 特有的音频功能(如可跳舞性、速度和乐器性)。使用 LibROSA 从原始音频文件中提取附加音频特征(例如,过零率、Mel 倒谱系数)。使用 Pandas 和 Numpy 构建特征向量,并存储在 PostgreSQL 数据库中。Friendshipify web 应用程序是使用 Flask 开发的,并通过 Google 云平台部署。伴随的可视化是用 Plotly 编写的。

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

数据收集和争论渠道;图片由 Deandra Alvear 提供

我是如何创建 Friendshipify 的

数据收集和争论渠道

Friendshipify 数据库存储了跨越 11 个流派的数千首歌曲的特征向量。当用户输入一首歌曲时,Friendshipify 会检查歌曲的特征向量是否已经存储在数据库中。如果不是,轨迹通过数据收集和特征提取管道来生成特征向量。

数据收集管道利用 Spotify API 收集歌曲及其元数据,如曲目名称、艺术家姓名和流派。使用音频特征端点检索音频特征,例如节奏、可跳舞性和能量。以下是我选择包含的 9 个 Spotify 特性的样本分发,这些特性的定义可以在 Spotify API 文档中找到。

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

9 个 Spotify 功能的样本分布;图片由 Deandra Alvear 提供

我本可以在这里停下来,基于 Spotify 提供的功能构建一个简单的推荐器,但我有两个顾虑:我选择的 9 个 Spotify 功能是否足以提供高质量的推荐,以及我如何能够验证我的结果。在做一些研究时,我偶然发现了几篇关于音乐信息检索的博客文章(流派分类重要音频特征),作者使用了 LibROSA,一个用于音频分析的 Python 库,从原始音频文件中提取音频特征。

Spotify API 在歌曲对象元数据中提供了歌曲 30 秒预览的链接。我想我可以使用 LibROSA 从歌曲预览中提取潜在特征,从而扩展我的数据集中的特征。我构建了一个特征提取管道来做这件事。下面是我根据自己的研究选择提取的一些特征的样本分布。有关频谱特性(质心、带宽、滚降)的更多信息,请参见本笔记本,有关过零率的更多信息,请参见本笔记本

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

4 个 LibROSA 特征的样本分布;图片由 Deandra Alvear 提供

一旦收集并处理了所有数据,我就将它们存储在 PostgreSQL 数据库中。Spotify 和 LibROSA 的组合功能将用于推荐。

创建匹配算法

决定如何配对可能是这个过程中最困难的部分。我不仅需要决定如何评估歌曲之间的相似性,还必须想出如何推荐能迎合两个用户的歌曲。虽然协同过滤方法被广泛用于构建推荐系统,但它并不是我想要解决的问题的正确方法。协同过滤试图根据评级历史找到个相似用户。在我的例子中,我想找到两个用户的歌曲之间的相似之处。

在评估歌曲之间的相似性时,我采取的第一步是尝试聚类。我认为将歌曲分类会给我不同的群体,我最终可以从中得出建议。我把所有收集到的曲目的特征向量输入到 K 均值聚类算法中。这导致了一些有趣的集群,但并没有给我一个清晰的想法,如何或为什么歌曲被集群的方式。当我听每个集群中的歌曲时,我可以听到相似之处,但我没有办法量化这些相似之处来验证结果。

最后,我决定按流派对歌曲进行分组,这是数据收集过程中包含的一个功能。使用流派作为分组标准意味着,如果用户提交一首摇滚歌曲,应用程序只会推荐其他摇滚歌曲。

Friendshipify 如何工作

一旦两个用户提交的曲目通过了数据收集和特征提取管道,该应用程序就具备了开始提出建议所需的所有标准。下图显示了这一过程。表“用户 A 的选择”和“用户 B 的选择”代表两个用户和他们提交给 Friendshipify 的歌曲。使用左侧的图例以不同的颜色表示类型。

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

按流派做推荐;图片由 Deandra Alvear 提供

首先,计算歌曲和数据库中属于同一流派的所有其他歌曲之间的余弦相似度。例如,用户 A 的第一首歌曲是小红莓乐队的“僵尸”。这是一首摇滚歌曲,因此 Friendshipify 计算“僵尸”的特征向量与属于摇滚流派的所有其他歌曲特征向量之间的余弦相似度。前两首最相似的歌曲(具有最高余弦相似值)成为该歌曲的推荐。在图形中,每首歌曲都有一个指向其最相似歌曲的箭头;《有些东西变了》和《美国梦》是 Friendshipify 数据库中与《僵尸》最相似的前两首歌。

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

用户 A 和用户 B 的余弦相似性矩阵;图片由 Deandra Alvear 提供

一旦 Friendshipify 为每个用户推荐了 6 首歌曲,它们就被用来构建一个 6×6 的余弦相似矩阵,其中用户推荐的歌曲是行索引或列索引。矩阵的单元包含每个用户之间所有可能的歌曲配对的成对余弦相似性值。例如,用户 A 的推荐“男朋友”和用户 B 的推荐“很高兴见到你”的相似度得分是 0.9798。

具有最高余弦相似值的歌曲对被用作最终推荐。上表中,《Star76》和《改变的东西》相似度最高,所以这两首歌会被纳入结果。然而,“起义”和“失乐园”具有最低的相似性得分,因此这些歌曲可能不会被包括在最终结果中,除非它们与不同的歌曲具有高的相似性得分。

测试案例

虽然 Friendshipify 总是会推荐与两个用户最相似的歌曲,但也会有一些情况很好,而另一些情况不太好。

流行与摇滚

两个朋友,唐娜和杰姬,都喜欢不同的音乐。成龙喜欢 2000 年代的流行音乐和玛丽亚·凯莉的早期音乐。唐娜更喜欢 90 年代到 21 世纪初的摇滚。成龙挑选了以下流行歌曲:

  • 糟糕的爱情,嘎嘎小姐
  • 幻想,玛丽亚·凯莉
  • 为我哭成一条河,贾斯汀·汀布莱克

唐娜挑选了以下摇滚歌曲:

  • 闻起来像青少年精神,涅槃
  • 阳光下的岛屿,威泽
  • 永远不会让你走,心灵蒙蔽合唱团

Friendshipify 为 Jackie 和 Donna 的播放列表推荐了这些歌曲:

  • 商会,蓝尼·克罗维兹,流行
  • 贝弗利山,威泽,洛克
  • 半迷人的生活,心灵蒙蔽合唱团,摇滚
  • 我的浪潮,声音花园乐队,摇滚
  • MMMBop,汉森,流行
  • 还有我,丹尼尔·梅里威瑟,爸爸
  • 再见,麦迪逊啤酒,流行音乐

为了验证这些推荐的歌曲是否符合两个朋友的口味,我决定检查四个音频特征的分布,可跳舞性、能量、速度和效价。

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

成龙和唐娜提交歌曲的小提琴情节及其推荐;图片由 Deandra Alvear 提供

以下是来自 Spotify API 文档的这些功能的定义:

可跳舞性:根据速度、节奏稳定性、拍子力度和整体规律性的组合,一首曲目是否适合跳舞。值 0.0 最不适合跳舞,1.0 最适合跳舞。

能量:从 0.0 到 1.0 的度量,代表强度和活动的感知度量。通常,高能轨道感觉起来很快,很响,很嘈杂。例如,死亡金属具有高能量,而巴赫前奏曲在音阶上得分较低。

速度:以每分钟节拍数(BPM)为单位的轨道整体估计速度。在音乐术语中,速度是给定作品的速度或节奏,直接来源于平均节拍持续时间。

效价:从 0.0 到 1.0 的一个量度,描述一首曲目所传达的音乐积极性。高价曲目听起来更积极(例如,快乐、愉快、欣快),而低价曲目听起来更消极(例如,悲伤、沮丧、愤怒)。

从小提琴的情节中,我们可以看到成龙的流行歌曲节奏较低,适度可舞,能量多样,适度积极(价)。唐娜的所有摇滚歌曲似乎都有相同的低节奏,不如杰基的流行歌曲适合跳舞,有高能量,适度积极。“推荐歌曲”的值分布在视觉上与 Jackie 和 Donna 的歌曲的分布相匹配。推荐的歌曲同样是低节奏,变价。

推荐的能量与在两个朋友的歌曲中看到的值的范围重叠。然而,小提琴的形状表明,Friendshipify 推荐像唐娜的高能歌曲的可能性更高。推荐的可跳舞性值是有趣的,因为包括了两个极值 0.88 和 0.51,尽管其余的歌曲落在 Jackie 和 Donna 的平均可跳舞性值内。Friendshipify 可以包括这些极值,以解决 Jackie 的下一首歌曲具有 0.88 的可跳舞性值的 50%概率,或者 Donna 的一首歌曲具有 0.51 的可跳舞性值的事实。

尽管在可跳舞性上存在差异,但基于绘制的特征,结果似乎是好的。我觉得这些歌曲在听觉上符合并迎合了两个朋友的口味。蓝尼·克罗维兹的《密室》听起来很流行/摇滚,所以我觉得这首歌对杰姬和唐娜都会有吸引力。“MMMBop”符合成龙和唐娜选择的时代,听起来类似于心灵蒙蔽合唱团的“永远不会让你走”和“半迷人的生活”,后者是从唐娜的歌曲中推荐的。“Good In Good Good In Good”是杰基精选推荐的歌曲,听起来与贾斯汀·汀布莱克的“泪流成河”非常相似。

摇滚对嘻哈

唐娜和杰基的朋友海德喜欢和唐娜一样的摇滚乐。他挑选了以下歌曲:

  • 中间,Jimmy Eat World 组合
  • 布莱特赛德先生,杀手们
  • 红辣椒乐队加州

他们问他们的朋友菲斯喜欢什么样的音乐。他喜欢嘻哈,他最喜欢的两个组合是 OutKast 和 TLC。他最喜欢的德雷克歌曲是《在我的感觉里》。菲斯挑选了以下歌曲:

  • 嘿,你好,奥特卡斯特
  • 在我看来,德雷克
  • 瀑布,TLC

以下是 Friendshipify 提出的建议:

  • 一支舞,德雷克,嘻哈
  • 抱紧我,动感城市原声带,摇滚
  • 皇家翼,银阳皮卡,摇滚
  • 家的色调,盲瓜,摇滚
  • 三是个神奇的数字,瞎瓜,石头
  • 后院,朋友哥打,嘻哈
  • 傻逼乐队,跑酷乐队,嘻哈

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

海德和非斯提交歌曲的小提琴情节及其推荐;图片由 Deandra Alvear 提供

海德的摇滚歌曲中度到不适合跳舞,能量很高。这是有道理的,因为“中间”和“亮边先生”听起来又快又有活力。尽管能量很高,海德的舞蹈性和节奏分布都被加州化扭曲了,这是一首比他的另外两首歌更柔和的歌。菲斯的歌和海德的歌相比表现出截然相反的特点。菲斯的可舞性小提琴以接近 0.8 为中心,这意味着他的歌曲具有很高的可舞性。尽管可以跳舞,菲斯的歌曲的能量和节奏是可变的。奥特卡斯特的《嘿呀》很有活力,《在我的感觉里》就没那么有活力了,《瀑布》是非斯挑的最慢的。海德和菲斯的歌曲都有不同的效价,考虑到他们的选择,这是有道理的。

“推荐歌曲”的特征分布似乎偏向海德或菲斯的歌曲。推荐的可跳舞性可能被一首或两首值约为 0.9 的歌曲所扭曲。能量和速度分布都包含异常值。包含这些异常值的歌曲可以被推荐,因为海德在高能量摇滚歌曲中有一首低节奏、低能量的歌曲,而非斯在更柔和的嘻哈歌曲中包括一首高能量、高节奏的歌曲。化合价似乎是推荐抓住两个朋友口味的一个特征;推荐的歌曲表现出相同的变价可变性。

推荐给海德和菲斯的歌,似乎并不能同时迎合两人的口味。Run-D.M.C 的“Sucker m . c . s”是最接近的,因为这首歌的打击乐性质,尽管它是一首嘻哈歌曲。向菲斯推荐另一首醇厚的德雷克歌曲是有道理的,因为他包括了一首德雷克歌曲。这两首盲瓜的歌曲也很圆润,Friendshipify 可能会试图在“在我的感觉中”和“一支舞”的特点上与它们相匹配。

如果 Friendshipify 的目的是提供单独的推荐,那么这些结果会是好的,然而,摇滚和嘻哈音乐似乎差别太大,无法推荐符合两种用户口味的歌曲。然而,流派并不是 100%的一个流派或另一个。如果菲斯和海德选择了不同的歌曲,结果可能会更有凝聚力,特别是如果两个朋友选择的歌曲不是那么多变。

最后的想法

Spotify 包含 4000 多种不同的风格,有些甚至是杜撰出来的。起初,我对按流派逐步限制最初的推荐持怀疑态度。即使使用像流行和摇滚这样宽泛的流派,感觉还是会给出不连贯的最终结果。音乐的美在于它不是非黑即白的。艺术家可以将不同的声音和风格融入歌曲中。例如,一首嘻哈或说唱歌曲可能有放克、古典或 R & B 的背景旋律(见泰勒,创作者),但仍然被认为是嘻哈/说唱。通过提取每首歌曲的潜在特征,该应用程序可以识别这些微妙的模式,并推荐类似的声音歌曲。有几次,我对给出的结果感到惊喜。因此,如果一个结果“似乎是错误的”,我鼓励你听一听。

如果我有更多的时间在这个应用上工作,我会通过改变风格的处理方式来改善推荐。我不会将 Spotify 的独特子类别映射到更一般的类别(例如,afrofuturism 变成了 R&B),而是会保留独特的类别,并扩展数据集,以包含大量属于每个独特类别的歌曲。改变匹配算法的这一部分将提高推荐的质量,并且很可能减少应用程序的运行时间。我还将实现一个 Spotify 授权流,这样用户就可以直接将播放列表添加到他们的 Spotify 库中。

参考

[1] 获取音轨的音频功能 (2020) Spotify API 文档

[2] Parul Pandey用 Python 进行音乐流派分类 (2018),走向数据科学

[3] Joel Jogy,我是如何理解的:在训练音频文件时需要考虑哪些特性? (2019),走向数据科学

[4] Steve Tjoa,谱特征 (2017),音乐信息检索笔记

[5]史蒂夫 Tjoa,过零率 (2018),音乐信息检索笔记

[6]莫拉·约翰斯顿,Spotify 如何发现未来的流派 (2018),Spotify for Artists,News

[7] Paul Sorres,数据分析能告诉我们关于花童的什么 (2019),走向数据科学

从一个完全的新手到通过 TensorFlow 开发者证书考试

原文:https://towardsdatascience.com/from-a-complete-newbie-to-passing-the-tensorflow-developer-certificate-exam-d919e1e5a0f3?source=collection_archive---------3-----------------------

我从学习 Python 到通过 TensorFlow 开发者考试不到 5 个月的旅程。

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

阿迪·戈尔茨坦在 Unsplash 上的照片

我刚从土木工程学士学位毕业,准备今年秋天开始攻读交通工程硕士学位。不幸的是,因为新冠肺炎,我的计划被推迟到了冬季学期。所以到今年一月为止,我没有上学,也没有工作。

在查看我未来的研究生院正在进行的一些研究时,我遇到了机器学习和深度学习正在许多运输工程相关的研究项目中实施。当时,我对 ML、DL,甚至是整个数据科学是什么一无所知!所以,我开始研究这个课题。我和我的几个计算机和软件工程师朋友聊过,我从他们那里了解到,机器学习植根于统计学、微积分和线性代数,所有这些都是我最喜欢的数学主题。我记得我对自己说,我不能错过这个机会,我有世界上所有的时间和无限的资源(感谢互联网!).除此之外,我将进入一个被数据科学迅速改变的领域,我需要尝试一下。

我一直在与编程语言作斗争,我曾经开始学习 Java,但在开始后的 5 个小时内就放弃了。这很尴尬,因为我对开发 android 应用程序抱有很高的期望。现在想起来,我只是懒惰和不耐烦。但这次不同,我不得不学习比 Java 更容易掌握的 Python,我发现自己真的被这个新领域迷住了。

所以,让我们直接开始吧!在这篇文章中,我将带你经历我如何在不到 5 个月的时间里从一个完全的新手变成一个 Google 认证的 TensorFlow 开发者的旅程。

1.学习 Python

有很多学习 Python 的资源,既有免费教程,也有给你结业证书的付费课程。我个人选择了证书课程,因为它为我提供了一种切实的信誉形式,并让我负责任。来自非编码背景,这对我很重要。这里是一些可用的资源;

证书课程

  • 这是我学 Python 上的课。我向任何没有编码背景的人推荐这本书,因为这本书涵盖了所有的基础知识,并且不断更新。最棒的是,你可以终身使用所有的材料,并获得证书证明你已经完成了全部课程。

链接: Python 训练营:学习 Python 编程和代码培训

链接: Python 为大家

更多课程列表此处

免费教程

  • freeCodeCamp.org 的优秀员工定期在 YouTube 上发布高质量的编码教程。

链接:学习 Python —初学者全教程【教程】

  • 另一个很棒的 Python 教程视频

链接: Python 教程— Python 初学者【全教程】

好了,现在你已经学会了 Python 的基础,干得好,祝贺你!!

但是,不要指望自己成为专家,仅仅因为你有一个证书或者你坐了 5 个小时的视频教程。这项工作远未完成!这将是一个渐进的过程,有一些很棒的工具可以帮助你练习和提高你的编码技能。

我用了两个网站,

  • Codewars.com 真是太棒了!他们已经想出了一种方法来将练习编码的过程游戏化。一定要去看看

链接:代码大战:融会贯通

  • Leetcode.com 是另一个伟大的网站。他们有编码面试风格的问题,以增加难度,这是另一个练习和提高你的编码技能的好地方。

我建议定期练习和提高你的 Python 技能。记住:间隔重复有效!

2.学习机器学习理论

正如我之前提到的,机器学习植根于统计学、微积分和线性代数,因此你不需要为了理解和学习机器学习概念而能够编码。在我看来,吴恩达在 coursera.com 讲授的机器学习课程绝对是一门瑰宝。这门课很老了,使用 Matlab 而不是 Python,但是介绍和解释概念的方式非常相关,会让你做好准备。对于像我这样一个完全的新手来说,有时会非常沮丧,但我现在很感激我完成了课程,尽管当时我并没有完全理解其中的一些主题。我发现自己一直在参考课程中的材料,甚至在准备 TensorFlow 开发者考试时也是如此。

链接: Coursera |在线课程&顶级教育工作者的证书。免费加入| Coursera

注意:这个课程甚至可以在学习 Python 之前上,但我会建议先学习 Python,这样你可以在学习机器学习概念的同时练习。

3.学习数据科学库

Python 中有一些特定的库,使得数据科学相关的任务变得更加简单和高效。其中一些库是 Pandas(数据操作和分析),Numpy(支持多维数组和矩阵),Matplotlib(绘图)和 Scikitlearn(创建 ML 模型)。网上有数不清的资源,这里是我用过的一些-

  • 熊猫——我看了很多视频、教程,甚至旁听了一门证书课程。codebasics 的这个 YouTube 播放列表无疑是互联网上最好的资源之一。

链接:熊猫教程(Python 中的数据分析)

链接: Python NumPy 初学者教程

  • matplotlib——YouTube 上的这个播放列表很容易理解,并且很好地解释了棘手的话题。

链接: Matplotlib 教程系列—用 Python 绘图

  • scikitlearn——我参加了在udemy.com开设的一门课程,这门课程几乎涵盖了所有的 ML 模型,并使用真实世界的数据集解释了它的实现。YouTube 上还有一个 3 小时的免费教程,你可以在这里找到。

链接:机器学习 A-Z(数据科学课程中的 Python&R)

4.深度学习理论

在这一点上,可以肯定地说,除了深度学习,你已经知道了成为一名成功的数据科学家所需要知道的大部分事情。DL 足够复杂,需要单独的课程甚至单独的库来实现。吴恩达在 Coursera 上开设的机器学习课程提到了神经网络和深度学习,但这比那门特定课程涵盖的内容要多得多,因此吴恩达开设了另一门课程,深入研究神经网络和深度学习。Deeplearning.ai 创建了一个由 5 门课程组成的专业,涵盖了不同的主题,如卷积神经网络、超参数调整、序列模型等。本课程着重于不同神经网络模型的理论和工作原理。我认为,完成本课程是必不可少的,尽管为了成功构建和部署深度学习模型,您并不一定需要完成本课程。然而,当您必须在 TensorFlow 中调优模型或从头创建模型时,它会让您的生活变得简单得多。

链接:深度学习专精

注意:本课程可以免费旁听。

我写了一篇文章,通过实际实现解释了深度神经网络的内部工作原理,可以在这里找到

5.张量流

TensorFlow 是一个免费的开源软件库,用于神经网络等机器学习应用。其他类似的库有 PyTorch 和 Theano,但我决定继续使用 TensorFlow,因为它应该对生产模型和可伸缩性更好,特别是因为 Keras 现在已经完全集成到 TensorFlow 中。 Deeplearning.ai 的人在 Coursera 上发布了另一个专业化,这是上面提到的深度学习课程的延续。它使用 DL 课程中教授的概念,并使用 TensorFlow 实现它们。我选择参加 TensorFlow 实践专业化认证的另一个原因是,它涵盖了 Google tensor flow 开发人员认证考试所需的所有先决条件。

链接:练张量流

我需要参加 TensorFlow 开发者考试吗?

这种特殊的证书考试是相当新的,在这个时间点上大约 5 个月,因此现在还不确定它在行业中对改善就业前景有多大价值。来自一个非编码的背景,这个考试作为一种方式来验证我在深度学习方面的技能。

这种考试需要一定程度的准备和编码能力,甚至能够尝试成功。最重要的是,它给了我一个固定的目标,并成为我完成所有课程的动力。

这里是一篇详细谈论考试的大文章。

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

作者图片

这些是我遵循的步骤,我打算继续学习。还有很多东西需要学习,尤其是因为数据科学是一个快速发展的领域。

从愿景到生产:第 3 部分

原文:https://towardsdatascience.com/from-a-computer-vision-idea-to-an-mvp-deployment-part-3-6d6528809f80?source=collection_archive---------44-----------------------

你建立了一个 ML 模型——这个 之后,你做什么呢?你如何把它变成可以在网上展示的东西?你如何把它变成其他人可以使用的东西,与之互动,并使之有用?
你部署一下!

大多数时候,人们在构建统计模型的阶段结束他们的项目,这可能是数据科学家的典型角色,他们通常不会最终将他们的模型作为开源软件部署到互联网上进行真实世界的测试,因为人们通常认为 前端和后端开发 会发挥作用(这也是我在这个项目开始时的想法:P)

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

图片来源:Pexels

显然有一些更简单的方法可以做到这一点,我将在我的博客中解释。我们使用 Heroku 和 Github 在 web 上部署我们的模型。

这篇文章我们要看什么?
1。使用你编码并从头构建的模型来制作应用。
2。如何整合谷歌模式做 app?
3。在本地机器上部署这两种方法。
5。将模型推送到 Github 并部署在 Heroku 上

为什么是烧瓶?
当我到达这个阶段时,我想先在 GitHub 页面上部署这个模型。GitHub Pages 是一个免费的静态站点托管服务,旨在托管来自 GitHub 库的项目。

当使用 web 应用程序时,我不能使用 GitHub 页面来托管它们。GitHub Pages 只适用于静态网站,而不适用于需要服务器和数据库的动态应用程序。你必须使用云服务,比如亚马逊网络服务来链接 Gitpages。所以 flask 是下一个选择,因为它使用 Python 作为服务器端语言,并且确实与模型完美集成。我了解到我可以使用名为 Flask 的框架来使用 Python 作为服务器端语言

使用您的编码 CNN:

使用 Flask 在 Herkou 上部署您的模型以供开源使用。

了解你的应用部署基础知识(如果你想看的话,可以在这里找到官方安装指南!)

建立一个虚拟环境来管理项目的依赖关系是一个好主意。为此,您可以为您的项目设置一个文件夹,然后在您的终端上运行:

mkdir myproject
cd myproject
python3 -m venv venv

我将在这里用 Python 3 做 Windows 上的作品。如果您在 Mac 上工作或运行 Python 2,您可能想看看官方文档,看看您可能需要调整什么来启动和运行。

接下来,激活您的环境并安装 flask

py -3 -m venv venv
pip install Flask

要创建一个非常小的 Flask 应用程序,首先要创建一个文件。创建文件并在文本编辑器中打开它。然后打字

**from** flask **import** Flask
app = Flask**(**__name__**)**@app.route**(**'/'**)**
**def** hello_world**():**
    **return** 'Hello, there!'

上面的代码是做什么的?

首先,我们导入了 Flask 类。接下来,我们创建了该类的一个实例。第一个参数是应用程序模块的名称。如果你使用单个模块,你将使用(__name__)以便 Flask 知道在哪里寻找东西。“route”部分告诉 Flask 哪个 URL 应该触发我们的函数。我们给这个函数一个名字,这个名字也用来为这个函数生成 URL,并返回我们希望在用户浏览器中显示的消息。

你可以把这个存成 hello.py 或者 whatever.py 或者任何让你开心的东西。只是不要存成 flask.py 因为那会和 flask 冲突。我喜欢用 app.py 作为 flask 的主文件,因为这将是 Flask 以后想要找到的文件。

如果您想运行它,请在您的终端上键入:

set FLASK_ENV=development
set FLASK_APP=app.py

我在运行flask run之前运行这个命令。这将使您处于开发模式。这意味着,当您更改代码时,您的服务器会自动重新加载,而不是每次更改代码时都必须手动重启。当出现问题时,它还会为您提供一个非常有用的调试器!
然后运行:

flask run

如果一切正常,您会看到类似这样的内容

Running on [http://127.0.0.1:5000/](http://127.0.0.1:5000/)

现在,您可以将它复制并粘贴到浏览器中。看看有没有用!要关闭它,你可以在终端窗口输入 Control C

您可以通过更改您的 **app.py 文件来轻松传递值。**我的 app.py 文件是这样的:

from flask import Flask, request, render_template
app = Flask(__name__)from commons import get_model
from inference import read_image
from inference import time
from inference import test_single_image
#import os
#from werkzeug.utils import secure_filename[@app](http://twitter.com/app).route('/', methods=['GET', 'POST'])
def hello_world():
 if request.method == 'GET':
  return render_template('index.html', value='hi')
 if request.method == 'POST':
  print(request.files)
  if 'file' not in request.files:
   print('file not uploaded')
   return
  file = request.files['file']
  # Save the file to ./uploads in case you want to save uploads
  #basepath = os.path.dirname(__file__)
  #img_path = os.path.join(basepath, 'uploads', secure_filename(file.filename))
  #print(img_path)
  #file.save(img_path)
  bulbimage = file.read()
  print(bulbimage)
  bulbpreds,final = test_single_image(path=bulbimage)
  test_single_image(path=bulbimage)
  return render_template('index.html', bulb=bulbpreds,finalpred=final)if __name__ == '__main__':
 app.run(debug=True)

假设我们有了模型。文件,将该检查点放在您的项目文件夹中。

现在我们需要写信获取图像,并将信息发送到模板。首先,您需要一个函数来获取模型并创建您的预测。创建一个 commons.py 文件,并编写一个函数来获取模型以及允许您将上传的文件转换为张量的内容。试试这个!

公共文件:

import io
import torch
from PIL import Image
from keras import layers
from keras import models
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing.image import img_to_array, load_img
from keras.models import load_model
import tensorflow as tfdef get_model():
 global model
 model = load_model('checkpoint_final.h5')
 print("Loaded Model from disk")
 model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
 return model

确保从其他文件中导入您使用的函数,比如从 commons import get_model 导入**。** 该函数读入图像,转换成 NumPy 格式,并调整图像大小以传入模型。然后它调用 model.predict,后者从 commons.py 文件中获取模型。整理灯泡类并返回预测。

接下来,创建一个推论. py 文件。我们需要能够整理出灯泡的名称、类别和标签,所以您可以编写如下内容:

rom keras import layers
from keras import models
import numpy as np
from keras import optimizers
from commons import get_model
from keras.preprocessing import image
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing.image import img_to_array, load_img
from PIL import Image
import io
#import torchvision.transforms as transforms
import cv2def read_image(file_path):
    print("[INFO] loading and preprocessing image...")
    #print(file_path)
    bulbimage = np.array(Image.open(io.BytesIO(file_path)))
    bulbimage = cv2.resize(bulbimage, dsize=(400, 400))

    #print(bulbimage)
    #my_transforms = transforms.Compose([transforms.Resize(400)])
    #bulbimage=my_transforms(bulbimage)
    #print(bulbimage)
    #bulbimage= load_img(file_path, target_size=(400, 400))  
    #bulbimage = img_to_array(bulbimage)
    bulbimage = bulbimage.astype('float') 
    #bulbimage= np.array(bulbimage).copy() 
    bulbimage = np.expand_dims(bulbimage, axis=0)
    bulbimage /= 255.
    print(bulbimage)
    return bulbimagemodel=get_model()
import time
def test_single_image(path):
    bulbs = ['A19', 'BR2040', 'MR16', 'PAR203038', 'R20', 'T5T8']
    images = read_image(path)
    time.sleep(.5)
    preds = model.predict(images)  
    predictions = {
        "A19":round(preds[0][0],2),
        "BR2040":round(preds[0][1],2),
        "MR16":round(preds[0][2],2),
        "PAR203038":round(preds[0][3],2),
        "R20":round(preds[0][4],2),
        "T5T8":round(preds[0][5],2),}
    print('Final Decision:')
    time.sleep(.5)
    for x in range(3):
        print('.'*(x+1))
        time.sleep(.2)
    class_predicted = model.predict_classes(images)
    #class_predicted.shape()
    class_dictionary= {'A19': 0, 'BR2040': 1, 'MR16': 2, 'PAR203038': 3, 'R20': 4, 'T5T8': 5} 
    inv_map = {v: k for k, v in class_dictionary.items()} 
    result= inv_map[class_predicted[0]]
    #print("ID: {}, Label: {}".format(class_predicted[0], inv_map[class_predicted[0]]))  
    return predictions,result

我的 index.html 看起来像:

<!DOCTYPE html>
<html>
<head>
<title>Bulb App</title>
<meta name="viewport" content="width=device-width, initial-scale=1"><style>
body {
margin: 0;
font-family: Arial, Helvetica, sans-serif;
}
.hero-image {
background-image: linear-gradient(rgba(0, 0, 0, 0.3),rgba(0, 0, 0, 0.3)), url("/static/image.jpg");
background-color: #cccccc;
height: 800px;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
position: relative;
}
.hero-text {
text-align: center;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: white;
}
input[type=file] {
width: 100%;
padding: 12px 20px;
margin: 8px 0;
display: block;
width: 200px;
color: white;
justify-content: center;
align-items: center;
text-align: center;
box-sizing: border-box;
border-style: solid white;
border-width: 2px;
border-radius: 2px;
}
input[type=submit] {
width: 100%;
padding: 12px 20px;
margin: 8px 0;
display: block;
width: 200px;
font-size: 1.5em;
color: white;
justify-content: center;
align-items: center;
text-align: center;
box-sizing: border-box;
background-color: #DC143C;
border-radius: 4px;
}
</style>
</head>
<body>
<div class="hero-image">
<div class="hero-text">
<h1 style="font-size:50px">Bulb Classifier</h1>
<h3>Upload a picture of a bulb to see what type it is! </h3><form method ='file' enctype=multipart/form-data>
<input type="file" name="file">
<input type="submit" value="upload"><ul class="actions">
<h4>Predictions: {{ bulb }}</p>
<h5>Final Prediction:{{ finalpred }}</p>
</div>
</div>
</body>
</html> def get_model():
 global model
 model = load_model('checkpoint_final.h5')
 print("Loaded Model from disk")
 model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
 return model

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

这是您应该拥有的文件结构。不要担心
静态文件夹包含你在背景中使用的图像。templates 文件夹包含 index.html 文件,您将需要在 Heroku 中进行部署的文件需求,可以通过

该函数读入图像,转换成 NumPy 格式,并调整图像的大小以传递到模型中。然后它调用 model.predict,后者从 commons.py 文件中获取模型。整理灯泡类并返回预测。
看起来很简单,你应该能够上传一张图片并得到一个结果!

现在,如果你想让公众可以使用它,让它对所有人开放。如果您想使用此应用程序部署到 Heroku,请跳到下一节。

使用 Auto ML 模型集成到您的 web 应用程序中

使用 AutoML 的TensorFlow.js模型格式的过程需要两个步骤:导出模型,然后加载它进行推理。

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

以下分步说明将帮助您加载任何基于 TF.js 的模型,并在您本地计算机的浏览器中部署您的应用程序,我们将为代码添加一些火花,以将其用作一个应用程序,人们可以上传图像并轻松获得他们的预测。这是一个良好的开端:

[## Edge TensorFlow.js 教程|云自动视觉文档

术语:参见 AutoML Vision Edge 术语页面,了解本教程中使用的术语列表。在本教程中…

cloud.google.com](https://cloud.google.com/vision/automl/docs/tensorflow-js-tutorial)

*loadImageClassification*函数在运行时使用 *model.json.*加载模型

*model.json*文件包含了所有 *.bin* 模型文件的信息。
加载该文件会自动加载 TensorFlow.js
中的模型

*classify*功能可应用于图像 *DOM* 元素。也就是说你只需要替换这里的 image DOM 元素: *const image = document.getElementById('daisy');* 就可以得到图像预测。

基于训练,classify函数返回一个 JSON 文件,其中包含了这些类的置信度得分。

根据你训练的模型类型,输出模型。JSON 和 bin 文件应该如下所示:

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

templates 文件夹包含第二个文件夹中的文件,但是 model.json 文件也可以放在主文件夹中

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

如果您没有 git 帐户,您可以在 git 上创建一个帐户,初始化一个存储库并上传存储库中的所有文件夹。
通过键入以下内容将要求归档,您将看到下载的文本文件:

**pip freeze > requirements.txt**

我能够上传模型,将其集成到 Heroku 中,并将其部署在 Heroku 上,而无需使用任何命令行界面。但是,如果您使用的是您编码的模型,则. h5 文件很大,需要通过 CLI 推送到 Github,您需要使用 Git LFS 来推一个大于 25mb 的文件。
您可以在此浏览文档:

** [## Git 大文件存储

下载并安装 Git 命令行扩展。下载并安装后,为您的用户设置 Git LFS…

git-lfs.github.com](https://git-lfs.github.com/)

如果你想用命令行上传到 Heroku 你可以看这里:

[## 使用 Git 部署

Heroku 使用流行的版本控制系统 Git 管理应用部署。你绝对不需要成为一个饭桶…

devcenter.heroku.com](https://devcenter.heroku.com/articles/git)

您的 proc 文件应该包含代码

python -m http.server $PORT

你可以在 Heroku 上自动观看:

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

按如下方式配置变量:

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

您已经准备好部署应用程序,只需单击“部署”按钮,您就会看到一个如下所示的链接,其中包含了我们的模型:

https://bulbdetection.herokuapp.com/templates/

您的 web 应用程序已启动并运行!

图片来源:Giphy.com

整个项目可以在我的 Github repo 找到:
数据准备和模型:https://github.com/aditi310896/Bulbdetection
部署:https://github.com/aditi310896/wavelengthmodel**

从愿景到生产:第 1 部分

原文:https://towardsdatascience.com/from-a-computer-vision-idea-to-an-mvp-part-1-f7be02d78f99?source=collection_archive---------44-----------------------

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

图片来源: NASA 开源

本系列旨在将您从计算机视觉图像分类问题的第一步带到部署阶段,并让您思考在此过程中您可能想要实现的替代方案和方法!

数据科学项目的生命周期通常从用例或想法开始,从所有可用的来源收集数据,分析数据并执行功能工程,建立一个统计模型,对未来数据进行良好的概括,然后部署到生产中。部署之后,您需要继续监视以执行度量,并使用新的可用数据重新训练模型。

在我们开始这个项目之前,这里有一些灵感和我的成果的链接,这里有一些给你们的动力:

【https://bulbdetection.herokuapp.com/templates/

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

作者图片

这篇文章的目的是什么?

1.从谷歌上抓取图片

2.消除重复的问题

3.建议其他更简单快捷的方法来获取图像数据集。

没有我们想要识别的图像的数据,首先求助于谷歌!

训练图像分类器或在任何计算机视觉项目上工作的最乏味的部分之一是收集你将用来训练你的模型的图像。在本文中,我将通过一个简单的过程来指导您快速收集和过滤您的训练图像。

Selenium 可用于自动化 web 浏览器与 Python(以及其他语言)的交互。通俗地说,selenium 假装是一个真实的用户,它打开浏览器,“移动”光标,如果你告诉它这样做,它就会点击按钮。Selenium 背后的最初想法是自动化测试。然而,在自动化基于 web 的重复性任务方面,Selenium 同样强大。

让我们看一个例子来说明硒的用法。事先需要做一点准备。我将用 Google Chrome 概述 Selenium 的安装和使用。

步骤:

  1. 安装谷歌浏览器(如果已经安装,跳过)
  2. 识别你的 Chrome 版本。通常通过点击“关于谷歌浏览器”找到。我目前有版本 77.0.3865.90 (我的主版本因此是 77 ,第一个点之前的数字)。
  3. 这里为你的主版本下载相应的 from 驱动,并把可执行文件放到一个可访问的位置(我用桌面/抓取)
  4. 通过 pip install selenium 安装 Python Selenium 包

启动网络驱动

运行下面的代码片段(为了便于演示,请在 Jupyter 笔记本上运行)并查看幽灵浏览器是如何打开的。
下面是我写的从谷歌上抓取图片的代码:

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

作者图片

此功能有助于获取要下载的每张图片的 URL,提取、保存 URL,并使网络驱动程序自动点击 google images 中的“加载更多”按钮,从而可以平滑地抓取图片。
我们需要构建的第二个功能是访问每个 URL 并下载 URL 中的图像。

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

图片由作者提供

这两个函数用于将所有图像抓取到一个文件夹中,该文件夹包含您正在寻找的所有图像。下面是一个屏幕记录,显示了这些功能是如何工作的,以及每张图片是如何从网上抓取的。一定要看一看!

[## MR16 —谷歌搜索—谷歌 Chrome 2020–08–18 13–59–02 _ Trim _ Trim . MP4

编辑描述

drive.google.com](https://drive.google.com/file/d/1a6c6VXAB_cqx_KwM8KwJS6LuCnp-pWug/view?usp=sharing)

PROTIP:如果你将照片数量增加到 500 张,那么从网络驱动程序抓取和抛出错误的次数是有限制的。我发现最简单快捷的方法是使用 chrome 扩展下载图片。

你所需要做的就是获得扩展,打开你的浏览器,输入你的谷歌搜索,点击右上角的扩展图标下载图片。将下载一个压缩文件夹。

https://chrome . Google . com/web store/detail/download-all-images/ifipmflagepipjokmbdecpmjbibjnakm

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

图片由作者提供

重复数据删除

“如何删除相同大小、相同图像但不同名称的?在数千张图片的数据清理过程中。”

如果您曾经尝试过手动构建影像数据集,您应该知道数据集中很可能会有重复的影像。
在你的数据集中有重复的图像会产生问题,原因有两个*:
将偏差 引入到你的数据集中,给你的深度神经网络额外的机会来学习模式特定的到重复的图像,这损害了你的模型将 推广 到它所训练的图像之外的新图像的能力。
通常,通过
从多个来源(例如,Google、Bing 等)抓取图像,您的数据集中会出现重复的图像。)或合并现有数据集(例如将 ImageNet 与 Sun397 和室内场景相结合)
当这种情况发生时,您需要一种方法:
检测您的数据集中有重复的图像,并删除重复的图像。*

下面是删除重复图片的代码,删除文件夹中所有重复的图片。

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

由作者提供

该函数初始化一个名为 duplicates 的空列表和一个空字典 hash_keys。然后,它打开并读取每个文件,为文件夹中的每个文件创建一个哈希值。

“md5”算法用于生成哈希值(32 位字符)。“hexdigest()”函数用于创建每个文件的哈希值。如果 file_hash 不在我们的 hash_keys 中,则给出 file_hash 的索引,否则将重复值附加到名为 duplicates 的列表中。

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

图片由作者提供

现在我们已经准备好了图片,我们需要把它们组织成一个可用的格式,然后开始制作模型!

抓取和重复数据删除的完整代码可以在我位于 https://github.com/aditi310896/Bulbdetectio T21 的 GitHub 仓库中找到

从设想到生产:第二部分

原文:https://towardsdatascience.com/from-a-computer-vision-idea-to-an-mvp-the-model-part-2-acca969ef56b?source=collection_archive---------46-----------------------

这篇文章是多类模型第 1 部分的延续

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

图片来源:Pexels

本文讨论了为多级灯泡分类而建立的模型。

这篇文章我们要看什么?
1。在 Google Collab/Jupyter Notebook 上从头构建一个多类分类器
或者,你可以使用 Google 的 Auto ML 软件构建一个模型作为验证指标,或者直接使用 Google 模型
2。使用 Google Auto ML 模型验证模型。
**此步骤要求您拥有一个 Google cloud 帐户,以便在云上训练您的模型,或者您可以使用我们从头开始训练的模型进行部署。

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

作者图片

我们的目标是做多类图像分类,其中的目标是分类的灯泡类型的图像属于 6。

由于这是一个新问题,还没有尝试过,我被告知从单一标签分类开始,我们从确定图像是否是 MR16 灯泡开始。下图表示预测值和实际值,其中 0 为 MR16,1 为其他。

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

作者图片

我使用 Google collaboratory 是因为它利用了 GPU 的使用,这将帮助您训练模型的速度比本地机器快 10 倍。你可能想把你的谷歌 collab 升级到专业版,以增加它的内存,并帮助它在你的屏幕关闭时不会断开连接。

训练验证和测试分割
训练:6003 张图像
验证:266 张图像
测试:383 张图像
由于我们有一个大型数据集,我们有足够的图像来验证和测试它,因此大多数图像都放在训练集中。

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

作者图片

这是训练集和验证集的结构,两者都应该具有类似的结构,每个标签都有一个文件夹,其中包含如上所述的相同图像。

正如您在上面的图片中所看到的,test 文件夹还应该包含一个单独的文件夹,所有的测试图像都在这个文件夹中(可以把它想象成“未标记的”类,这是因为 flow_from_directory() 期望在给定的目录路径下至少有一个目录)。

这些类的文件夹名很重要,用各自的标签名来命名(或重命名)它们,以便于以后使用。
一旦你把图片设置成上面的结构,你就可以开始编码了!

可视化数据:

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

作者图片

这是我最初试图分类的 6 类球茎。我首先检查了每个标签有多少张图片,以确保我的数据集是平衡的。

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

作者图片

检查每个标签有多少张图片,以确保数据集是平衡的。

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

作者图片

类别 mode = categorical 执行一键编码并存储标签。

  • 必须将目录设置为您的“n”类文件夹所在的路径。
  • target_size 是你输入图像的大小,每张图像都会被调整到这个大小。
  • batch_size: 每批从生成器生成的图像数量。
  • class_mode: 如果只有两个类需要预测,则设置为“binary”,如果没有设置为“categorical”,则在开发自动编码器系统时,输入和输出可能是同一个图像,在这种情况下设置为“input”。
  • shuffle: 如果您想要打乱正在生成的图像的顺序,则设置 True,否则设置 False。
  • **种子:**随机种子,用于应用随机图像增强和打乱图像的顺序。

让我们看看 class _ mode = categorical 从生成器中出来时做了什么?

我花了一段时间来了解生成器的输出以及它是如何存储图像和标签的,没有相关的文档,如下所示:

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

作者图片

要知道数据的组织方式是每批有 32 张图片。图像存储时图像中显示的标签为[a][b][c]其中:
[a]=图像的批次号[b]= b 取值 0 和 1 其中[a][1][c]存储图像的标签,[a][0][c]存储图像本身。[c]=该批次中的图像编号。

刚接触计算机视觉的人问过我好几次,CNN 的每一层都学到了什么? 下图显示了 CNN 每一层从图像中挑选和学习的内容。

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

来源:https://arxiv.org/pdf/1311.2901.pdf

现在我们创建我们的模型。第一步是用 Sequential()初始化模型。之后,我们展平我们的数据,并添加额外的 3 个(或更多)隐藏层。这一步是完全可定制的你想要的。我们制作了几个不同的模型,有不同的漏失、隐藏层和激活。

对于多类分类,最后一个密集层必须有几个与类数量相等的节点,然后是softmax激活,即你的模型的最后两层应该是:

model.add(Dense(num_classes))
model.add(Activation('softmax'))

损失最好也是分类交叉熵。我尝试了各种迁移学习模型,包括 ResNet、VGGnet 和 Inception,因为这些模型因其性能和特定的架构创新而广泛用于迁移学习。我试着转动这些模型的最后几层,但它们似乎没有给出更好的结果,因此,我认为它们不适合区分我使用的图像类型(即不同类型的灯泡)

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

作者图片

然后,在我创建并编译了我们的模型之后,我们将我们的训练和验证数据与我们之前提到的规范相匹配。最后,我们创建一个评估步骤,来检查我们的模型训练集相对于验证集的准确性。

这是我们的模型,现在训练数据,然后验证它。一个时期是模型在我们整个数据集上训练的次数。一批可以解释为少量摄入,训练,多摄入一些。在进入下一个时段之前,每个时段必须完成所有批次。用太少的历元训练会导致数据拟合不足,而用太多的历元训练会导致数据拟合过度。你也希望损失尽可能低。下面的图片将显示我们的数据集的准确性和损失。

下图显示了我们刚刚制造的机器对未知数据的预测能力。注意,它说它在 test_data 上进行测试。准确性是第二个数字。然而,这不是检查我们的机器性能的唯一方法。有两种很好的方法可以检验你的机器预测或分类的能力。其中一个是分类度量,另一个是混淆矩阵。
我们的分类指标显示,我们的模型对所有图像类别都具有相对较高的精确度,让我们知道这是一个有效的模型

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

作者图片

为了使用分类度量,我们必须将测试数据转换成不同的 NumPy 格式,NumPy 数组,以便阅读。这就是第一行代码所做的一切。第二个单元块接收转换后的代码,并通过内置的分类指标运行它,从而给我们一个整洁的结果。请注意,由于我们的生成器函数,我们不需要在这里手动标记我们的类,因为我们在接受输入时设置了 class = categorical。这里重要的因素是精确度和 f1 分数。分数越高,你的模型越好。

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

作者图片

正如我们在标准化数据中看到的,我们的机器非常擅长对灯泡进行分类。MR16 被误归类为 PAR203038,很可能是因为它们的结构相似。此外,PAR203038 可能因为同样的原因被误划为 MR16。

最后一个阶段是对图像进行测试。下面的单元块将实现这一点:

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

作者图片

第一个 def 函数是让我们的机器知道它必须加载图像,改变大小,并将其转换成一个可以在 GitHub 访问的数组。第二个定义函数使用预测模型和迭代函数来帮助正确预测图像。路径是我们定义图像位置的地方,最后, test_single_image 单元块将打印出最终结果,这取决于第二个单元块的预测。
这是我们的模型给出的最终结果:

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

作者图片

PRO HACK :你可以直接使用 Google Auto ML 模型来训练数据,然后尝试将模型权重和 model.json 融入到我们尝试构建的应用中。

在进行这个项目时,我遇到了谷歌的 Auto ML 软件,由于我能够获得 78%的准确性,即使在尝试了不同的转移模型和调整超参数后,我决定通过用 Auto ML 模型训练我的数据来验证我的模型。

AutoML 是一套机器学习产品,使机器学习专业知识有限的开发人员能够针对他们的业务需求训练高质量的模型。这是一个可以设计神经网络的神经网络。

我将分享我如何使用*Google Cloud AutoML Vision Edge从零开始训练一个定制的机器学习模型。*

您可以在以下位置了解更多关于 google edge 计算机视觉自动 ml 模型的信息:
我不想让教程变得冗长,并记录上面做得很好的训练您的视觉 edge 模型的步骤!

一旦我们准备好一个干净的数据集,我们就可以开始设置我们的谷歌云项目。

1.我们可以按照这个指南来创建一个谷歌云项目:

* [## 设置项目| Dataproc 文档| Google 云

登录您的 Google 帐户。如果您还没有帐户,请注册一个新帐户。在云控制台中,在…

cloud.google.com](https://cloud.google.com/dataproc/docs/guides/setup-project)

2.下一步是在 AutoML 页面上创建我们的数据集。这里,正如您在快照中看到的,我们将使用单标签分类。当图像属于一个类别时,使用单标签分类。在我们的灯泡识别问题中,每个图像将被标记为六个标签中的一个,即单类标签。在多标签分类中,一幅图像可以同时属于多个类别。

这个视频很好地解释了你如何在 Auto ml 中上传和训练你的数据,并带你一步一步地通过它。

3。导入所有图像

在这个初始项目设置之后,我们将使用“导入”按钮,导入狗和猫的文件夹以及它们各自的图像。

注意:最佳实践是将所有输出图像上传到 Google 云存储桶,然后从 AutoML 仪表板导入该桶。

上传后,我们可以在“图片”标签下看到所有的图片。这是你的数据上传后的样子,我建议你上传不同类别的 zip 文件夹到你的 bucket 中,这有助于这个过程更加高效和方便。

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

作者图片

4。开始模型训练

一旦你看到你的图像反映在 AutoML 仪表板,你训练你的模型。

使用 AutoML 训练该模型非常容易——转到Train选项卡并单击Train New Model。培训完成后,我们会收到电子邮件通知。

在训练之前,您应该决定您的模型将如何被使用—作为 API(在线预测)还是在边缘设备上(离线预测)。在线预测是测试结果的最佳方式,或者如果您希望通过 AutoML API 直接使用模型,也是最佳方式。它们更准确。离线模式节省了大量成本,可以在设备上运行。它们通常体积较小,可以在没有互联网连接的情况下运行。我们使用边缘设备,因为我对制作一个可以在任何机器上运行的应用程序感兴趣。

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

作者图片

对于模型的评估,我们知道精度指的是相关结果的百分比。另一方面,召回指的是被你的算法正确分类的总相关结果的百分比。
查看我们的灯泡分类器的召回率和精确度值。

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

作者图片

经过训练后,模型可以以 AutoML 提供的各种格式消费,如TF LiteCore MLTensorflow.js等集装箱出口格式。
TensorFlow.js 是一个帮助在浏览器中直接使用 ML 的库。AutoML 创建模型只需很少的时间,TensorFlow.js 是直接在浏览器中运行模型的最简单、最有效的方法。

这是一个有趣的问题,众说纷纭,比如浏览器广泛存在于所有设备中,无论是台式机、平板电脑还是手机。因此,浏览器中的 ML 可以产生很大的影响。从用户的角度来看,ML 模型可以很容易地在浏览器中建立,不需要任何驱动程序、库等。所有数据都保存在用户的设备上,不需要将数据发送到服务器。

使用 AutoML 的TensorFlow.js模型格式的过程需要两步:导出模型,然后加载进行推理。

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

作者图片

下面的分步说明将帮助您将任何基于 TF.js 的模型加载到浏览器中。
单击 Tensorflow.js 框后,它会下载如下所示的 bin 文件,这是您准备好部署后的目录外观。

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

作者图片

模型导出后,您会看到一个model.json文件,它包含张量信息以及权重文件名和包含模型权重的文件。将 bucket 中的所有文件下载到您的本地系统。

我们将介绍创建一个部署在 Heroku 中的 web 应用程序的过程,该应用程序可以由网络上的任何人使用,但是这里的说明是一个很好的尝试起点。

[## Edge TensorFlow.js 教程|云自动视觉文档

术语:参见 AutoML Vision Edge 术语页面,了解本教程中使用的术语列表。在本教程中…

cloud.google.com](https://cloud.google.com/vision/automl/docs/tensorflow-js-tutorial)

Github 链接可以在:
https://Github . com/aditi 310896/bulb detection/blob/master/multiclassmodeltrial 1 . ipynb*

用 PyTorch 从 LSTM 细胞到多层 LSTM 网络

原文:https://towardsdatascience.com/from-a-lstm-cell-to-a-multilayer-lstm-network-with-pytorch-2899eb5696f3?source=collection_archive---------8-----------------------

用 PyTorch 的实际例子理解 LSTM 单元的基础的指南

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

Pixabay

如何只用 LSTMCells 构建多层长短期记忆神经网络?

这篇博客的目的是展示 PyTorch 中 LSTMCell 类的实际应用。众所周知,PyTorch 提供了一个 LSTM 类来建立基于 LSTMCells 的多层长短期记忆神经网络。在这篇博客中,我们将通过一个实际的例子来解释如何使用 LSTMCells 手工构建这样一个神经网络。

博客组织如下:

  • 简介
  • LSTM 牢房
  • 来自 PyTorch 的 LSTMCell 类
  • 多层 LSTM

介绍

LSTM 网络是一种递归神经网络。众所周知,这些类型的神经网络能够正确处理可以表示为序列的数据,例如文本、音乐、频率、时间序列等。LSTM 架构的一个主要特征是它包含,门的功能是保存有意义的信息以及忘记无用的数据。然而,重要的是要提到 LSTMs 在训练时往往,本质上是因为要更新的参数数量。

如果你想深入研究 LSTM 核心,请看看这个惊人的资源:了解 LSTM 网络

如果你想避开 LSTM 细胞结构的机制和它内部的工作方式,你可以直接跳到 PyTorch 的 LSTMCell 类或者进入多层 LSTM。****

LSTM 细胞

首先,让我们了解一下 LSTM 细胞的机制。LSTM 单元主要由遗忘、输入输出门以及单元状态3 个门组成。那么,让我们来发现*“忘记”“输入”“输出”是什么意思。*图 1 显示了 LSTM 单元的架构。

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

图一。LSTM 细胞

遗忘门决定哪些信息是不相关的,不应该考虑。遗忘门由之前的隐藏状态 h(t-1) 和当前时间步长 x(t) 组成,其值由 sigmoid 函数过滤,这意味着接近 0 的值将被视为要丢弃的信息,而接近 1 的值被视为值得保留的有用信息。然后,根据遗忘门用要保持的信息更新单元状态。图 2 突出显示了构建遗忘门所遵循的操作。等式 1 显示了遗忘门的数学表示。

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

图二。忘记大门

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

等式 1。忘记大门

输入门决定什么信息应该是单元状态的一部分(LSTM 的存储器)。它由先前的隐藏状态 h(t-1) 和当前的时间步 x(t) 组成。输入门考虑两个函数,第一个函数通过 sigmoid 函数过滤先前的隐藏状态和当前的时间步长。第二个通过 tanh 函数过滤先前的隐藏状态和当前的时间步长。因此,在更新单元状态之前,两个输出(一个来自 sigmoid 功能,一个来自 tanh 功能)一起操作,其想法是 sigmoid 输出将确定来自 tanh 输出的哪些信息对于保持单元状态是重要的。图 3 突出显示了构建输入门所遵循的操作。等式 2 显示了输入门的数学表示。

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

图 3。输入门

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

等式 2。输入门

到目前为止,我们已经讨论了忘记门以及输入门。现在是时候介绍单元状态了。

单元状态被称为 LSTM 的存储器,它由遗忘门输入门更新。本质上来说,遗忘门定义了不应保存在存储器中的内容,而输入门定义了应保存在该存储器中的内容。图 4 突出显示了更新单元状态的过程。等式 3 显示了单元状态的数学表示。

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

图 4。细胞状态

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

等式 3。细胞状态

最后,我们有输出门,其结果产生新的隐藏状态。****输出门利用先前的隐藏状态以及当前的时间步长,其值由 sigmoid 函数过滤。并行提取当前单元状态,由 tanh 函数过滤,两个输出一起操作,以生成新的隐藏状态。图 5 突出显示了构建输出门的过程。等式 4 和等式 5 分别给出了输出门隐藏状态的数学表达式。

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

图 5。输出门和隐藏状态

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

等式 4。输出门

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

等式 5。隐藏状态

PyTorch 的 LSTMCell 类

到目前为止,我们已经看到了 LSTM 细胞的工作原理及其组成部分。现在是时候看看如何将 PyTorch 的实际输入调整到 LSTMClass 中了。

先来了解一下初始化 LSTMClass 时的输入输出参数是怎样的,以及使用初始化对象时的输入输出参数是怎样的。

为了被初始化,LSTMCell 类需要两个重要的参数

  • input_size: 指每个时间步的特征数量
  • hidden_size: 指的是在 LSTM 单元内的每个函数中要学习的参数的数量(即,它是每个 W 向量的大小,该向量复合了每个门以及单元和隐藏状态)

初始化后,LSTMClass 创建的对象接收三个输入:

  • 输入:包含待学习特征的张量。这个张量有一个形状( batchinput_size ),其中 batch 指的是批量大小, input_size 指的是每个时间步包含的特征个数。
  • h_0 :张量,将存储学习到的隐藏状态。这个张量有一个形状(*批量,*隐藏 _ 大小
  • c_0: 张量,它将存储单元状态(LSTM 的存储器)。这个张量有一个形状(批量隐藏 _ 大小)。

图 6 突出显示了输入*【t】隐藏状态(t-1)h(t) 以及单元格状态(t-1)*和 C(t) 的矢量形状。

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

图 6。突出显示矢量形状。

正如我们已经知道的,LSTMs 处理顺序数据。所以让我们用一个简单的例子来理解如何顺序地给 LSTMCell 馈电(即如何展开 LSTM 网络)。

假设我们有一个句子*“天空是蓝色的”,我们想把它引入 LSTM。因此,我们需要将这些单词转换成神经网络可读的格式。我不得不说,为了将单词转换成一种 LSTM 可读的格式 t,有很多选择,因为这些选择超出了本博客的范围,我将限制自己选择一个最常见的选择,那就是单词标记化*。

因此,为了将单词编码成 LSTM 可读的格式,我们首先需要将句子分割成一组单词(单词标记),然后我们需要将每个单词标记转换成索引标记形式。之后,我们需要使用一个嵌入器层,以便将每个索引令牌转换成一个嵌入向量。至此,我们已经拥有了为 LSTM 提供数据所需的一切,我们只需要将序列组织成一组时间步长,其中每个时间步长都将被分配一个批处理大小。

假设我们想要创建一组 2 个时间步长,其中每个时间步长包含 2 个批量大小,我们将有 2 个输入张量,每个张量都有一个形状( batch_size = 2input_size = 2 ),其中 batch_size 指的是每个时间步长的样本数, input_size 指的是嵌入维数。图 7 直观地解释了上述过程。

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

图 7。从原始句子到张量格式的可视化表示。

因此,为了向 LSTM 网络提供顺序数据,我们需要创建一个循环,其中每次迭代都将向当前 LSTM 单元提供一个具有 shape ( batch_sizeinput_size )的时间步长。因此,就前面的例子而言,每个时间步长将包含批量大小 2 和输入大小 2。在图 8 中,上面的图像通过使用基于单词标记的表示来表示展开的版本,中间的图像通过使用基于索引标记的表示来表示展开的版本,按钮图像通过使用基于嵌入的表示来表示展开的版本。(三个图像是等效的,顶部和中间的图像仅用于说明)。

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

图 8。展开的版本

是时候看看代码了。在 PyTorch 中,建议在构造函数中定义设置和层。因此,就上面提到的玩具示例而言,代码片段 1 显示了初始化应该如何进行。

代码片段 1。构造器

值得一提的是两个重要方面,第一个是嵌入层作为输入参数接收的 input_size ,注意它指的是词汇量,在这个玩具示例中我们只有 4 个单词,这意味着词汇量是 4。第二个重要的方面是 LSTMCell 接收的输入大小参数,注意它的大小是 embedding_dim ,在本例中是 2(与上面的例子完全一样)。

一旦我们准备好了构造函数,我们需要在*转发函数中工作。*首先,我们需要创建并初始化单元格状态以及隐藏状态,例如:

代码片段 2。单元格和隐藏状态初始化

在第 3 行和第 4 行中,隐藏的单元格状态分别被初始化,两者都有一个形状( batch_sizehidden_dim )。紧接着在第 7 行和第 8 行,两种状态都被初始化(在这种情况下,我使用 X 而不是普通的初始化,不过你可以选择你认为合适的那个)。

一旦我们初始化了隐藏的单元格状态,我们就可以将每个索引令牌转换成基于嵌入的表示,例如:

代码片段 3。从索引标记到嵌入张量

这里,嵌入层接收包含索引标记的张量作为输入,因此 out 变量被赋予具有形状的嵌入值的张量( batch_size,embedding_dim)。

现在,一切都准备好了,以饲料 LSTM,然而在这样做之前,我们需要适应的形状张量。我们只需要将第一维定义为时间步长的数量,因此我们继续执行以下操作:

代码片段 4。重塑张量

所以现在我们的 out 张量有了一个形状( *sequence_len,batch_size,embedding_dim)。*好了,是时候展开 LSTM 网络了:

代码片段 5。展现 LSTM

正如我们所观察到的,在循环中,我们用当前时间步长(即 *out[i】)来填充 LSTM 单元。*同样,通过该循环,隐藏状态单元状态被更新“I”次,其中“I”表示时间步长为时间“I”。

那么现在让我们来看看完整的前进函数:

代码片段 6。正向功能

多层 LSTM

现在,如果你想堆叠 LSTM 细胞,以建立一个多层 LSTM?图 9 显示了一个 2 层 LSTM 网络的简单架构。

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

图 9。多层 LSTM

我们首先需要做的是在构造函数中初始化第二个单元(如果你想构建一个“n”堆叠的 LSTM 网络,你需要初始化“n”个 LSTMCell)。

代码片段 7。细胞初始化

因此,我们需要为每个 LSTM 层初始化隐藏单元状态

代码片段 8。权重初始化

现在是时候养活 LSTM 网络了。第一层将接收包含每个单词的每个标记的嵌入版本的输入张量。第二层将在时间步长“t”接收 LSTMCell 的隐藏状态作为输入。

代码片段 9。展开 LSTM 网络

所以基本上就是这样!

紧接着,如果你想使用 LSTM 网络的最后一个隐藏状态,你应该使用最后更新版本的隐藏状态层 2。

因此, forward 函数应该是这样的:

代码片段 10。正向功能多层 LSTM

结论

这篇博客解释了 LSTM 网络背后的数学原理,特别是 LSTM 细胞是如何工作的。同样,还解释了如何实现 LSTMCell 类以及如何准备数据,以便仅使用 LSTM 单元构建 LSTM 神经网络和多层 LSTM 网络。

了解幕后的机制总是很重要的,这次我们分解了 LSTM 的组件,以及这些组件是如何用当今最流行和强大的深度学习框架之一 PyTorch 实现的。

从高级分析到有效分析

原文:https://towardsdatascience.com/from-advanced-to-effective-analytics-6fb8611ee627?source=collection_archive---------61-----------------------

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

张家瑜Unsplash 上拍照

了解并协调数据驱动型企业中的 Lukes 和 Yodas 的途径

在过去的十年里,企业的决策方式发生了根本性的转变。获胜的组织已经从一个个人经验和直觉为王的环境,转变为一个数据驱动的世界,在这个世界中,决策得到可量化的历史证据的支持。我们现在正处于下一次变革的边缘,即从简单分析到高级分析的转变。这种变化,像其他任何变化一样,需要在宏观和微观层面上提出发人深省的问题。转型领导者应该问的一个关键问题是,“从简单到高级分析的转变有意义吗,或者我们应该考虑另一条路线?”

随着在线课程的激增,高度宣传的成功和媒体的大肆宣传,高级分析(以各种形式营销)作为商业的下一步发展已经占据了中心舞台。这种宣传有积极的一面,因为以前认为数据价值不大的企业开始信任数据,并从中获益。然而,硬币的另一面并不那么闪亮。大肆宣传也造成了预期,让企业感到沮丧,许多员工失去了动力。

为了增加销售额和信任度,企业已经跳上了“站在人工智能和分析的最前沿”的潮流*。*这种策略是否能成功促进销售尚不清楚,但它确实为新的、有分析天赋的资源加入业务创造了期望。为了简单起见,我将这些资源称为“Lukes”。许多卢克加入了人工智能驱动的企业,希望“伸展四肢”,建立最新和最伟大的预测模型(这是可以理解的,因为这些模型在技术上很有趣,并增加了你的街头信誉)。不幸的是,卢克没有意识到需要进行的培训,也没有意识到他们在商业中的核心技能似乎是不切实际的。这导致了卢克内部的沮丧和消极情绪。随着业务资历的增加,技术理解能力的下降加剧了挫折感。

不管企业如何推销他们的分析能力,其中有一个共同的事实。企业希望从他们的数据中获得可操作且可信的见解。很少重视所使用的方法或技术。相反,当从数据中提取的洞察力允许卓越的解决方案时(特别是在竞争激烈的市场中),真正的价值来自于分析能力。当考虑在成功的数据驱动环境中运营的企业时,您会发现一些企业领导者特别擅长以最小的复杂性提取这些见解。从现在开始,我将称这些领导人为“Yodas”。

为了抑制挫折感,卢克斯获得了解决问题的极大自由,而商业领袖期望从他们的解决方案中获得有限的价值。这种方法确实在短期内减少了挫折感,但是,会导致很大一部分分析工作不再“有效”,无法被 Yodas 或企业使用。

有效分析

为了平衡分析工作对 Yodas 的有用性和 Lukes 的挫折感之间的权衡,提出了“有效分析”的概念框架。

为了介绍有效分析的概念,想象对于每个问题都有无限多种可能的分析解决方案。此外,这种简单的解决方案从简单到高级/复杂不等。

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

图一。所有解析解都存在的平原。

每个问题的解决方案都会落在这个平原上的某个地方,确切的点取决于尤达和卢克之间的关系。尤达自然喜欢更简单、更容易理解的解决方案,而卢克喜欢更复杂、更先进的解决方案。解决方案落地的准确位置将取决于每一方展现的“武力强度”。各方的“力量强度”将取决于他们各自的可信度,以及问题的商业重要性。

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

图二。最终的解析解将取决于卢克和尤达所施加的力。

不幸的是,没有一个框架将卢克斯和约达斯纳入同一个参照系。相反,尤达或卢克做出了妥协,导致至少一方遭受损失。

有效的分析框架试图将 Lukes 和 Yodas 纳入同一个参考框架。这是通过向解决方案平面添加另一个维度来实现的。新的轴负责衡量解决方案从简单到高级的有效性。

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

图 3。效力的轴心

使用这种方法,并从其他研究领域窃取一些理论,可以为每个问题创建有效的前沿解曲线。

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

图 4。有效性边界和有效分析领域

所得曲线上的每个解决方案都有一定的分析有效性。此外,在构建详细的解决方案之前,Yodas 和 Lukes 可以很容易地确定并商定一组有效的分析解决方案。这种透明度将使陆客对业务需求有所了解,减少他们的挫折感。对于 Yodas 来说,这种方法将允许他们最终获得可用且值得信赖的解决方案,并且随着时间的推移,获得非常强大的 Lukes。

企业如何创造有效分析的文化?

这是一个很难回答的问题,主要是因为每个企业都是独特的,没有单一的解决方案。

在进入细节之前,需要进行一个重要的区分。有效分析的文化是让数据引领方向的下一步,这不是第一步。如果你正在阅读这篇文章,它假定你的企业已经有了数据驱动的思维模式,并且数据的价值已经实现。向数据驱动的思维模式迈出第一步是另一回事,这里就不讨论了。

让有效分析的环境扎根的关键是与雷伊·达里奥的彻底开放和透明的概念相一致

在大多数企业中,即使是那些扁平化的企业,Yodas 和 Lukes 之间也有明显的界限。在这些独立的领域中运作导致了卢克斯和约达斯的主观现实之间的错位。通过尤达斯培养真正的商业透明度,卢克夫妇能够更好地理解大多数商业环境与他们接受培训的学术环境明显不一致。这需要卢克调整他们的重点和价值定位,关键的调整是区分什么是华而不实,什么是为企业增加真正价值的技能。

此外,培养这种透明度会鼓励高层领导(包括尤达斯和共和国的其他人)在高级分析领域发展自己。对高级分析的概念性理解使 Yodas 能够更好地可视化“有效解决方案边界”,了解提议的解决方案在边界上的位置,并在整个空间提供更有效的指导。

认为这一领域应该与其个人技能相分离的 Yoda 冒着以下风险:a)落后于拥抱数据驱动世界下一步的 Yoda,b)无法吸引或留住 Lukes,因为他们的特定技能没有通过增长机会得到回报。

理解原力之道

进入细节,下面是 Lukes 和 Yodas 需要理解/学习的一些具体要点,以实现一致并实现有效分析的文化。

卢克夫妇必须了解:

  • 最酷/最准确的模型/技术并不总是问题的最佳解决方案。这在一开始对他们来说没有意义,甚至可能会有很大的阻力,但是给他们时间,他们会发现有时电子表格是这项工作的最佳工具。
  • 您正在解决的问题应该作为相关技能/技术的指南。不要每个问题都拿着深度学习的锤子。
  • 你的时间耗费金钱。用这个来计算你正在构建的解决方案的成本,然后问自己这样一个问题,“我会在我正在做的事情上花那么多钱吗?”如果不是,那么你需要重新考虑你的方法。

从尤达的角度来看,重要的是要知道:

  • 整个分析景观。是的,这看起来很专业也很吓人,但是如果你真的相信这是你的业务发展的方向,那就投入进去吧。如果不是,那就值得重新考虑你雇用陆客的理由。
  • 数据驱动进化的每一步都比上一步更大。这表明,有效的分析不是企业可以掉以轻心或对冲赌注的运动。在这个领域的承诺问题可能会导致很少的价值收益和失败的自我实现。为了增加价值,信任和信念需要放在这个方向上。
  • 不要屈服于人工智能热潮。如果你雇佣卢克通过“爱”东西来解决你的问题,你很可能在浪费你和他们的时间。
  • 确保你有一个 Lukes 可以工作的环境。不要雇佣卢克,指望他们创造奇迹。你会很失望,甚至可能以一个维达(一个真正优秀的卢克变成了负面)而告终。
  • 卢克不知道原力之道(即商业如何运作),所以给他们指导。如果你不这样做,你可能会得到非常酷的解决方案,但是没有办法实现或使用它们。

结论

干得好!你已经完成了这个想法(显然人们通常不会坚持这么久)。我留给你这条忠告。如果你是一个正在寻找尤达的卢克,我相信你会考虑到以上几点。如果你是一个已经有卢克的尤达,请认真对待这一点,并在你的业务中寻求结盟。如果你是一个带着维达的尤达…好吧…愿你永远幸运…

从业余到数据科学家——3 个月,够不够?

原文:https://towardsdatascience.com/from-amateur-to-data-scientist-3-months-is-it-enough-185a21956f94?source=collection_archive---------31-----------------------

数据科学培训师视角的故事

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

绿色变色龙Unsplash 上的照片

“短短 3 个月成为数据科学家!我们将保证"

这段话是你经常从数据科学训练营广告中看到的吗?虽然这些话可能和你在那里看到的一样,但是你明白了。许多训练营会试图在尽可能短的时间内向推销成为数据科学家的前景。

虽然真的有可能吗?从对数据科学一无所知到成为一名有天赋的数据科学家?这是我从训练营的一位前数据科学培训师那里得到的观点。

数据科学训练营

为什么 Bootcamp 有足够的勇气做出这样的声明?我们首先需要知道就业市场想要从数据科学家那里得到什么。下面我举一个我在 LinkedIn 上找到的数据科学家职位需求的例子。

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

数据科学职位发布要求(来源:LinkedIn)

上面是一个典型的数据科学家招聘广告,你可以在任何地方找到。除了工作经验,这里列出的任何其他技能特别是我圈出的是技术技能

这是大多数数据科学训练营经常致力于实现的目标;让训练营的学生具备技术技能,以确保他们能够参加工作面试。

如果我们看一下数据科学在线课程和训练营,学习大纲将遵循类似的方面:

  • 学习 Python/R(编程语言)
  • 学习可视化包
  • 学习 SQL
  • 学习机器学习
  • 学习基本概率/统计

这是数据科学训练营经常提供的内容,也是我在担任数据科学培训师期间教给学生的内容。

那么 3 个月的时间学会以上所有技能,保证数据科学家这份梦寐以求的工作,够吗?简短的回答是没有,但是总有一个异常的空间。我来解释一下原因。

培训师的观点

数据科学训练营

数据科学培训师将在您的数据科学训练营的学习过程中为您授课。不管是好是坏,当教一个学生时,并不是所有的教练都有相同的经验和技能;也不是训练营机构本身——有些是为了销售。

在我担任数据科学培训师期间,我的工作场所显然没有准备好合适的学习材料和合格的教师。

当然,有一个来自 web 和开发编程背景的培训师,我承认他们的技能是神一样的,但教授数据科学?这是一个很大的不。

培训师大多是年轻人,他们因为编程技能和一些 Udemy 幻灯片课程而被迫教授数据科学。此外,在我加入公司时,我是唯一一个真正有数据工作经验的人,所以这对我来说是一个很大的惊喜。

有了这样的经历,我总是对数据科学训练营持保留态度。这是我作为前数据科学家培训师的第一个观点:

"申请数据科学工作需要技术专长,但并非所有数据科学训练营的质量都一样。有些只是伪造的,会阻碍你成为数据科学家的机会。

考虑到这一点,选择一名合格的数据科学家训练营是你在三个月内成为数据科学家的第一步——或者像广告宣传的那样。

老师和学生

当你有一个合适的教学机构和合格的老师,现在我能成为一名数据科学家吗?你的机会会更高,但有一件事我需要提醒你;不是每个人都会放弃在数据领域的工作。这就是这个世界的残酷现实,每个人都有天赋,但每个人都有自己的天赋。数据科学工作值得吗?你可以在这里阅读我的观点。

[## 数据科学家的工作—值得做出牺牲吗?

长话短说——的确如此(至少对我来说)

towardsdatascience.com。](/data-scientist-job-is-it-worth-the-sacrifices-made-efdf34139aa6)

当我在做培训师的时候,我见过各种各样的学生——从有经验的天才到完全的业余爱好者。我可以看到一个学生跟上学习材料和理解新概念的能力,从真的很快到需要更多的时间来学习。

我很难确保每个学生都理解这些材料,因为我们的时间有限——训练营的广告是三个月,记得吗?。在短短的时间内,我需要教授所有可用的学习材料。

当然,对于拥有快速学习技能的学生来说,这是轻而易举的事情,但对于没有掌握数据科学技能的学生来说,这将是一次痛苦的经历。

从我作为一名培训师的角度来看,在三个月内成为一名数据科学家的广告对一些学生来说当然是可能的,但对另一些学生来说几乎是不可能的,因为他们的能力不同。

所以,我的第二点是:

并不是所有的人都适合从事数据领域的工作,尤其是需要较长的时间来掌握必要的数据技能。如果你更加努力的话,也许可以,但是肯定比广告上说的三个月时间要长。

我的建议是,如果你对自己的技能不确定,尝试学习哪种数据科学家技能,甚至在参加数据科学训练营之前就做好准备。这会对你有很大帮助。

训练营后

在承诺的时间和从训练营毕业后,我现在是一名数据科学家吗?我不这么认为,现在是最难的部分——获得工作面试。

我见过许多有才华的学生连面试都很难,更不用说获得工作机会了。有些训练营提供与各种公司面试的机会,但有些没有。尽管有些学生在面试时仍然很难接受。

为什么那个学生过得很艰难?这是因为大多数学生只教授数据科学技术技能;忘记了许多其他方面,即业务和沟通。

我知道很多容易找到工作的学生并不是最聪明或最有才华的,但他们有很好的沟通技巧并了解公司业务。学习这项技能对我来说是从其他候选人中脱颖而出的最重要的技能。你可能想在我的其他文章中了解更多关于数据科学家的商业技能。

[## 学习业务,成为伟大的数据科学家

每个数据科学家的核心。(抱歉,不是编码的问题)

towardsdatascience.com](/learn-the-business-to-become-a-great-data-scientist-635fa6029fb6) [## 数据科学家必须了解商业 x 统计

为什么业务和统计之间集成对于数据科学家来说至关重要

towardsdatascience.com](/data-scientist-must-know-business-x-statistics-7bb8575a9525)

无论如何,成为数据科学家重要的不仅仅是技术技能,还有业务和沟通技能。事实上,如果你和一些培训师关系很好,他们甚至会给你推荐一份数据科学的工作(这是我自己的经验)。

所以,我的第三点是:

"当你申请成为数据科学家时,训练营的技术技能并不是公司寻求的唯一东西。你可能需要另一种技能,比如商务和沟通。

尽管如此,即使你缺乏商业技能,仍然有可能获得一份数据科学家的工作。毕竟这个世界是一个奇怪的地方,有许多变量会影响你的就业机会。

结论

总之,我想说,成为一名数据科学家很难,尤其是在三个月内。这是因为:

  • 一些训练营不够资格教你必要的数据科学技能。
  • 不是每个学生都有足够的天赋在短时间内跟上学习材料。
  • 完成训练营后需要很多必要的技能。

如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。

如果您没有订阅为中等会员,请考虑通过我的推荐订阅。

从分析到仪表板——连接笔记本和表格

原文:https://towardsdatascience.com/from-analysis-to-dashboarding-connecting-notebooks-to-tableau-483fa373f3a4?source=collection_archive---------19-----------------------

现实世界中的数据科学。

这个故事讲述了在尝试和失败了许多方法后,我是如何从笔记本上创建梦想仪表盘的。在这里,我分享我是如何将我的数据帧连接到 Tableau 的。希望这篇博客能帮助那些在笔记本和仪表盘之间挣扎的人。

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

卢克·切瑟在 Unsplash 上的照片

数据分析的大背景不仅仅是数据和获得见解,还包括让每个人都能理解这些信息。当时,作为数据科学的初学者,我接触了 Jupyter 笔记本电脑。笔记本就像其他演示媒体一样。它由单元格组成,您可以在其中放置代码,然后在单元格下运行和输出,它还带有一个 markdown 功能,您可以用基本的 HTML 记录您的代码。这些笔记本用于探索性数据分析,便于与队友分享您的工作成果。尽管它有 Plotly、matplotlib 等库,但对于非技术用户来说,它仍然不是现成的。

例如,以新冠肺炎为例。世界各地的每个人都关心了解他们国家的日常状况。他们会选择一个记录了更多单元格、代码的笔记本,还是一个以交互形式分享你的分析可视化的仪表板?这就是为什么每个数据分析师都需要具备讲故事的技能。仪表板就像讲故事一样,你从你所获得的信息中构建一个故事,这个故事应该以一种不会让他们转移视线的方式呈现。

所以问题是,我如何将我的 jupyter 笔记本连接到 Tableau,而不需要在 Tableau 中安装 python?

答案很简单。Tableau 只需要数据。jupyterlab 的数据帧可以保存为 CSV、Xls、JSON 等格式,但在实时分析中,当数据每天都在更新时,每天从 jupyter 笔记本下载数据并上传到 Tableau 是低效的。

但是有一个解决方案,尽管笔记本电脑不支持数据库,因为它们的唯一目的是分析数据集。

如何这些分析的数据集,准备可视化是发送到谷歌使用谷歌 API 表。因此,即使数据在每次刷新我们的笔记本时不断更新,我们从在线门户网站读取的数据也会在分析后自动保存到 google sheets,tableau 可以连接到这些数据表。

因此,创建实时仪表板的任务非常简单。你要做的就是

  • 创建笔记本
  • 从在线门户数据 API 读取数据到熊猫数据框架
  • 分析并创建一个干净而精确的数据报。
  • 将数据发送到 google sheets。
  • 让我们将以下库导入笔记本
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from df2gspread import df2gspread as d2g
  • 现在,在做任何事情之前,请按照以下说明获得对您的工作表的凭据访问权限:
  1. 前往谷歌开发者控制台创建一个新项目(或者选择一个你已经有的项目)。

2.在“APIs & Services > Library”下,搜索“Drive API”并启用它。

3.在“APIs & Services > Library”下,搜索“Sheets API”并启用它。

4.启用项目的 API 访问如果你还没有这么做的话。

5.转到“APIs &服务>凭据”并选择“创建凭据>服务帐户密钥”。

6.填写表格

7.点击“创建密钥”

8.选择“JSON”并点击“创建”

您将自动下载一个带有凭证的 JSON 文件。它可能看起来像这样:

{
    "type": "service_account",
    "project_id": "api-project-XXX",
    "private_key_id": "5ty … bg4",
    "private_key": "-----BEGIN PRIVATE KEY-----**\n**NrDyLw … jINQh/9**\n**-----END PRIVATE KEY-----**\n**",
    "client_email": "443000000000-msmhj@developer.gserviceaccount.com",
    "client_id": "445 … hd.apps.googleusercontent.com",
    ...
}

记住下载的凭证文件的路径。同样,在下一步中,您将需要该文件中 client_email 的值。转到您的电子表格,并与上面步骤中的 client_email 共享。

  • 创建一个新的 google 工作表,将键复制到一个名为 spreadsheet_key 的变量中。粗体字将是我的工作表的关键。可在打开工作表的链接中找到)
[https://docs.google.com/spreadsheets/d/**1vd6hDT6k8lcWNMDYz13kqW7zXnIX5TVED9–4Kq7EAQnvI**/edit#gid=0](https://docs.google.com/spreadsheets/d/1vdDT6k8lcWNMDYz13kqW7zXnIX5TVED9-4Kq7EAQnvI/edit#gid=0)
  • 将以下代码添加到您的 python 脚本或笔记本中。另外,友情提示,在复制下面的代码之前,您刚刚下载的 JSON 文件和 python 脚本应该在同一个文件夹中。
scope = [‘[https://spreadsheets.google.com/feeds'](https://spreadsheets.google.com/feeds'),
 ‘[https://www.googleapis.com/auth/drive'](https://www.googleapis.com/auth/drive')]
credentials = ServiceAccountCredentials.from_json_keyfile_name(
 ‘myfile.json’, scopes=scope)
gc = gspread.authorize(credentials)spreadsheet_key=’[**1vd6hDT6k8lcWNMDYz13kqW7zXnIX5TVED9–4Kq7EAQnvI**](https://docs.google.com/spreadsheets/d/1vdDT6k8lcWNMDYz13kqW7zXnIX5TVED9-4Kq7EAQnvI/edit#gid=0)’
  • 现在清理您的数据集,并将准备可视化的数据保存到数据框中。
  • 复制并粘贴以下代码,将您的数据帧发送到 google sheets。
wks_name= “nameofyoursheet”
d2g.upload(df, spreadsheet_key, wks_name, credentials=credentials, row_names=True)
print(“Data upload success”)

wks_name 将是您的工作表的名称,df 将是您的 dataframe 变量。现在,每次刷新笔记本时,数据都会自动更新到工作表中,您可以通过数据 API 将数据读取到笔记本中,这样就可以轻松地使用 jupyter notebook 进行实时分析。

  • 完成以上步骤后,打开 Tableau,连接你的 google sheets。要下载 Tableau,请点击这里
  • 若要连接,请前往服务器> google sheets

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

将 google sheet 添加到 Tableau 数据连接后(数据来源: OGD 平台印度

  • 使用工作表中的数据框在 Tableau 中创建可视化效果。每个可视化都可以在表格中完成,这就是他们所说的 Tableau。这些表可以拖放到仪表板中。将您的仪表板发布到 Tableau Public,就大功告成了。

现在,由于数据每天都在变化,我们所要做的就是刷新笔记本和 Tableau 数据连接。你所有的可视化会自动更新。

Tableau 相对于其他可视化库(如 Plotly 和 matplotlib)的一个优势是,你可以零编码地获得可视化效果,这是非常专业的。

点击此处查看我使用 jupyter notebook(用于分析)和 Tableau(用于可视化)制作的一个仪表板。

神经网络优化轨迹的可视化

原文:https://towardsdatascience.com/from-animation-to-intuition-visualizing-optimization-trajectory-in-neural-nets-726e43a08d85?source=collection_archive---------30-----------------------

从动画到直觉

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

飞越纽约风暴王艺术中心,2018 年夏天。我在 DJI 马维克航空公司拍摄的照片

更新:我已经把代码移植到一个 Python 包 这里 。请随意试验并制作类似本文中的情节!

在前中,我展示了一些线性回归和逻辑回归的训练过程的动画情节。对他们如何“学习”有一个良好的“感觉”是有帮助的,因为在应用更复杂的模型之前,他们可以被用作基线。虽然大多数深度神经网络也使用基于梯度的学习,但类似的直觉要难得多。一个原因是参数是非常高维的,涉及到许多非线性,很难在我们的脑海中描绘出优化过程中发生了什么。与计算机不同,我们只能感知小于或等于 3D 的空间。

在这篇文章中,我将展示更多的动画情节,让你一窥这些高维空间。我使用的模型是带有 ReLU 激活的全连接多层感知器。然后,我们可以直观地看到宽度和深度如何影响损失情况和优化轨迹。

让我们考虑这个由 3 个类组成的 2D 数据集。我们人类一眼就能看出这种模式是由某种螺旋函数产生的。我们只需不到一秒钟就能识别它,同时,我们会自动为看不见的数据产生一种外推方法。这是因为我们从出生起就接受了这种视觉任务的训练(也不要忘了我们只能在非常低维的空间中做这件事)。在这里,我将训练几个人工神经网络来对这个形状进行分类,并在参数空间中检查训练过程。

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

在继续之前,我想提出一个重要的问题:我们如何在高维参数空间中可视化优化轨迹?

最直接的方法是找到两个方向来穿过高维空间,并可视化该平面上的损失值。但是用哪两个方向呢?有无限多的潜在方向可供选择。在论文 中用神经网络可视化损失景观,李等。艾尔。 ,作者讨论了几种方案,并采用了一种使用 PCA 进行降维的方案。下面是动机的简要总结:

  1. 2 高维空间中的随机向量很可能是正交的,并且它们很难捕捉到优化路径的任何变化。路径在两个向量所跨越的平面上的投影看起来就像随机漫步。
  2. 如果我们选择一个方向作为从初始参数指向最终训练参数的向量,而随机选择另一个方向,可视化将看起来像一条直线,因为第二个方向与第一个方向相比没有捕获太多的变化。
  3. 如果我们在优化路径上使用主成分分析(PCA ),并获得前 2 个成分,我们可以用最大方差可视化 2 个正交方向上的损失。

因此,我使用 PCA 方法来获得更好的优化路径。请记住,这不是路径可视化的“最佳”方法,因为它可能不适用于其他目的。例如,如果您的目标是比较不同优化器采用的路径,例如 SGD 与 Adam,这种 PCA 方法将不起作用,因为主要成分来自路径本身。事实上,不同的优化器具有不同的路径和不同的 PC 方向,即损失情况的不同部分,使得不可能进行比较。为此,我们应该使用两个固定的方向。

这里的架构是通过改变和组合下面的两个属性产生的

  • 隐藏层数:1,5,10
  • 每个隐藏层中的神经元数量:5,20,100

总共 9 种配置。

让我们看看不同模型产生的决策区域/边界旁边的优化路径。通过显示决策区域,而不是依赖于生成数据集分割的验证/测试准确性,我们可以更好地直观了解不良拟合,因为我们已经有了先验知识,即头脑中的“螺旋”预期

首先,让我给你展示一下逻辑回归在这种情况下的作用,

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

逻辑回归

显然,它的 3 条直线做得不好,但它的损失景观是完全凸的。

从第一个配置开始:1 个隐藏层和 5 个神经元。每个带有 ReLU 的神经元本质上是一条直线,有一边被激活。

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

1 个包含 5 个神经元的隐藏层

从逻辑回归来看,这是一个明确的进步,但 5 个神经元无法捕捉螺旋的弯曲形状,并努力达到高精度和低损耗值。损失情况似乎大多是凸的。

我们看到增加了更多的神经元

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

1 个包含 20 个神经元的隐藏层

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

1 个包含 100 个神经元的隐藏层

请注意,每个主成分捕获的方差都标在轴上。顶部组件几乎总是获得 95%+这部分是由这些数据的性质和网络的架构决定的。在论文中,作者还观察到类似的行为,即对于 CIFAR-10 数据集和各种架构,优化路径位于非常低维的空间中。

接下来,5 个隐藏层,

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

5 个隐藏层,每个层有 5 个神经元

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

5 个隐藏层,每层 20 个神经元

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

5 个隐藏层,每层 100 个神经元

通过 5 个隐藏层,PC-2 子空间中的损失景观变得明显不那么凸。对于窄的 5 个隐藏层乘以 5 个神经元的设置,我们可以猜测高维景观是高度非凸的,并且优化器很快陷入局部谷并产生不良拟合。

有了 20-100 个神经元和 5 层,优化器可以非常快地达到接近零的损耗。进一步的训练只是让它波动,出现意想不到的“小故障”。正在发生的是,神经网络试图用数据所在的 2D 空间之外的奇怪的高维形状来拟合这些数据。它过拟合得很快,但并没有像我们直觉上所做的那样真正捕捉到底层的数据生成机制。

事情变得有点疯狂的 10 个隐藏层。

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

10 个隐藏层,每个层有 5 个神经元

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

10 个隐藏层,每层 20 个神经元

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

10 个隐藏层,每个层有 100 个神经元

它们都有相同的特征,比如很快达到接近零的损失,但却产生奇怪的拟合,不能很好地概括。在其他条件相同的情况下,窄而深的神经网络比宽而浅的神经网络更难训练。

看看这个薄而深的 20 层网络,每个隐藏层有 5 个神经元,损失景观是如此不凸,它只是卡住了,变得不可捉摸。

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

的论文更详细地讨论了神经网络属性的几个方面。作者研究了网络深度、宽度、初始化、跳跃连接的影响,以及损失景观几何的含义。**一个关键要点是,跳过连接对于使深度网络更容易训练至关重要。**如果你对为什么我们可以训练深度神经网络这个问题感兴趣,我强烈推荐这篇论文。

一图抵千言 *。*这里的每个动画情节都是 50 张图片,我们在这篇文章里有 21 张。比较不同配置之间的历元数、损失值和准确度,可以对基本神经网络的学习过程有一个“感觉”。同样的方法可以用来可视化更大更复杂的架构。

尽管今天对深度学习进行了大肆宣传,但人工神经网络仍处于早期阶段。许多技术是经验性的,还没有理论支持。获得经验的最好方法是通过反复试验。一旦深度学习的学生在基础上发展出一些直觉,我推荐 fast.ai 提倡的自上而下的学习方法。许多科技上的突破都是实验过程中的偶然事件,而不是理论推导的自然结果。人们通常理解为什么某样东西在应用了几年后会起作用。所以不要害怕未知,把手弄脏就好,多培养模特!

上看我的其他帖子,或者在 上关注我的

参考

从艺术到分析

原文:https://towardsdatascience.com/from-arts-to-analytics-d48f78848056?source=collection_archive---------77-----------------------

一个艺术专业的学生如何学会用数字画画

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

照片由莫仁·许Unsplash 上拍摄

就在新加坡经济因新冠肺炎而关闭的三天前,尽管新加坡颁布了禁止人们旅行的禁令,我还是决定踏上一段旅程,让这位文科专业的学生(我)穿越未知的科学宇宙。

最初,我在考虑加入一个数据分析训练营,但我的研究没有提供任何可信和有价值的来源。当我联系那些完成了新兵训练营的人时,他们中的一个引导我去寻找在线学位课程。几个小时后,我发现自己全身心地投入到了佐治亚理工学院的分析学硕士课程中。

我很确定这是一时冲动,到周末我会意识到我有多疯狂。

差不多两个月过去了,我已经清醒过来,我断定自己疯了。但不是因为我认为这是一个错误的决定,而是因为我仍然认为这是正确的。

当我 20 多岁的时候,回到大学,我觉得我们都陷入了自己专业的刻板印象中。漂亮的书呆子从事商业管理,运动员和戏剧极客从事国际研究,数学不好的人从事通信。同学们在我们的数学课上会耸耸肩说,“哦,我们不应该擅长数学。我们在通讯!”这是一个方便的借口,到我们在一起的四年结束时,这是我们内在的真理。

除了简单的算术,我想我会尽可能远离数学,因为我相信我会与画板打交道,而不是梦想商业活动。然而,今天,在任何工作场所,熟悉数字和指标、查找数据、能够分析和可视化数据正成为一个额外的优势。尽管如此,我想我记得数学至少得过 B。但是另一周,当我翻出成绩单准备申请研究生时,我发现我的数学成绩是大大的 c。

我吓坏了!但是,我现在如何进入分析领域呢?

检查一下先决条件,招生网站是这样说的:

至少一门大学水平的课程或概率/统计、Python 计算机编程、微积分和基本线性代数方面的同等知识。

我差点死掉。

我觉得自己爆炸成无数个小碎片,然后有人按下了倒带键,我回到了自己的身体里,凝视着客厅地板的天花板。

有趣的是,我惊讶地坐起来,然后打开一个新的浏览器标签,开始输入:“在线大学水平的数学和编程课程。”

当我感到震惊时,我发现自己注册了一门 cs 1301 Python 编程入门课程和一门六门课程的数学课程,这门课程将带我从线性代数到微积分再到概率和统计。

我想,“哦哦”,然后令人惊讶的是,“哦有趣!”

问题是,有趣可能不是描述它的最好的词。即使我每天早上照镜子,告诉镜子里的自己我非常需要的肯定,我的数学还是没有更好。

“你很擅长数学!你是个天才!你能做到的!”

在过去的几周里,我看到自己在解决编码问题,我(自己)想出了如何将 215 这样的整数转换成 11010111 这样的 8 位二进制数。我从来没有想过,我可以创建一个程序来做这件事。我的意思是,我从来没有想过我能告诉你什么是 8 位二进制数。

我认为这也有助于我参加的编程课程非常令人鼓舞,有时甚至是彻头彻尾的哲学。在翻阅材料时,我看到了这段关于调试的文字:

“一个好的程序员不是从不出错的人;一个好的程序员知道如何诊断和修复出现的错误。”

作为一个带着跨越我大半辈子的有限信念和刻板印象来到这里的人,我知道犯错误是旅程的一部分。现在,每当我写代码或解决数学问题时,我不再试图第一次就做对。它帮助我将问题分解成更小的块,测试它,并找出错误在哪里。这是一件很酷的事情。这可能也是让我走上这条路的原因。

不过说真的,我想象着我现在随时会举起双手说我已经受够了。但是每天我都兴奋地坐下来,看着问题,然后试图解决它们。

我知道我仍然需要记住我的二次方程。当看到分数、平方根或任何我没有遇到过的数学符号时,我仍然在研究我的第一反应——我只能说这是很多,因为我不想去数它们。

现在想想,以前还有哪些事情是我因为先入为主的观念而讨厌的?今天,我还拥有哪些不再为我服务的身份?有多少次我退缩了,因为我甚至在开始之前就把自己从等式中剔除了?还有,那是数学双关语吗?😏 )

我知道路很长,我必须完成所有的先决条件,甚至在我申请硕士课程之前就有良好的声誉。我不能保证我会被录取,尽管我知道我会尽最大努力。如果有什么不同的话,我确信至少这个通信专业的学生可以从中得到一个好的故事。

从业务需求到运行应用的大数据

原文:https://towardsdatascience.com/from-business-requirements-to-big-data-running-application-1c269b91a7d6?source=collection_archive---------65-----------------------

揭开大数据应用的面纱

大数据工具和技术—数据存储框架

如果你仍然不确定你是否正在处理大数据应用,我鼓励你阅读文章 处理大数据应用

在本文中,我将深入介绍主要的大数据工具和技术,它们可以满足您构建运行良好的大数据应用程序的所有目的。

当你看一看大数据生态系统时,你会对你可能注意到的工具的数量感到惊讶和困惑,并且会产生许多问题:我们需要知道所有这些工具吗?可供选择的最佳工具有哪些?有没有一些工具比其他的更好?如果我们只是在寻找某些功能,如处理大量数据的存储或实时分析,我们需要使用什么?

这些问题和更多的问题可能会造成这种混乱,这将使大多数具有相当好的专业水平的人迷失在这个领域。这些问题将在接下来的章节中回答。

我们需要知道现在市场上所有的工具吗?

我宁愿说不!你不需要知道所有可用的工具,只需要知道你需要什么。

为了消除混淆,市场上的工具根据其功能分为不同的类别,如下所示:

  1. **数据存储框架:**这些框架是为了处理基于分布式存储机制的海量数据而构建的。这些分布式存储机制通常支持复制和分区数据,以便处理节点(主机)中的任何故障转移,并使它们始终可供用户或其他应用程序使用。
  2. **数据处理框架:**这些框架有一个特定的角色,通过对数据应用各种处理来概括,包括过滤、清理、转换等等。这些工具通常以分布式方式实时执行它们的任务,考虑将记录分成多个节点,并并行应用不同种类的处理任务。
  3. **数据采集框架:**这些框架的作用就像一个排队机制,它们确保每个记录都不会被遗漏。从而确保推送到这些框架的每个记录的交付保证。它们通常还支持复制数据,以避免任何节点发生故障时的任何数据丢失。
  4. **数据可视化框架:**这些框架是理解大数据应用程序生成的结果的关键。这些结果是决策的基础。负责决策的经理将使用图表和不同种类的可视化小部件来进行所需的推理。

在本文中,我将详细讨论数据存储框架,我完全知道一篇文章对于如此庞大的工具和框架集是不够的,因此,我将更多地考虑大数据的核心及其所有不同的架构,并尝试列出当今市场上被认为非常重要的多种其他工具。

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

imgixUnsplash 上的照片

Hadoop —大数据的核心

简而言之,我想提一下 Hadoop 是基于 2003 年发表的 Google 文件系统(GFS)论文创建的。这篇论文是引领大数据时代的核心工作。在揭示了 GFS 的秘密之后,Hadoop 的开发开始付诸实践,成为一个名为 Apache Nutch 的项目,该项目于 2016 年转移到新的 Hadoop 项目,其中发布了第一个版本。Hadoop 是第一个开源、可靠、可扩展的计算框架,能够处理数 Pb 的数据。它的核心是基于 Java 编程,带有一些 C 和 shell 脚本中的原生代码。

你需要知道的是,Hadoop 主要由两个重要的层组成,一个是数据层,称为 Hadoop 分布式文件系统(HDFS),另一个是处理层,最初称为 Map 和 Reduce 框架(MapReduce)。我们将更多地关注 HDFS 端,因为它非常重要,目前没有其他文件系统可以取代它。然而,市场上的处理端被其他一些工具所取代,如 Spark、Flink 等。HDFS 仍然是任何大数据应用程序的主要焦点,尤其是在我们希望保留不同的数据实体(原始数据、处理后的数据等)时。).

Hadoop 一直在高速发展。即使你熟悉 Hadoop 1,也不意味着你熟悉 Hadoop 2 或 Hadoop 3。事情正在彻底改变,一些组件被替换,其他组件被删除,新功能正在添加。由于其重要性,我将确保报道这一演变。如果你还没有升级你的 Hadoop,你可能会重新考虑。

正如我在所有 Hadoop 版本中提到的,唯一保持健壮并得到良好维护而没有更换的组件是 HDFS,这是我们真正关心的。

Hadoop 1 和 Hadoop 2 的区别

任何对知识好奇的人,都想知道有什么不同?为什么那时我需要迁移到 Hadoop 2?

这个问题的答案非常简单:我们可以有多个主控作为主要的突出区别。好像答案太雾了。我将开始详细解释发生了什么。

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

Hadoop 1 与 Hadoop 2 的高级架构

Hadoop 2 在 Hadoop 的架构中增加了一个名为 YARN 的新层,也被称为另一个资源协商者,负责管理应用程序使用的资源,监控这些应用程序,并在 HDFS 之上调度作业[1]。该层导致详细架构中的新层次,如下所示:

  1. 第一层(在名称节点层):由两个主要组件组成,它们是资源管理器(YARN)和 HDFS。
  2. 第二层(在主节点级别):由三个组件组成,它们是节点管理器(负责管理和监控容器,容器是指 HDFS 中的一部分内存)、应用程序主(允许资源管理器与节点管理器交互)和数据节点。
  3. 第三层(数据节点层):由节点管理器和数据节点两部分组成。

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

[source = “https://www . journal dev . com/8800/Hadoop-architecture-yarn-HDFS-MapReduce”]

Hadoop 2 中引入的这种架构是实现不同目的的关键,例如:

  1. 支持多个名称节点,而不是一个名称节点(单点故障),在 HDFS 联合的情况下,每个名称节点都可以分配到一个特定的名称空间,而不是由一个名称节点管理 Hadoop 1 中的所有名称空间[2]。
  2. 支持多种编程模型,包括 MapReduce、Streaming、Graph、Spark、Storm 等。而不是单一的编程模型 MapReduce。
  3. 获得比 Hadoop1 更高的可扩展性。
  4. 在 Hadoop 1 中使用可变大小的容器而不是固定大小的槽。

Hadoop 2 和 Hadoop 3 的区别

除了 Hadoop 2 中的变化之外,我们还将讨论 Hadoop 3 中的新变化。我将区分两个版本之间的重要区别如下:

  1. Hadoop 3 要求最低 Java 版本为 8,而不是 Hadoop 2 的 7。
  2. Hadoop 3 引入了一种基于擦除编码的新机制来最小化存储(存储开销仅为 50%)并实现容错,而 Hadoop 2 使用复制来实现容错并带来更多存储(HDFS 在存储空间中有 200%的开销[3])。
  3. Hadoop 3 使用 YARN timeline service v2,然而,Hadoop 2 使用 YARN timeline service v1。
  4. Hadoop 3 使用机会容器,而 Hadoop 2 使用保证容器。
  5. Hadoop 3 使用数据内节点平衡,而不是 Hadoop 2 中的 HDFS 磁盘平衡器 CLI。
  6. Hadoop 3 使用 Linux 临时端口范围之外的更方便的默认端口,而不是像 Hadoop 2 中那样使用默认端口。
  7. Hadoop 3 可以实现更好的可扩展性,能够扩展到每个集群超过 10,000 个节点,而在 Hadoop 2 中只能扩展到 10,000 个节点。

在 Hadoop 上查询存储工具

在 Hadoop 生态系统中,我们注意到各种各样的工具和框架,这里我将向您介绍三种主要的数据存储和查询工具,它们都是建立在 Hadoop 之上的。这些工具将列出如下:

  1. Hive【4】是开源的 Hadoop 平台中用于数据汇总分析和大型数据系统查询的数据仓库系统。它将类似 SQL 的查询转换为 MapReduce 作业,以便于执行和处理大量数据。
  2. h base【5】是一个分布式、可扩展的 NoSQL 大数据存储,运行在 Hadoop 集群上。HBase 可以托管非常大的表—数十亿行、数百万列—并且可以提供对 Hadoop 数据的实时、随机读/写访问。
  3. Impala是一个 MPP(海量并行处理)SQL 查询引擎,用于处理存储在 Hadoop 集群中的海量数据。与 Hadoop 的其他 SQL 引擎相比,它提供了高性能和低延迟。根据[6], Impala 是性能最高的 SQL 引擎(提供类似 RDBMS 的体验),它提供了访问存储在 Hadoop 分布式文件系统中的数据的最快方式。

与 Hadoop 共存的其他存储工具

尽管 Hadoop 是理解大数据存储的中心,但人们注意到 Hadoop 在安装、管理和监控方面有些复杂。除此之外,并不是所有的大数据应用程序都需要使用 Hadoop 的复杂性,因为他们可能会关心某种更轻的数据存储和更类似于数据库的东西。一些类似数据库的存储工具被称为 NoSQL 存储工具,NoSQL 不仅代表结构化查询语言。这些 NoSQL 工具将有助于实现上述关于数据复制和分区、数据可用性以及数据查询的特性。下面列出了一些最著名的 NoSQL 存储工具:

  1. MongoDB【7】是一个面向文档的 NoSQL 数据库,用于大容量数据存储。MongoDB 不像传统的关系数据库那样使用表和行,而是使用集合和文档。文档由键值对组成,键值对是 MongoDB 中的基本数据单元。集合包含一组文档和函数,相当于关系数据库表。它还具有查询和索引功能的高可伸缩性和灵活性。
  2. InfluxDB 是一个用 Go 编写的时间序列 NoSQL 数据库,针对运营监控、应用度量、物联网传感器数据和实时分析等领域的时间序列数据的快速、大规模可伸缩性、高可用性存储和检索进行了优化[8]。
  3. Neo4j【9】是一个 NoSQL 图形数据库。它是一个完全事务性的数据库(ACID ),以图形的形式存储数据。图由通过关系连接的节点组成。受人类思维结构的启发,它允许对复杂数据的高查询性能,同时对开发人员来说保持直观和简单。
  4. Redis是一个开源的(BSD 许可的)、内存中的数据结构存储,用作数据库、缓存和消息代理。它具有内置的复制、Lua 脚本、LRU 驱逐、事务和不同级别的磁盘持久性,并通过 Redis Sentinel 和 Redis Cluster 的自动分区提供高可用性。

摘要

每当我们构建大数据应用程序时,我们都应该记住,我们可能需要理解和应对许多工具。这些工具不仅数量多,而且版本和功能也多。我们应该小心选择正确的技术来解决匹配良好的问题。在了解 Hadoop 这个大数据时代的核心之后,我们可以清楚地注意到,发展仍在继续,每天都有新功能添加进来,因此我们必须投入时间来检查新添加的功能是否会简化我们应用程序的开发流程。此外,我还介绍了一些其他重要的工具,它们可能有助于构建所需的应用程序。

参考

[1]https://www . journal dev . com/8800/Hadoop-architecture-yarn-HDFS-MapReduce

[2]https://big data path . WordPress . com/2018/12/19/comparison-between-Hadoop-2-x-vs-Hadoop-3-x/

[3]https://data-flair . training/blogs/Hadoop-2-x-vs-Hadoop-3-x-comparison/

https://intellipaat.com/blog/what-is-apache-hive/

https://mapr.com/products/apache-hbase/

https://www.tutorialspoint.com/impala/impala_overview.htm

https://www.guru99.com/what-is-mongodb.html

https://glossarytech.com/terms/databases/influxdb

[9]https://docs . spring . io/spring-data/data-neo4j/docs/3 . 1 . 0 . release/reference/html/neo4j . html

从制图学到数字制图:你知道真相吗?

原文:https://towardsdatascience.com/from-cartography-to-digital-mapping-do-you-know-the-truth-c1440bb193dc?source=collection_archive---------40-----------------------

公平和偏见

一个在线展览反思了说服制图学的历史是如何教会我们发现视觉数据中的偏见的

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

《布里斯托尔信封》作者埃德·费尔伯恩(乔布森)

在疫情之前,我们已经看到了数字化的趋势。特别是像美术馆、博物馆、图书馆和档案馆这样的文化机构面临着通过数字媒体来获取其物品的批评。这些机构可以将当前的疫情危机转化为变革的机会。适应将允许以可持续的方式为任何地方的每个人保存、展示和消费遗产,迎合“期望稳定性和灵活性”的当代观众[1]。

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

引诱欧洲人在新英格兰定居(弯线)

当代观众还期待什么?展览提供遗产消费的方式,也应该提供研究历史的方法,作为一个重要的工具。用来思考当前的挑战,这个工具会非常方便。数字对象可以占据的“空间”是没有限制的,所以为什么不利用这种自由呢?[2]

“弯曲的线条”——一个关于“弯曲”现实的展览

波士顿公共图书馆的 Leventhal 地图中心目前正在策划一个为期一年的在线展览,名为“ 弯曲的线条:从扭曲到欺骗的地图和数据”[3]。它通过为学生提供互动材料来挑战传统的在线展示。这个想法源于“说服制图学”——地图和视觉数据如何为主观议程操纵现实的历史[3]。如果你认为你从未听说过这个,相信我,你已经看过了。新闻中的国家宣传和政治活动地图、广告或统计图表如何?

利文塔尔中心的地图策展人 Garret Dash Nelson 解释说,这个展览指导观众如何成为一个负责任的地图读者[4]:

“每张地图都注入了制作者的决策,最终呈现出一种模式、一个故事或一个论点.”

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

1943 年《新闻地图》中的《落日之地》(弯线)

他不仅提到了中世纪的普鲁士地图或二战时期的日本帝国地图,还强调了“在一个数据和数字工具丰富的时代”,地图学的历史是多么有说服力。我们可能认为“现代”工具带来了客观性和准确性,但数据与真相的关系仍然模糊不清——无论是书面还是数字。

"你怎么知道什么是真实的,什么是扭曲的?"加勒特问道。

参观数字展览

展览的互动形式带你经历三个部分:为什么要说服?线条如何弯曲让信念产生的力量。有照片,描述,解释,身临其境的内容,迷你旅游等等。这迫使我们问是谁制作了这些地图,它们的动机和信念有什么意义,它们是如何“扭曲”现实的?

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

“参观数字展览”菜单(弯曲线条)

第一部分将审查引向某人创建地图背后的意图,例如民族主义和帝国主义地图的爱国主义。例如,“永远具有威胁性的章鱼”是一幅被广泛认可的 17 世纪俄土战争地图,使用章鱼的视觉主题来代表和夸大威胁。

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

永远有威胁的章鱼

第二部分深入研究了分类和量化数据的许多技术,包括交流和符号化信息的代表性选择。作为其中的一部分,Garret 解释说他们委托了一个名为 相同的数据,不同的故事 的项目来展示同一组数据如何产生不同的视觉效果。

一个例子来自马萨诸塞州跨环境、基础设施和人口统计类别的地理数据。由此,制图者被要求制作一对结论相反的地图。分析师 Maggie Owens 创建了一个显示全州有毒物质危害的地图对。一幅可视地图显示城市受污染影响最大,而另一幅显示农村地区受污染影响最大。

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

(左/右)马萨诸塞州的有毒污染表明城市受影响最大/ 马萨诸塞州的有毒污染表明农村地区受 Margaret Owens ( 弯线)影响最大

“我们愿意认为数字本身就能说明问题,但是每当我们使用数据时,解释者都有一个至关重要的角色,人们绘制这些地图的方式真的会影响他们带入任务中的假设,”Garret 说[4]。

最后一节讲的是真理与权力的关系;以及它在视觉上是如何表现的,触及到包括种族、语言和领土在内的主题。以特殊的教育活动结束,这让年轻的学生要求更多。

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

《白人至上的气候学》(弯曲线条)

为什么要关心 Covid 世界中的地图?

在一个信息无止境的时代,或者说“信息时代”,了解哪些数据的可视化表示是可信的是至关重要的[5]。在新闻中,当你看到关于新冠肺炎的选举地图或统计数据时,它们会受到偏见的影响。鉴于疫情的背景,弯曲线有一个更大的目标,如 Garret 所解释的[4]:

“我们也想将此视为促进数据素养的一种方式,这是对媒体和数据可视化的一种批判态度,以汇集地图如何产生我们的真实感的悠久历史。”

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

威廉·普莱费尔——图表和图形的视觉简史

加勒特是对的。而“网络上充斥着无数复杂的可视化项目”[6];看到错误信息像蜂巢爆炸一样传播,我们需要学习如何成为负责任的数据读者。视觉数据和地图的主要缺点之一是不成比例的简化论。数字、线条、点、形状和颜色声称代表了物体和它们之间的关系,“不管这些是人、它们的社会关系、股票价格、国家收入、失业统计还是其他任何东西”[6]。

在网络和新闻中,新冠肺炎地图倾向于强调一些因素,而隐藏其他因素。例如,它们通常只显示确诊病例,而不是所有的病例。这意味着,虽然声称显示一个国家的疫情状态,但他们实际上代表了该国对该疾病的测试规模和水平[8]。

冠状病毒图表如何误导我们

如果不将视觉数据与地理、社会人口统计、文化和政治决策联系起来,错误信息就会继续传播。

超越地图的天真

为什么误传会通过可视化地图持续传播?他们拥有某种力量,使人们信任他们,并倾向于“天真地”接受他们是真的[5]。视觉语言在很大程度上与科学客观性的范式有关。作为一个观众,我们往往会忘记,我们看到的数据从来没有脱离上下文、解释或说明[9]。

“数据经常以被精心制作来讲述一个特定故事的视觉化形式来传达,而在简化数据的过程中,上下文经常会丢失;类似地,数据经常被吹捧为客观的、固有的事实信息,不受人为干扰”[9]。

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

数据来自人民(弯线)

视觉数据受制于它所处的位置,就像所有的交流行为一样。因此,我们每天看到的新冠肺炎地图和图表并不是他们所声称的“客观”表现。我们将它们与“逻辑论证和科学启蒙”[7]联系在一起,却忘记了它们的社会、文化和政治背景。

弯线是一个强大的展览,无论是形式还是内容。它试图以新的方式利用数字自由来互动地展示历史,同时允许观众从批判的角度参与和反思历史。在一个“真理”比以往任何时候都更加遥远的时代,我们学会了辨别什么是可信的数据,什么是不可信的数据。

参考书目

[1] *创新&文化遗产研究:2018 年 3 月 20 日,布鲁塞尔皇家艺术与历史博物馆:会议报告。*出版处,2018。DOI.org【CSL JSON】,https://data.europa.eu/doi/10.2777/303242

[2]卡恩,丽贝卡。“封锁而不是封锁——评估博物馆对新冠肺炎的数字反应”。社会科学的影响,2020 年 5 月 8 日,https://blogs . LSE . AC . uk/Impact of Social Sciences/2020/05/08/locked-down-not-lock-out-assessing-the-digital-response-of-museums-to-新冠肺炎/

【3】弯曲的线条:从扭曲到欺骗的地图和数据www.leventhalmap.orghttps://www . leventhalmap . org/digital-exhibitions/bending-lines/。于 2020 年 9 月 21 日访问。

[4]布利斯,劳拉。关于地图的偏见,历史教会了我们什么。城市实验室Bloomberg.Com,2020 年 5 月 28 日。www.bloomberg.comhttps://www . Bloomberg . com/news/articles/2020-05-28/how-to-解构-解读-地图

[5]穆尼、彼得和莱文特·胡哈斯。新冠肺炎地图:基于网络的地图如何对信息时代做出贡献。人文地理对话,第 10 卷第 2 期,SAGE 出版,2020 年 7 月,第 265–70 页。贤者期刊,doi:10.1177/2043820620934926

[6]马诺维奇,列夫。什么是观想?视觉研究,第 26 卷第 1 期,Routledge 出版社,2011 年 3 月,第 36–49 页。泰勒和弗朗西斯+奈吉姆,doi:10.1080/1472586 x . 2011.548488

[7]多恩,萨拉。歪曲新冠肺炎:在数据设计的第二个黄金时代用图表撒谎。商业和技术交流杂志,SAGE 出版公司,2020 年 9 月,第 1050651920958392 页。贤者期刊,doi:10.1177/1050651920958392

[8] 冠状病毒图表如何误导我们。2020. Vox ,【https://www.youtube.com/watch?v=O-3Mlj3MQ_Q】T4。

[9]雷切尔·阿泽顿。“缺失/未指明”:新冠肺炎疫情期间的人口数据可视化。商业和技术交流杂志,SAGE 出版公司,2020 年 9 月,第 1050651920957982 页。贤者期刊,doi:10.1177/1050651920957982

编辑自MoM中的原始出版物,作为 MA 新媒体&数字文化@阿姆斯特丹大学作业的一部分,2020 年 9 月 27 日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值