你可以在家免费自学机器学习的方法!!
大约一年前,在我读完佩德罗·多明戈斯的书《大师算法》后,我立即开始了我的机器学习之旅。这本书深刻地激励我成为当前机器学习/深度学习革命的一部分。所以我决定在每天的时间表中抽出几个小时来学习机器学习。在将近一年的时间里,我学到了很多东西,我非常感谢互联网上慷慨的资源使这一切成为可能。
今天,我想分享这些免费资源,以及你可以使用它们的方法,以便进入你的机器学习之旅。你所需要的只是一个互联网连接,基本的编程技能(Python),一台电脑和足够的动力。开始…
注意:‘’表示推荐完成*
Fast.ai 是杰瑞米·霍华德和他的团队的一个项目,旨在让每个人都可以使用深度学习。这门课程很受初学者的欢迎。杰瑞米·霍华德教授机器学习的方法既直观又实用。在我的第一堂课上,我学会了如何建立一个图像分类器来对狗的品种进行分类。光是这种动力就足以让我坚持到最后。fast.ai 库功能强大,由 Kaggle、Google 云平台、Amazon Web Services、Paperspace 和其他几个平台支持。他们最近推出了 fast.ai 第二版,更灵活、更快、对初学者更友好。一定要去看看他们的深度学习课程。很神奇,而且绝对免费。
2.YouTube 上的讲座和视频教程:
YouTube 上有大量的机器学习课程。斯坦福大学、麻省理工学院、加州理工学院、保罗·g·艾伦学院……都提供优秀的课程。你甚至可以从课程网站上获得讲座幻灯片、作业* ( 良好实践)和解答。你可以从你的房间里获得世界级的教育。此外,你可以找到微积分、统计学、概率、线性代数等基础学科的课程,以及计算机视觉、强化学习、语音和自然语言处理等高级主题的课程。
你可以随时寻找教程来快速了解或回顾某个主题。以下是其中一些来源的列表:
a.杨安泽斯坦福的机器学习课程(新版) *
b. 保罗·g·艾伦学校的机器学习课程
c. 麻省理工学院开放课件-线性代数、概率统计、微积分等
d. 与乔希·斯塔默的 stat quest-机器学习的伟大教程
e. 两分钟论文-快速洞察
f.
我还会推荐听 Lex Fridman 的播客(在 YouTube 和 Spotify 上)和走向数据科学(在 Spotify 上),他们采访了机器学习和人工智能方面的专家。他们见解深刻,激励人心。
4。博客、文章
你可以在网上找到几乎所有机器学习主题的精彩文章。您可以找到几篇关于实现模型、特征工程、数学直觉、问题解决、ML 库等等的文章。以下是一些非常有用的网站列表:
- 中等,向中等
- 机器学习掌握
- 分析 Vidhya
- 谷歌的机器学习速成班
- 此外,大多数图书馆在其官方网站上都提供了很棒的教程: PyTorch 的教程, Sklearn 的教程,熊猫的教程等等…
Kaggle 是一个很好的平台,在这里你可以练习你的机器学习技能。有成千上万的数据集可供你下载和实验。Kaggle 举办比赛,你可以测试你的机器学习技能,以解决真正的 ML 问题。我强烈建议浏览一下其他 Kagglers 的笔记本和讨论。你不需要理解笔记本上的每一个细节。无论你现在处于哪个阶段,你都会从他们身上学到新的东西。
4.免费计算
机器学习是一个计算资源密集型过程。买一台像样的机器可能要花上几千美元。不是每个初学者都能负担得起,或者愿意做这样的投资。幸运的是,你可以从许多在线来源获得免费的云计算:
→ka ggle
ka ggle 笔记本拥有足够的计算资源来完成大多数机器学习任务。最重要的是,Kaggle 每周为其用户提供高达 42 小时的 GPU 时间和 2 小时的 TPU 时间。这些是体面的特斯拉 K80 GPU可以加速你的大部分深度学习任务。不像这个列表中的其他选项,你不需要给出你的信用卡信息。你只需要一个电话号码来验证。你几乎可以立即将 Kaggle 上的数据集加载到你的笔记本文件夹中,大多数机器学习库,如 NumPy,Pandas,PyTorch,TensorFlow 都是预装的。
→ 谷歌云平台(GCP)免费积分——一年时间限制 GCP 提供价值 300 美元的免费积分,从你注册之日起,你可以使用长达 1 年。你可以以每小时 1 美元的价格创造和使用一台像样的机器。加上 Kaggle 笔记本,这些学分应该够用一年了。我通常尽可能使用 Kaggle 笔记本,当 Kaggle 上的计算不够用时,我会求助于 GCP。
5。 机器学习论文
一旦你正确掌握了机器学习/深度学习的概念,你就可以逐渐开始阅读研究论文了。你可以在 arXiv.org 上找到大多数关于机器学习的研究论文。如果你不能掌握任何概念,你肯定会在上面列出的一些博客网站上找到简化的解释。尝试将论文中的想法应用到你自己的项目中,观察它们的表现。
考虑到互联网上的信息量,这篇文章并不完整。互联网提供的多样性可能会让初学者不知所措。通过这篇文章,我想通过列出我的个人选择来限制这种多样性。希望这有帮助。
祝你一路顺风,虽然艰难但令人欣慰😀!!!
我们不邪恶
人工智能及其创造者正在让世界变得更好,而不是更糟。
我们不邪恶。(来源:作者)
人工智能是由全世界的程序员、数据科学家和数学家共同努力推动的。总的来说,这种特殊的全球亚文化(我自己也算在内)大多是乐观的,相信进步,并最终希望通过技术来改善世界。
关注这条新闻,你可能会看到一幅不同的艾和他背后的人的画面。当班卓琴的故事爆发时[1],我们了解到整个人工智能历史上的主要人物都是白人至上主义者[2]。自从 COMPAS 丑闻[3]以来,我们几乎在任何主要的人工智能系统中都读到了性别和种族偏见。就在几天前,IBM、亚马逊和谷歌绝望地拔掉了他们面部识别软件的插头[4-6],看不到其他方法来防止对少数民族的不公平待遇。更糟糕的是,统计学,所有现代机器学习和数据科学背后的数学学科,现在也被怀疑是种族主义的,因为它在很大程度上是由优生学家开发的[7,8]。
尽管统计学就像一般的科学一样,肯定充满了伦理污染(借用朗·霍华德的一个术语[9]),但它本身并不邪恶。我们也不是,来自世界各地的绝大多数热情的数据科学家和机器学习工程师,他们在我们做的一切事情中都依赖于统计数据。
不,统计数据不是问题,而是解决问题的关键。它是揭露任何地方的歧视和不公正的一个必要工具。只有通过系统的数据分析和统计,才能揭示当今公司和机构中普遍存在的不公平做法。统计使我们能够量化不公正,并监测我们是否在减少不公正方面取得进展。
ProPublica 是如何揭露 COMPAS 丑闻的?利用统计学和数据科学,从他们的代号可以看出。我们怎么知道 AI 研发存在多样性问题?通过观察——你猜对了——统计数据[10]。凯茜·奥尼尔怎么可能写出“数学毁灭武器”?利用她作为数学家和数据科学家的知识和经验。她是我们中真正关心的人之一。
问题不在于学习了你不道德行为的 AI。首先,问题是你的行为不道德!
的确,像 COMPAS 丑闻这样的事件表明 AI 做出了不道德的决定。但是,亲爱的公司和机构,问题不在于学习了你们不道德行为的 AI。首先,问题是你的行为不道德!
为了识别和纠正这一点,做了大量的工作。伦理人工智能已经成为一个活跃的研究领域,产生了新的工具、方法和最佳实践来实现数据透明和算法可解释性。是的,对一些公司和机构来说,可解释人工智能的时代将是不舒服的,因为随着透明度的增加,会有更多的审查。然而,最终还是别无选择。将通过统计的贡献来系统地发现、衡量和打击不平等现象。
而我们,你和我,将成为实现这一目标的人。
参考
[1] M. Stroud,监视公司 Banjo 的首席执行官曾经帮助三 k 党领导人枪杀了一个犹太教堂 (2020),OneZero
[2] S. Myers West, AI 和极右翼:一段我们不能忽视的历史 (2020)
[3]朱莉娅·安格温等著,机器偏见 (2016),ProPublica
[4] L. Hirsch, IBM 退出面部识别业务,呼吁国会推进解决种族不公正的政策 (2020),美国消费者新闻与商业频道
[5] A. Levy,微软表示,除非有一部以人权为基础的国家法律,否则不会向警方出售面部识别软件,(2020),美国消费者新闻与商业频道
[6] K. Weise 和 N. Singer,亚马逊暂停警方使用其面部识别软件,(2020 年),《纽约时报》
[7] K. Evans,统计学是种族主义的吗?
[8]d . cle ther,统计学是种族主义的吗?,(2020),启动
[9] S .拉哈,伦理污染
[10] K. Paul,《卫报》研究发现,人工智能行业多样性的“灾难性”缺乏延续了偏见 (2019)
(来源:作者)
我们创造了一个懒惰的人工智能
如何为现实世界设计和实现强化学习
TLDR: 许多文章解释了强化学习(RL)的概念,但没有多少文章讨论如何在现实世界中实际设计和实现强化学习。在本文中,我将分享为纽约市实施 RL 解决方案的范式转变经验、一些见解和一个通用参考架构。
:感谢亚历克斯·香农、阿邦库王子和布雷顿·阿纳博尔迪,他们是我在 NYU 的出色队友,是他们的贡献和成就了这一切。
但是,先喝一杯?
我以为你在一个派对上。你有点(或很)醉了。你自愿玩喝酒游戏来给一个(或多个)有魅力的熟人留下深刻印象。
有人蒙住你的眼睛,给你一个玻璃杯和一瓶啤酒,喊:“开始倒!”
你会怎么做?
你大概有以下反应:sht,我该怎么办!?我怎么赢!?如果我输了会怎么样!?*
原来规则是这样的:你需要在 10 秒钟内把啤酒灌到尽可能接近杯子上的一个标记。可以倒啤酒进出。
欢迎来到我们的 RL 解决方案的头脑他面临着类似的任务,但为了一个更高尚和更有意义的目的。
现实世界中的啤酒问题
我们的环保自行车共享业务存在一个大问题。一整天,每个自行车站(玻璃杯)可以有太少或太多自行车(啤酒)。
这对骑自行车的人来说非常不方便,并且需要花费数百万美元来管理运营。不久前,我在 NYU 的团队受命提出一个人工智能解决方案*,以最少的人工干预来帮助管理自行车库存。***
目标:**全天保持每个自行车站的库存在 1 到 50 之间(想想玻璃上的标记)。这在共享经济中被称为再平衡问题。
约束:由于操作限制,团队在一天中的每个小时只能移动 1、3 或 10 辆自行车(你可以倒入或倒出的啤酒量)。当然,他们可以选择什么都不做。团队移动的自行车越多,价格就越贵。
我们的惰性 RL 解决方案
我们决定使用 RL ,因为它克服了传统方法的许多限制(例如基于规则和预测)。
如果您想了解 RL 是什么以及它的一些关键概念, Jonathan Hui 写了一篇非常好的简介和 Thomas Simonini 更详细地解释了 Q-Learning ,一种在我们的解决方案中使用的 RL 算法。
结果是,我们创造了一个非常懒惰的人工智能。当自行车库存超过 60 辆时,它通常会选择什么都不做或最小化(移动 1 或 3 辆自行车)。这似乎有悖常理,但却非常明智。
根据人类的直觉,我们可能会移动尽可能多的自行车,使其保持在 50 辆以下,尤其是当加油站越来越满的时候。但是,RL 认识到移动自行车的成本(移动的自行车越多,成本越高)以及在某些情况下成功的机会。考虑到还剩多少时间,根本不可能实现目标。它知道最好的选择是“放弃”。所以,有时候放弃比继续尝试更好。
有不同的方法来“轻推”人工智能以避免懒惰。这与我们如何设计奖励函数有关。我们将在下一篇文章中讨论这个问题,所以现在请继续阅读。
***那又怎样?*类似于谷歌 Alpha Go 著名的棋 37 和 78 ,当人工智能做出非常规决策时,它们挑战我们的偏见,帮助打破知识的诅咒,并将我们推向未知的道路。
创造人工智能既是一项发明,也是一次探索我们大脑内部运作的旅程。—戴密斯·哈萨比斯,DeepMind 创始人,经济学人上的 2020 年世界
但是,要谨慎。没有什么可以取代人类的价值体系,这样我们才不会掉下悬崖或迷路。
让我们现实一点
***RL 如何管理自行车站?*下图显示了自行车库存从第 0 小时到第 23 小时(有和没有 RL)的变化。
- 蓝色是没有 RL 的自行车股的走势。
- 黄色是一个天真的女孩。它只是不停地移走自行车。成本很高。
- 格林和一个受过更好训练的女孩在一起。它移除刚好足够的自行车来满足目标。它更注重成本。
RL 如何决定做什么?以下是我们的 RL 解决方案在 98,000 次训练后的 Q 表快照。它解释了给定一个站点(垂直)有多少辆自行车,我们的 RL 如何决定做什么(水平)。RL 不太可能选择做任何红色的事情。看看底部的红色区域。
***RL 能变得多聪明?*以下是 RL 管理自行车站的情况。随着更多的学习,RL 能够将整体成功率逐渐提高到令人印象深刻的 98%。
***这看起来棒极了,我们的解决方案是如何工作的?*这里是高层架构。对于大多数 RL 应用来说,这是一个通用的设计。每个 RL 解决方案需要有以下三个基本组件:训练循环、代理和环境。
作者的分析
***训练循环:*循环便于剧集的运行。每一集意味着一个事件的端到端过程(在这种情况下,它意味着一轮寻宝的开始和结束)。该程序可以运行数千集(或你想要的任何数量)来训练 RL 代理。
***RL 代理:*RL 代理有两个主要功能。 学习 允许智能体从每次与环境的交互中学习,并将学习带到新的一集。“大脑”有不同的设计。最简单的是通过使用 Q 学习。Alpha Go 使用深度神经网络。代理 基于学习和环境提供的情况选择动作 。
***环境:*这是给定应用的世界的表示。在我们的例子中,这是自行车在城市中行驶的方式。该环境基于代理的动作提供反馈。反馈包括奖励或惩罚以及环境的最新状态。我们稍后将更详细地讨论这一点。
下一步是什么
我希望你喜欢这篇文章,并且对 RL 在现实世界中的能力和潜力感到兴奋。取决于本文的表现,我们将在下一篇文章中深入研究设计、权衡,并进行详细的代码演练。
与此同时,如果你想了解更多关于开发 RL 的基础知识,请查看我的新 RL 教程 。我们将用大约 100 行代码制作一个有趣的寻宝程序,熟悉上面讨论的一般 RL 架构,并构建一个演示包。
喜欢读什么? 跟我上 中LinkedIn,或者Twitter。**
下次见。
伊恩
喜欢你读的书吗?你可能也会喜欢我这些受欢迎的文章:
每个懒惰的全栈数据科学家都应该使用的 5 套工具
towardsdatascience.com](/the-most-useful-ml-tools-2020-e41b54061c58) [## 被遗忘的算法
用 Streamlit 探索蒙特卡罗模拟
towardsdatascience.com](/how-to-design-monte-carlo-simulation-138e9214910a) [## 越狱
我们应该如何设计推荐系统
towardsdatascience.com](/how-to-design-search-engines-24e9e2e7b7d0) [## 12 小时 ML 挑战
如何使用 Streamlit 和 DevOps 工具构建和部署 ML 应用程序
towardsdatascience.com](/build-full-stack-ml-12-hours-50c310fedd51) [## 数据科学很无聊
我如何应对部署机器学习的无聊日子
towardsdatascience.com](/data-science-is-boring-1d43473e353e) [## 抵御另一个人工智能冬天的最后一道防线
数字,五个战术解决方案,和一个快速调查
towardsdatascience.com](/the-last-defense-against-another-ai-winter-c589b48c561) [## 人工智能的最后一英里问题
许多数据科学家没有充分考虑的一件事是
towardsdatascience.com](/fixing-the-last-mile-problems-of-deploying-ai-systems-in-the-real-world-4f1aab0ea10) [## ML 和敏捷注定的联姻
Udacity 的创始人巴斯蒂安·特龙毁了我的 ML 项目和婚礼
towardsdatascience.com](/a-doomed-marriage-of-ml-and-agile-b91b95b37e35)**
我们整个周末都在推特上追踪 COVID。这是你错过的。
由史蒂夫·赫登和大卫·波尔分别担任
为了进行这项分析,我们在整个周末(美国东部时间 7 月 24 日晚 7 点至 7 月 26 日中午)流式传输了所有与 COVID 相关的推文。我们从这些数据中提取了一个网络,使用个人 Twitter 账户作为节点,RTs 或提及作为链接。
下面演示了网络是如何创建的。@realDonaldTrump 和@jonvoigt 代表节点。既然@realDonaldTrump 转推了@jonvoigt,那两者之间就有联系了。
在过滤了网络中最有影响力的节点之后,我们创建了一个总结网络。
7 月 24 日—26 日周末 COVID 相关推特汇总网络。
图中的每个节点(气泡)代表一个 Twitter 用户,每个链接代表与另一个用户的连接。如果在时间间隔内的任何时间点,两个账户彼此交互或者与同一个中间账户紧密交互,则这两个账户是关联的。每个节点的大小对应于它们的度中心性——用户拥有的连接越多,它们的中心性越高。节点的颜色对应于它们的社区或组。当用户之间的互动多于他们社区之外的用户时,社区就形成了。
主要要点
从上面的视频可以看出,Twitter 上的 COVID 对话揭示了几个不同的社区。这些人在周末定期进行互动,无论是通过直接转发和提及,还是通过转发相同的推文或提及相同的用户。这些社区的详细信息(顶级影响者、关键词、总体情绪)将在下面详细解释,但是存在这样的独特社区本身就很重要。在网络分析术语中,我们可以说这是一个非常模块化的图,具有密集连接的节点的不同集群。用外行的话来说,我们有一群人,他们彼此之间有很多互动,但他们不经常与他们圈子之外的人互动。这可能是因为大多数人的 Twitter 订阅由他们关注的用户的推文主导,Twitter 建议他们关注其他类似的用户,这被称为“过滤泡沫”。
来自 Dictionary.comhttps://www.dictionary.com/browse/filter-bubble?s=t
由于语言和时区的差异,这些社区看起来也很独特。例如,有巨大的西班牙语社区,尤其是来自委内瑞拉的社区。在那个半球的白天,也有不同的印度和马来西亚社区出现和成长。
周末热门推文(截至 7 月 26 日周日晚的转发数)
- 来自@ alsoto_7,转发约 153,000 条
2.来自@ davenewworld_2,转发量约为 107,000 次
3.来自@ TristanTaylor88,转发量约为 66K
4.来自@ Theresa_Chappie,转发量约 51K
5.来自@ JoeBiden,转发量约为 32K
6.来自@ kylegriffin1,转发量约 20000 条
7.来自@ funder,转发量约为 1.6 万
8.来自@ jsolomonReports,转发量约为 16K
顶级群体
有几个不同的团体在这段时间内一直存在。以下是对群组的一些高级描述,包括顶级影响者(基于每个用户的程度中心性)、群组的关键词和总体情绪。使用自然语言处理(NLP)来计算关键词和情感。对于关键词,我们确定了该组所有推文中最常用的名词。这种情绪有好有坏。大多数推文相当负面(毕竟,我们在谈论一个全球性的疫情)。
第 1 组——美国医疗保健专业人员、记者和政治家
最有影响力的人
- 埃里克·费格丁博士(@德瑞克丁)
- CNN (@ CNN)
- 凯尔·格里芬(@ kylegriffin1)
- 安迪·斯拉维特(@阿斯拉维特)
- 丹尼尔·乌尔菲尔德(@ DWUhlfelderLaw)
**关键词:**佛罗里达州,川普,冠状病毒,得克萨斯州,美国
总体情绪: -0.21(负面)
这是迄今为止网络中最大的社区。顶级成员在整个周末都在变化,但美国科学家联合会高级研究员、流行病学家和健康经济学家 Eric Feigl-Ding 博士始终是最有影响力的人之一。他周末最热门的推文实际上是在周四下午发出的:
同样,CNN 也有一些重要的推文。周末转发量最大的一条也是在周四发出的:
凯尔·格里芬(Kyle Griffin)周五晚上在推特上警告说,辛克莱广播集团准备播放一部纪录片,声称福奇博士对冠状病毒负责:
格里芬的这条推文获得了如此多的关注,以至于他们推迟了这部纪录片的发布,这部纪录片本身就是我们网络中的一个重大事件:
安迪·斯拉维特在推特上讲述了疾控中心的衰落程度:
以及德州州长 Abbott 如何需要立即采取激烈的行动:
丹尼尔·乌尔菲尔德(Daniel Uhlfelder)报道称,阿肯色州参议员杰森·雷佩特(Jason Rapert)因 COVID:
上周末,该社区的其他顶级影响者包括斯蒂芬·金、卡玛拉·哈里斯、乔·斯卡伯勒、特里萨·查普尔博士、乔伊·里德和乔·拜登。
第二组——特朗普和他的朋友们
顶级影响者
- 唐纳德·特朗普(@ realDonaldTrump)
- 贾尼斯·迪恩(@ JaniceDean)
- 约翰·所罗门(@ jsolomonReports)
- 大卫·萨马迪博士(@ drdavidsamadi)
- 汤姆·菲顿(@汤姆菲顿)
关键词: CCP,佛罗里达州,美国,60 万美国,参议院
总体情绪: -0.27(负面)
特朗普周末的第一条推文是在周五晚上,当时他回应了斯科特拒绝内华达州一所教堂增加教堂容量的上诉的消息:
贾尼丝·迪恩宣传了她关于科莫“致命”养老院政策的文章:
约翰·所罗门宣传羟氯喹是“击败”病毒的关键:
大卫·萨马迪博士分享最多的推文比较了各国人均因 COVID 导致的死亡人数:
他还称新冠肺炎为“CCP 病毒”,大概是在中国共产党之后。术语“CPP”获得了足够的关注,它从 NLP 中脱颖而出,成为这个社区中所有推文中的顶级名词之一。
汤姆·菲顿也对罗伯茨法官不允许内华达教堂增加容量的决定表示反对:
下面,我们列出了我们定义的每个剩余社区的前 5 名影响者。
请记住,这些社区在不断变化。对于实时更新,我们建议您使用 covidtwitternetwork 亲自探索对话及其主要参与者。
第三组—国际新闻
顶级影响者
- 路透社(@路透社)
- 电晕更新机器人(@电晕更新机器人)
- 哥伦比亚广播公司新闻(@ CBSNews)
- 彭博(@商业)
- 小山(@ thehill)
第 4 组—委内瑞拉(查韦斯主义者)
顶级影响者
- VTV 运河 8 (@ VTVcanal8)
- 委内瑞拉统一社会党
- 大众通信和信息部(@ Mippcivzla)
- Con El Mazo Dando (@ ConElMazoDando)
- patria rebel de RR(@ ronel Rodriguez 6)
第 5 组—印度政治家、名人、医疗保健专业人士
顶级影响者
- shiv Raj Singh Chou Han(@ ChouhanShivraj)
- 阿尼(@阿尼)
- 索努·苏德(@ SonuSood)
- Kumar Vishvas 博士(@ DrKumarVishwas)
- 总部新闻(@ ABPNews)
第 6 组—英国
顶级影响者
- 莎拉·墨菲(@ 13 莎拉·墨菲)
- 德里克·詹姆斯(@ derekjames150)
- 戈登财富#FBPE (@戈登 _ 财富)
- 理查德·科比特(@ RichardGCorbett)
- 詹姆斯·梅尔维尔(@詹姆斯·梅尔维尔)
第 7 组——马来西亚
顶级影响者
- KKMPutrajaya (@ KKMPutrajaya)
- anep (@ hanifjamals)
- 哈里安地铁(@ hmetromy)
- 伯纳玛(@ bernamadotcom)
- 贝里塔·哈里安(@ bharianmy)
第八组—委内瑞拉(胡安·瓜伊德)
顶级影响者
- 胡安·瓜伊多(@ jguaido)
- 全国通讯中心
- 雨果·洛佩斯-盖特尔·拉米雷斯(@赫尔盖特尔)
- Reporte Ya (@ ReporteYa)
- 尼尔森·博卡兰达 S. (@尼尔森·博卡兰达)
第 9 组——厄瓜多尔
顶级影响者
- El Comercio (@ elcomerciocom)
- El Universo (@ eluniversocom)
- 厄瓜多尔人(@厄瓜多尔人)
- tele amazonas(@ tele amazonas sec)
- CNN en 西班牙语(@ CNNEE)
我们将继续使用 covidtwitternetwork 来分析 Twitter 上正在进行的与新冠肺炎有关的对话。该应用程序仍在开发中,因此我们欢迎任何评论或反馈。
感谢杰西卡·雷蒂格的反馈和支持:)
我们不会被机器取代
这个故事是关于合作而不是竞争
在以前的文章中,我们已经讨论了在不同研究领域工作的专家之间合作的重要性。现实世界中的问题往往不完全属于某个特定的研究领域——我们需要学会一起面对问题,不仅要分享我们所知道的,还要愿意倾听——仔细倾听他人的想法 — 。我们需要保持足够的开放,承认我们没有所有的答案,其他人可能有我们没有的知识和观点。
我想我们都同意,协作是一件好事,我们的综合思维大于其各个部分的总和。那么,当涉及到与人工智能合作时,我们为什么会觉得有必要采取不同的观点呢?
我们对他们
科学论文不断将他们的人工智能算法在解决某些特定问题时的性能与专家的性能进行比较。它被视为超越人类的战利品,即使只是狭义的。虽然这可能是一个有用的基准,将研究的成就和意义放入上下文中,但我认为它也不知不觉地建立了一种对立的关系。突然变成了竞争。我们对抗机器。
人类和他们的人工智能作品之间的竞争和最终冲突已经成功地抓住了我们社会的集体想象力。我们在文学和电影中戏剧化地表现了这个想法,产生了巨大的影响。这当然是发人深省的材料,并提出了许多非常好(也非常困难)的伦理问题,我们绝对应该尽早思考。
但硬币的另一面是,这种魅力也导致了一种广泛的观点,即人工智能在某种程度上反对我们。粗心的科学家盲目追求他们的研究进展,而牺牲了我们的其他生计。我们害怕有一天我们被机器人取代,而这正是我们花了大半辈子学习的事情。
很容易理解为什么这让我们如此恐惧。当我们觉得工作过度、报酬过低时,我们可能会抱怨,但我们内心深处还是有一部分喜欢工作。我们喜欢工作,也喜欢贡献。我们希望感受到他人的重视。我们从工作中获得自我价值。我们从工作中获得认同感。在许多方面,我们是我们的工作。如果我们觉得我们的工作——以及我们的自我——受到了威胁,我们就会努力工作。我们变得有防御性。这是对我们所珍视的东西的攻击。
被算法淘汰的前景似乎意味着我们所做的不再有价值,这理所当然地让我们感到不安。然而,我们不应该让我们的想象力战胜我们。在我们决定必须不惜一切代价阻止人工智能研究的无情前进之前,让我们检查一下现实。
人为因素的情况
人类将永远保持机器所不具备的灵活性。诚然,在简单和重复的决策方面,我们远远胜过他人——但是人类学习、适应以及更普遍的对新奇事物做出适当反应的能力是无法用代码行复制的。在历史上,我们对未知事物的成功探索行为使我们人类比地球上任何其他生物都更强大、更成功。
在出现异常信息时,我们可以(只要我们愿意面对它)推导出它的含义,并将我们需要知道的信息整合到我们现有的决策过程中。虽然算法在某种意义上确实“学习”,但我们还远远没有开发出像通用智能那样可以模仿人类能力的东西。
本质上:在未来很长一段时间里,我们将与人工智能一起工作,而不是与之竞争。
我们的工作将因人工智能而得到加强。通过处理工作中枯燥、重复的部分,我们将能够把注意力集中在工作中更有趣、更重要、更有影响力的方面。每个人都有那些他们知道他们应该做的事情,那些我们知道如果我们做了会对我们和我们的组织有好处的重要但不紧急的任务,但我们似乎就是不能去做。我们会陷入所有不太重要但最终更紧迫的事情中。
想象一下,如果你组织中的每个人都只做重要的事情。为,像,连续一年。在那段时间里,事情会发生怎样的变化?流程的效率会提高多少?工作质量会提高多少?你的客户会有多开心呢?会有更多的事情要做。
或者也许人工智能确实在你工作的某个关键方面胜过你。下一个问题是:如果你和机器一起工作,你会取得什么成就?你们如何弥补对方的弱点?人工智能能帮助你处理特别模糊的情况吗?你能掩盖机器的故障模式吗?
选择不要害怕
重点是这个。替换可怕的问题:
“这项技术会取代我们吗?”
…带着协作问题:
“如果我们一起努力,我们能取得什么成就?”
不是机器人对人类。是机器人和人类对抗问题。重大而令人挠头的问题。
我们越早开始这样思考——从与人工智能合作而不是对抗的角度来看——我们就能越快实现目标。
学分和更多信息
Andrew Hetherington 是英国伦敦的一名见习精算师和数据爱好者。
弱自我监督学习—第一部分
FAU 讲座笔记关于深度学习
从类到像素
FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座
这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是与幻灯片匹配的讲座视频&的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。 自己试试吧!如果您发现错误,请告诉我们!
航行
弱监督训练也可以利用非常粗糙的注释。使用 gifify 创建的图像。来源: YouTube 。
欢迎回到深度学习!所以,今天我想和你们谈谈几个高级的话题,特别是研究稀疏标注。我们知道数据质量和注释是极其昂贵的。在接下来的几个视频中,我们想谈谈如何保存注释的一些想法。主题是弱监督学习和自我监督学习。
监督训练的标签似乎很多。 CC 下的图片来自深度学习讲座的 4.0 。
好吧。那么,让我们看一下幻灯片,看看我为你准备了什么。题目是弱自监督学习。我们今天从有限的注释和一些定义开始。稍后,我们将研究代表学习的自我监督学习。那么,用有限的注解学习有什么问题呢?目前为止。我们有监督学习,我们已经看到这些令人印象深刻的结果是通过大量的训练数据和一致的高质量注释实现的。这里,你可以看到一个例子。我们有基于实例的分段的注释,并且我们简单地假设所有这些注释都在那里。我们可以使用它们,甚至可以公开获得。所以,没什么大不了的。但实际上,在大多数情况下,这是不正确的。
其实标注很贵的。来自深度学习讲座的 CC BY 4.0 下的图片。
通常,您必须进行注释,而注释是非常昂贵的。如果查看图像级别的分类标签,每个样本大约需要 20 秒。这里,你可以看到一只狗的图像。也有想法,我们试图让它更快。例如你在[11]中看到的例子。如果你接着去实例分割,你实际上必须画出轮廓,这是你必须在这里花费的每个注解至少 80 秒。如果您继续进行密集像素级注释,您可以轻松地花费一个半小时来注释这样的图像。你可以在[4]中看到。
监管不力试图充分利用你的标签。 CC 下的图片来自深度学习讲座的 4.0 。
现在,弱监督学习和强监督学习的区别,你可以在这个图表中看到。这里你看到如果我们有图像标签,当然可以对图像标签进行分类,进行训练。这基本上是监督学习:训练边界框以预测边界框,训练像素标签以预测像素标签。当然,您也可以从像素级标签抽象到边界框,或者从边界框抽象到图像标签。那都将是强有力的监督。现在,弱监督学习的想法是,你从图像标签开始,然后去包围盒,或者你从包围盒开始,然后尝试预测像素标签。
弱标签的例子。 CC 下的图片来自深度学习讲座的 4.0 。
这是弱监督学习的核心思想。不知何故,您希望使用稀疏注释,然后创建更强大的预测器。弱监督学习的关键要素是使用先验知识。你使用关于形状、大小和对比度的显性和隐性先验。此外,运动可以用来,例如,移动边界框。类别分布告诉我们,有些类别比其他类别更频繁。此外,图像间的相似性也有帮助。当然,您也可以使用像图像标签、边界框和图像标题这样的提示作为弱监督标签。稀疏时态标签随时间传播。对象内部的涂鸦或点击也是合适的。这里有几个关于涂鸦和点击的稀疏注释的例子。
从标签到本地化的第一种方法。来自深度学习讲座的 CC BY 4.0 下的图片。
有一些通用的方法。从标签到本地化的一个方法是使用预先训练好的分类网络。然后,举例来说,你可以使用一些技巧,就像在视觉化的讲座中一样。你就产生了一个定性的分割图。所以在这里,我们有这样一个想法,将类标签反向传播到图像域中,以产生这样的标签。现在,问题是这个分类器从来没有被训练用于局部决策。第二个问题是好的分类器不会自动产生好的地图。所以,让我们看看另一个想法。这里的关键思想是使用全球平均池。因此,让我们重新思考一下全卷积网络以及我们一直在做的事情。
全卷积处理概述。 CC 下的图片来自深度学习讲座的 4.0 。
你记得我们可以用 M 乘以 N 的卷积来替换只有固定输入大小的完全连接的层。如果你这样做,我们会看到,如果我们有一些输入图像,我们与张量卷积,那么本质上我们得到一个输出。现在,如果我们有多个张量,那么我们就有多个通道。如果我们现在开始跨图像域移动卷积掩模,可以看到,如果输入图像更大,输出也会相对于输出域增长。我们已经看到,为了解决这个问题,我们可以使用全局平均池方法来为每个实例生成类标签。
让我们重新排序汇集和分类。来自深度学习讲座的 CC BY 4.0 下的图片。
现在,你可以做的另一个选择是,你首先汇集到正确的大小。比方说,这是您的输入,然后您首先汇集,这样您就可以应用您的分类网络。然后,转到全连接层中的类。因此,您实际上交换了全连接层和全局平均池的顺序。你先全局平均池,然后产生类。我们现在可以使用它来生成一些标签。
对于类激活图,我们在倒数第二层汇集以获得像素级的类标签。 CC 下的图片来自深度学习讲座的 4.0 。
这个想法是,现在我们看看倒数第二层,我们产生类激活图。所以,你可以看到我们有两个完全连接的层来产生类预测。我们基本上有输入特征地图,我们可以放大到原始图像大小。然后,我们使用分配给倒数第二层输出的权重,相应地缩放它们,然后为每个输出神经元生成一个类激活图。您可以在底部看到这种情况,顺便提一下,还有一种概括,即 Grad-CAM,您可以在[12]中查看。因此,有了这个,我们可以生成类激活映射,并将其用作本地化的标签。
GradCAM 可视化示例。使用 gifify 创建的图像。来源: YouTube 。
我们也可以从包围盒到分割。这里的想法是,我们希望用边界框取代昂贵的注释、完全监督的训练,因为它们不那么单调乏味。
我们能从包围盒到像素标签吗?来自深度学习讲座的 CC BY 4.0 下的图片。
它们可以更快地被注释,当然,这会降低成本。现在的问题是,我们能使用那些廉价的标注和弱监督来产生好的分割吗?实际上有一篇论文研究了这个想法。
自举训练程序怎么样? CC 下的图片来自深度学习讲座的 4.0 。
你可以在[6]中看到。关键的想法是你从输入矩形开始。然后,你对卷积神经网络进行一轮训练。您可以看到,卷积神经网络对标签噪声有一定的鲁棒性,因此,如果您重复该过程,并在迭代过程中优化标签,您可以看到,每一轮训练和优化标签都会获得更好的预测。所以在右手边,你可以看到地面真相,以及我们如何逐渐接近它。现在,实际上有一个问题,因为训练很快就会退化。唯一能让它实际工作的方法是在中间预测中使用后处理。
对于迭代训练,你需要使用一些技巧。 CC 下的图片来自深度学习讲座的 4.0 。
他们使用的想法是他们抑制例如错误的检测。因为你有边界框,所以你可以确定在这个边界框中,它不可能有一个非常不同的类。然后,您还可以删除边界框之外的所有预测。它们可能不准确。此外,您还可以检查它是否小于盒子面积的某个百分比,这可能也不是一个准确的标签。此外,您可以使用条件随机字段边界的外部。我们本质上运行一种传统的分割方法,使用边缘信息来细化边界。您可以使用它,因为没有信息来完善您的标签。如果您使用较小的盒子,还可以做进一步的改进。平均来说,物体是有点圆的,因此角和边包含最少的真阳性。这是一些图像的例子,然后你可以定义带有未知标签的区域。
这些技巧有助于提高性能。不需要训练的传统分割方法消除了迭代的需要。来自深度学习讲座的 CC BY 4.0 下的图片。
以下是一些结果。你可以看到,如果我们不对标签进行任何细化,只是一遍又一遍地训练网络,那么你最终会出现在这条红线中。在训练轮数的天真方法中,你实际上降低了分类的准确性。所以网络退化了,标签也退化了。这不起作用,但如果你使用的技巧与细化的标签与框和排除离群值,你真的可以看到两条绿色曲线出现。经过一轮又一轮的迭代,你实际上在进步。老实说,如果你只是使用 GrabCut+,那么你可以看到,仅仅一轮迭代就已经比应用程序的多次重新运行要好。如果你将 GrabCut+与所谓的 MCG 算法(多尺度组合分组)结合起来,你甚至可以在一轮训练中获得更好的结果。因此,使用启发式方法也有助于将标签从包围盒改进为像素标签。如果你看看这个,完全监督的方法仍然更好。做完整的注释仍然是有意义的,但是如果我们使用这些弱监督的方法之一,我们已经可以在性能方面非常接近了。这确实取决于您的目标应用程序。如果你已经接受了联合中 65%的平均交集,那么你可能会对弱监督方法感到满意。当然,这比生成非常昂贵的基本事实注释要便宜得多。
在这个深度学习讲座中,更多令人兴奋的事情即将到来。 CC 下的图片来自深度学习讲座的 4.0 。
所以下一次,我们想继续讨论我们的弱监督的想法。在下一堂课中,我们不仅会研究二维图像,还会研究体积,并了解一些关于如何使用弱注释来生成体积三维分割算法的巧妙想法。非常感谢大家的聆听,下节课再见。拜拜。
使用弱注释的更多结果。使用 gifify 创建的图像。来源: YouTube 。
如果你喜欢这篇文章,你可以在这里找到更多的文章,或者看看我们的讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTube 、 Twitter 、脸书或 LinkedIn 。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。如果你有兴趣从视频讲座中获得文字记录,试试自动博客。
参考
[1] Özgün Çiçek, Ahmed Abdulkadir, Soeren S Lienkamp, et al. “3d u-net: learning dense volumetric segmentation from sparse annotation”. In: MICCAI. Springer. 2016, pp. 424–432.
[2] Waleed Abdulla. Mask R-CNN for object detection and instance segmentation on Keras and TensorFlow. Accessed: 27.01.2020. 2017.
[3] Olga Russakovsky, Amy L. Bearman, Vittorio Ferrari, et al. “What’s the point: Semantic segmentation with point supervision”. In: CoRR abs/1506.02106 (2015). arXiv: 1506.02106.
[4] Marius Cordts, Mohamed Omran, Sebastian Ramos, et al. “The Cityscapes Dataset for Semantic Urban Scene Understanding”. In: CoRR abs/1604.01685 (2016). arXiv: 1604.01685.
[5] Richard O. Duda, Peter E. Hart, and David G. Stork. Pattern classification. 2nd ed. New York: Wiley-Interscience, Nov. 2000.
[6] Anna Khoreva, Rodrigo Benenson, Jan Hosang, et al. “Simple Does It: Weakly Supervised Instance and Semantic Segmentation”. In: arXiv preprint arXiv:1603.07485 (2016).
[7] Kaiming He, Georgia Gkioxari, Piotr Dollár, et al. “Mask R-CNN”. In: CoRR abs/1703.06870 (2017). arXiv: 1703.06870.
[8] Sangheum Hwang and Hyo-Eun Kim. “Self-Transfer Learning for Weakly Supervised Lesion Localization”. In: MICCAI. Springer. 2016, pp. 239–246.
[9] Maxime Oquab, Léon Bottou, Ivan Laptev, et al. “Is object localization for free? weakly-supervised learning with convolutional neural networks”. In: Proc. CVPR. 2015, pp. 685–694.
[10] Alexander Kolesnikov and Christoph H. Lampert. “Seed, Expand and Constrain: Three Principles for Weakly-Supervised Image Segmentation”. In: CoRR abs/1603.06098 (2016). arXiv: 1603.06098.
[11] Tsung-Yi Lin, Michael Maire, Serge J. Belongie, et al. “Microsoft COCO: Common Objects in Context”. In: CoRR abs/1405.0312 (2014). arXiv: 1405.0312.
[12] Ramprasaath R. Selvaraju, Abhishek Das, Ramakrishna Vedantam, et al. “Grad-CAM: Why did you say that? Visual Explanations from Deep Networks via Gradient-based Localization”. In: CoRR abs/1610.02391 (2016). arXiv: 1610.02391.
[13] K. Simonyan, A. Vedaldi, and A. Zisserman. “Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps”. In: Proc. ICLR (workshop track). 2014.
[14] Bolei Zhou, Aditya Khosla, Agata Lapedriza, et al. “Learning deep features for discriminative localization”. In: Proc. CVPR. 2016, pp. 2921–2929.
[15] Longlong Jing and Yingli Tian. “Self-supervised Visual Feature Learning with Deep Neural Networks: A Survey”. In: arXiv e-prints, arXiv:1902.06162 (Feb. 2019). arXiv: 1902.06162 [cs.CV].
[16] D. Pathak, P. Krähenbühl, J. Donahue, et al. “Context Encoders: Feature Learning by Inpainting”. In: 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2016, pp. 2536–2544.
[17] C. Doersch, A. Gupta, and A. A. Efros. “Unsupervised Visual Representation Learning by Context Prediction”. In: 2015 IEEE International Conference on Computer Vision (ICCV). Dec. 2015, pp. 1422–1430.
[18] Mehdi Noroozi and Paolo Favaro. “Unsupervised Learning of Visual Representations by Solving Jigsaw Puzzles”. In: Computer Vision — ECCV 2016. Cham: Springer International Publishing, 2016, pp. 69–84.
[19] Spyros Gidaris, Praveer Singh, and Nikos Komodakis. “Unsupervised Representation Learning by Predicting Image Rotations”. In: International Conference on Learning Representations. 2018.
[20] Mathilde Caron, Piotr Bojanowski, Armand Joulin, et al. “Deep Clustering for Unsupervised Learning of Visual Features”. In: Computer Vision — ECCV 2018. Cham: Springer International Publishing, 2018, pp. 139–156. A.
[21] A. Dosovitskiy, P. Fischer, J. T. Springenberg, et al. “Discriminative Unsupervised Feature Learning with Exemplar Convolutional Neural Networks”. In: IEEE Transactions on Pattern Analysis and Machine Intelligence 38.9 (Sept. 2016), pp. 1734–1747.
[22] V. Christlein, M. Gropp, S. Fiel, et al. “Unsupervised Feature Learning for Writer Identification and Writer Retrieval”. In: 2017 14th IAPR International Conference on Document Analysis and Recognition Vol. 01. Nov. 2017, pp. 991–997.
[23] Z. Ren and Y. J. Lee. “Cross-Domain Self-Supervised Multi-task Feature Learning Using Synthetic Imagery”. In: 2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition. June 2018, pp. 762–771.
[24] Asano YM., Rupprecht C., and Vedaldi A. “Self-labelling via simultaneous clustering and representation learning”. In: International Conference on Learning Representations. 2020.
[25] Ben Poole, Sherjil Ozair, Aaron Van Den Oord, et al. “On Variational Bounds of Mutual Information”. In: Proceedings of the 36th International Conference on Machine Learning. Vol. 97. Proceedings of Machine Learning Research. Long Beach, California, USA: PMLR, Sept. 2019, pp. 5171–5180.
[26] R Devon Hjelm, Alex Fedorov, Samuel Lavoie-Marchildon, et al. “Learning deep representations by mutual information estimation and maximization”. In: International Conference on Learning Representations. 2019.
[27] Aaron van den Oord, Yazhe Li, and Oriol Vinyals. “Representation Learning with Contrastive Predictive Coding”. In: arXiv e-prints, arXiv:1807.03748 (July 2018). arXiv: 1807.03748 [cs.LG].
[28] Philip Bachman, R Devon Hjelm, and William Buchwalter. “Learning Representations by Maximizing Mutual Information Across Views”. In: Advances in Neural Information Processing Systems 32. Curran Associates, Inc., 2019, pp. 15535–15545.
[29] Yonglong Tian, Dilip Krishnan, and Phillip Isola. “Contrastive Multiview Coding”. In: arXiv e-prints, arXiv:1906.05849 (June 2019), arXiv:1906.05849. arXiv: 1906.05849 [cs.CV].
[30] Kaiming He, Haoqi Fan, Yuxin Wu, et al. “Momentum Contrast for Unsupervised Visual Representation Learning”. In: arXiv e-prints, arXiv:1911.05722 (Nov. 2019). arXiv: 1911.05722 [cs.CV].
[31] Ting Chen, Simon Kornblith, Mohammad Norouzi, et al. “A Simple Framework for Contrastive Learning of Visual Representations”. In: arXiv e-prints, arXiv:2002.05709 (Feb. 2020), arXiv:2002.05709. arXiv: 2002.05709 [cs.LG].
[32] Ishan Misra and Laurens van der Maaten. “Self-Supervised Learning of Pretext-Invariant Representations”. In: arXiv e-prints, arXiv:1912.01991 (Dec. 2019). arXiv: 1912.01991 [cs.CV].
33] Prannay Khosla, Piotr Teterwak, Chen Wang, et al. “Supervised Contrastive Learning”. In: arXiv e-prints, arXiv:2004.11362 (Apr. 2020). arXiv: 2004.11362 [cs.LG].
[34] Jean-Bastien Grill, Florian Strub, Florent Altché, et al. “Bootstrap Your Own Latent: A New Approach to Self-Supervised Learning”. In: arXiv e-prints, arXiv:2006.07733 (June 2020), arXiv:2006.07733. arXiv: 2006.07733 [cs.LG].
[35] Tongzhou Wang and Phillip Isola. “Understanding Contrastive Representation Learning through Alignment and Uniformity on the Hypersphere”. In: arXiv e-prints, arXiv:2005.10242 (May 2020), arXiv:2005.10242. arXiv: 2005.10242 [cs.LG].
[36] Junnan Li, Pan Zhou, Caiming Xiong, et al. “Prototypical Contrastive Learning of Unsupervised Representations”. In: arXiv e-prints, arXiv:2005.04966 (May 2020), arXiv:2005.04966. arXiv: 2005.04966 [cs.CV].
弱自我监督学习—第二部分
FAU 讲座笔记关于深度学习
从二维批注到三维批注
FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座
这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是与幻灯片匹配的讲座视频&的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。 自己试试吧!如果您发现错误,请告诉我们!
航行
在野外,数据也可以用于训练弱监督的 3D 系统。使用 gifify 创建的图像。来源: YouTube 。
欢迎回到深度学习!所以今天,我们想继续讨论每周注释的例子。今天的主题将特别关注三维注释。
让我们看看那些密集的% ! " !"% !"$!!! CC 下的图片来自深度学习讲座的 4.0 。
欢迎回到我们关于弱学习和自我监督学习的讲座,第二部分:从稀疏标注到密集分割。这里的密集是什么意思?“你真笨……”。大概不会。
我们能把二维注释扩展到三维吗?来自深度学习讲座的 CC BY 4.0 下的图片。
我们真正感兴趣的是密集的三维分割。这里,你有一个体积图像的例子,你可以看到我们在左侧看到了几个切片。然后,我们可以注释这些切片中的每一个,然后我们可以用它们来训练,例如,一个三维 U-net 来产生一个完整的三维分割。正如你可能已经猜到的那样,为了消除切片方向引入的偏差,随后用不同的方向对所有切片进行注释是非常乏味的。所以,你不想这么做。在接下来的几分钟里,我们将讨论如何使用稀疏采样切片来获得全自动三维分割。此外,这种方法很有趣,因为它允许交互式纠正。
让我们利用来自深度学习讲座的 4.0 的 CC 下的 D. Image 中的单热编码标签的属性。
让我们研究一下这个想法。你带着稀疏的标签训练。通常,我们有这些一键标签,本质上是一个,如果你是分段掩码的一部分。面具不是真的就是假的。然后,你得到这个交叉熵损失,本质上就是。您使用的正是返回 1 的标签,因为它是带注释的。但是,当然,对于没有注释的样本,这是不正确的。你能做的是,你可以进一步发展这个,叫做加权交叉熵损失。这里,您将原始的交叉熵乘以一个额外的权重 w 。 w 的设置方式是,如果没有标记,它就是零。否则,您可以指定一个大于零的权重。顺便说一句,如果你有这个 w ,你也可以通过更新 y 和 w ( y )来扩展它,使其具有交互性。因此,这意味着您在迭代过程中与用户一起更新标签。如果你这样做,你实际上可以用稀疏标注的三维体积和训练算法来产生完整的三维分割。
拿走监管不力的留言。来自深度学习讲座的 4.0CC 下的图片。
我们来看一些外卖留言。弱监督学习实际上是一种省略细粒度标签的方法,因为它们很昂贵。我们试图买到便宜得多的东西。核心思想是标签的细节比目标少,方法本质上依赖于先验知识,如关于对象的知识、关于分布的知识,甚至是可以帮助您细化标签的先验算法,以及我们之前称为提示的弱标签。
我们也可以用声音提示弱监管。使用 gifify 创建的图像。来源: YouTube 。
通常这比完全监督的训练差,但是在实践中它是高度相关的,因为注释是非常非常昂贵的。别忘了迁移学习。这个也能帮到你。在之前的讲座中,我们已经讨论了很多。我们在这里看到的,当然,与半监督学习和自我监督学习有关。
在这个深度学习讲座中,更多令人兴奋的事情即将到来。 CC 下的图片来自深度学习讲座的 4.0 。
这也是为什么我们下次要谈论自我监督的话题,以及这些想法在过去几年里是如何在这个领域引发了相当大的推动。非常感谢您的收听,期待在下一段视频中与您见面。拜拜。
但是,音频有时可能不明确。使用 gifify 创建的图像。来源: YouTube 。
如果你喜欢这篇文章,你可以在这里找到更多的文章,更多关于机器学习的教育材料,或者看看我们的深度学习讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTube 、 Twitter 、脸书或 LinkedIn 。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。如果你有兴趣从视频讲座中生成文字记录,试试自动博客。
参考
[1] Özgün Çiçek, Ahmed Abdulkadir, Soeren S Lienkamp, et al. “3d u-net: learning dense volumetric segmentation from sparse annotation”. In: MICCAI. Springer. 2016, pp. 424–432.
[2] Waleed Abdulla. Mask R-CNN for object detection and instance segmentation on Keras and TensorFlow. Accessed: 27.01.2020. 2017.
[3] Olga Russakovsky, Amy L. Bearman, Vittorio Ferrari, et al. “What’s the point: Semantic segmentation with point supervision”. In: CoRR abs/1506.02106 (2015). arXiv: 1506.02106.
[4] Marius Cordts, Mohamed Omran, Sebastian Ramos, et al. “The Cityscapes Dataset for Semantic Urban Scene Understanding”. In: CoRR abs/1604.01685 (2016). arXiv: 1604.01685.
[5] Richard O. Duda, Peter E. Hart, and David G. Stork. Pattern classification. 2nd ed. New York: Wiley-Interscience, Nov. 2000.
[6] Anna Khoreva, Rodrigo Benenson, Jan Hosang, et al. “Simple Does It: Weakly Supervised Instance and Semantic Segmentation”. In: arXiv preprint arXiv:1603.07485 (2016).
[7] Kaiming He, Georgia Gkioxari, Piotr Dollár, et al. “Mask R-CNN”. In: CoRR abs/1703.06870 (2017). arXiv: 1703.06870.
[8] Sangheum Hwang and Hyo-Eun Kim. “Self-Transfer Learning for Weakly Supervised Lesion Localization”. In: MICCAI. Springer. 2016, pp. 239–246.
[9] Maxime Oquab, Léon Bottou, Ivan Laptev, et al. “Is object localization for free? weakly-supervised learning with convolutional neural networks”. In: Proc. CVPR. 2015, pp. 685–694.
[10] Alexander Kolesnikov and Christoph H. Lampert. “Seed, Expand and Constrain: Three Principles for Weakly-Supervised Image Segmentation”. In: CoRR abs/1603.06098 (2016). arXiv: 1603.06098.
[11] Tsung-Yi Lin, Michael Maire, Serge J. Belongie, et al. “Microsoft COCO: Common Objects in Context”. In: CoRR abs/1405.0312 (2014). arXiv: 1405.0312.
[12] Ramprasaath R. Selvaraju, Abhishek Das, Ramakrishna Vedantam, et al. “Grad-CAM: Why did you say that? Visual Explanations from Deep Networks via Gradient-based Localization”. In: CoRR abs/1610.02391 (2016). arXiv: 1610.02391.
[13] K. Simonyan, A. Vedaldi, and A. Zisserman. “Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps”. In: Proc. ICLR (workshop track). 2014.
[14] Bolei Zhou, Aditya Khosla, Agata Lapedriza, et al. “Learning deep features for discriminative localization”. In: Proc. CVPR. 2016, pp. 2921–2929.
[15] Longlong Jing and Yingli Tian. “Self-supervised Visual Feature Learning with Deep Neural Networks: A Survey”. In: arXiv e-prints, arXiv:1902.06162 (Feb. 2019). arXiv: 1902.06162 [cs.CV].
[16] D. Pathak, P. Krähenbühl, J. Donahue, et al. “Context Encoders: Feature Learning by Inpainting”. In: 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2016, pp. 2536–2544.
[17] C. Doersch, A. Gupta, and A. A. Efros. “Unsupervised Visual Representation Learning by Context Prediction”. In: 2015 IEEE International Conference on Computer Vision (ICCV). Dec. 2015, pp. 1422–1430.
[18] Mehdi Noroozi and Paolo Favaro. “Unsupervised Learning of Visual Representations by Solving Jigsaw Puzzles”. In: Computer Vision — ECCV 2016. Cham: Springer International Publishing, 2016, pp. 69–84.
[19] Spyros Gidaris, Praveer Singh, and Nikos Komodakis. “Unsupervised Representation Learning by Predicting Image Rotations”. In: International Conference on Learning Representations. 2018.
[20] Mathilde Caron, Piotr Bojanowski, Armand Joulin, et al. “Deep Clustering for Unsupervised Learning of Visual Features”. In: Computer Vision — ECCV 2018. Cham: Springer International Publishing, 2018, pp. 139–156. A.
[21] A. Dosovitskiy, P. Fischer, J. T. Springenberg, et al. “Discriminative Unsupervised Feature Learning with Exemplar Convolutional Neural Networks”. In: IEEE Transactions on Pattern Analysis and Machine Intelligence 38.9 (Sept. 2016), pp. 1734–1747.
[22] V. Christlein, M. Gropp, S. Fiel, et al. “Unsupervised Feature Learning for Writer Identification and Writer Retrieval”. In: 2017 14th IAPR International Conference on Document Analysis and Recognition Vol. 01. Nov. 2017, pp. 991–997.
[23] Z. Ren and Y. J. Lee. “Cross-Domain Self-Supervised Multi-task Feature Learning Using Synthetic Imagery”. In: 2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition. June 2018, pp. 762–771.
[24] Asano YM., Rupprecht C., and Vedaldi A. “Self-labelling via simultaneous clustering and representation learning”. In: International Conference on Learning Representations. 2020.
[25] Ben Poole, Sherjil Ozair, Aaron Van Den Oord, et al. “On Variational Bounds of Mutual Information”. In: Proceedings of the 36th International Conference on Machine Learning. Vol. 97. Proceedings of Machine Learning Research. Long Beach, California, USA: PMLR, Sept. 2019, pp. 5171–5180.
[26] R Devon Hjelm, Alex Fedorov, Samuel Lavoie-Marchildon, et al. “Learning deep representations by mutual information estimation and maximization”. In: International Conference on Learning Representations. 2019.
[27] Aaron van den Oord, Yazhe Li, and Oriol Vinyals. “Representation Learning with Contrastive Predictive Coding”. In: arXiv e-prints, arXiv:1807.03748 (July 2018). arXiv: 1807.03748 [cs.LG].
[28] Philip Bachman, R Devon Hjelm, and William Buchwalter. “Learning Representations by Maximizing Mutual Information Across Views”. In: Advances in Neural Information Processing Systems 32. Curran Associates, Inc., 2019, pp. 15535–15545.
[29] Yonglong Tian, Dilip Krishnan, and Phillip Isola. “Contrastive Multiview Coding”. In: arXiv e-prints, arXiv:1906.05849 (June 2019), arXiv:1906.05849. arXiv: 1906.05849 [cs.CV].
[30] Kaiming He, Haoqi Fan, Yuxin Wu, et al. “Momentum Contrast for Unsupervised Visual Representation Learning”. In: arXiv e-prints, arXiv:1911.05722 (Nov. 2019). arXiv: 1911.05722 [cs.CV].
[31] Ting Chen, Simon Kornblith, Mohammad Norouzi, et al. “A Simple Framework for Contrastive Learning of Visual Representations”. In: arXiv e-prints, arXiv:2002.05709 (Feb. 2020), arXiv:2002.05709. arXiv: 2002.05709 [cs.LG].
[32] Ishan Misra and Laurens van der Maaten. “Self-Supervised Learning of Pretext-Invariant Representations”. In: arXiv e-prints, arXiv:1912.01991 (Dec. 2019). arXiv: 1912.01991 [cs.CV].
33] Prannay Khosla, Piotr Teterwak, Chen Wang, et al. “Supervised Contrastive Learning”. In: arXiv e-prints, arXiv:2004.11362 (Apr. 2020). arXiv: 2004.11362 [cs.LG].
[34] Jean-Bastien Grill, Florian Strub, Florent Altché, et al. “Bootstrap Your Own Latent: A New Approach to Self-Supervised Learning”. In: arXiv e-prints, arXiv:2006.07733 (June 2020), arXiv:2006.07733. arXiv: 2006.07733 [cs.LG].
[35] Tongzhou Wang and Phillip Isola. “Understanding Contrastive Representation Learning through Alignment and Uniformity on the Hypersphere”. In: arXiv e-prints, arXiv:2005.10242 (May 2020), arXiv:2005.10242. arXiv: 2005.10242 [cs.LG].
[36] Junnan Li, Pan Zhou, Caiming Xiong, et al. “Prototypical Contrastive Learning of Unsupervised Representations”. In: arXiv e-prints, arXiv:2005.04966 (May 2020), arXiv:2005.04966. arXiv: 2005.04966 [cs.CV].
弱自我监督学习——第三部分
FAU 讲座笔记关于深度学习
自我监督标签
FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座
这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是与幻灯片匹配的讲座视频&的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。 自己试试吧!如果您发现错误,请告诉我们!
航行
自我监督的人脸模型学习。使用 gifify 创建的图像。来源: YouTube 。
欢迎回到深度学习!所以今天,我们想开始谈论被称为自我监督学习的想法。我们希望通过自我监督获得标签,并将在接下来的几个视频中研究这个术语的实际含义以及核心思想。
AI 的革命不会被监督。 CC 下的图片来自深度学习讲座的 4.0 。
这是弱自我监督学习的第三部分。今天,我们实际上开始谈论自我监督学习。有一些关于自我监督学习的观点,你可以把它们分成两部分。你可以说,一部分是如何获得自我监督的标签,另一部分是你对损失进行处理,以便嵌入这些标签。我们有适合自我监督的特殊损失。所以,我们先从定义说起。动机是你可以说,传统上,机器学习领域的人相信,监督当然是产生最佳结果的方法。但是,我们有大量我们需要的标签。所以,你可以很快得出结论,人工智能革命不会被监督。这在 Yann LeCun 的以下声明中非常明显。“人类和动物的大部分学习都是无监督学习。如果智能是一块蛋糕,无监督学习就是蛋糕,有监督学习就是蛋糕上的糖衣,强化学习就是蛋糕上的樱桃。”当然,这是由生物学中的观察以及人类和动物如何学习来证实的。
自我监督的理念。来自深度学习讲座的 CC BY 4.0 下的图片。
自我监督的想法是,你试图利用你已经掌握的关于你的问题的信息,想出一些替代标签,让你做训练过程。Yann LeCun 在这张幻灯片上的主要观点可以总结如下:你试图从过去预测未来,你也可以从最近的过去预测未来,你从现在预测过去或者从底部预测顶部。此外,一个选项可以是从可见物中预测被遮挡物。你假装有一部分输入你不知道,并预测。这实际上允许您提出一个代理任务。使用代理任务,您已经可以执行培训了。好的一面是你根本不需要任何标签,因为你本质上使用了数据的结构。
Yann LeCun 对自我监督学习的定义。 CC 下的图片来自深度学习讲座的 4.0 。
本质上,自我监督学习是一种无监督的学习方法。但时不时地,你需要清楚地表明,你正在一个已经研究了几十年的领域里做一些新的事情。所以,你可能不会再提到无监督这个术语,Yann LeCun 实际上提出了自我监督学习这个术语。他意识到无人监管是一个复杂而令人困惑的术语。因此,尽管这些想法以前就已经存在,术语自我监督学习已经建立。使用这个术语来专注于一种特定的无监督学习是有意义的。所以,你可以说这是无监督学习的一个子类。它以受监督的方式使用伪任务的借口代理。这实质上意味着你可以使用所有的监督学习方法,并且你有自动生成的标签。然后,它们可以被用来衡量正确性,以创造一个损失,以训练你的重量。其想法是,这对于下游任务是有益的,如检索、监督或半监督分类等。顺便说一下,在这种广义的定义中,你也可以认为像生成对抗网络这样的生成模型也是某种自我监督的学习方法。所以基本上,Yann LeCun 有一个非常好的想法,用一种新的方式来构建这种学习。如果你这样做,这当然非常有帮助,因为你可以清楚地表明你正在做一些新的事情,你不同于许多已经存在很长时间的无监督学习方法。
不同自我监督任务的概述。来自深度学习讲座的 CC BY 4.0 下的图片。
所以,让我们来看看这些想法。当然,有这些托词任务,您可以使用基于生成的方法。所以,你可以使用 GANs,你可以做像超分辨率方法这样的事情。在那里,您向下采样并尝试预测更高分辨率的图像。你可以做修补方法或着色。当然,这也适用于视频。您可以使用基于上下文的方法。在这里,您尝试解决像拼图游戏或聚类这样的问题。在基于语义标签的方法中,您可以尝试估计移动对象或预测相对深度。此外,还有跨通道方法,您可以尝试使用来自多个通道的信息。你有一个链接的传感器系统,假设你有一个深度相机和一个 RGB 相机。然后,您可以将两者联系起来,并尝试从另一个预测一个。如果你有一个附加的传感器,假设你有一辆车,你正在移动,你有一个 GPS 传感器或任何其他传感系统,它会告诉你你的车是如何移动的,那么你可以尝试从实际的视频序列中预测自我运动。
自我监督的汽车场景分析。使用 gifify 创建的图像。来源: YouTube 。
因此,让我们更详细地研究一下这个问题,看看基于图像的自我监督学习技术,以完善表示学习,这是第一个想法,也是生成性的。例如,您可以在非常容易生成标签的地方对图像进行着色。
学习颜色。来自深度学习讲座的 CC BY 4.0 下的图片。
从彩色图像开始,计算通道的平均值,得到灰度值图像。然后,你再尝试预测一下原来的颜色。你可以使用一种场景和编码器/解码器的方法来预测正确的颜色图。
学习图像补丁。 CC 下的图片来自深度学习讲座的 4.0 。
此外,你也可以去修补。你可以遮挡图像的一部分,然后试着预测它们。这实际上导致了这样一个任务,您尝试预测一个完整的图像,然后将实际的完整图像与生成器创建的预测进行比较。例如,你可以在 GAN 类型的损失设置中训练这些东西。我们有一个鉴别器,然后告诉你这是否是一个好的修复结果。
还有关于空间语境的想法。在这里,一个非常常见的方法是解决一个拼图游戏。你取一个小块,或者实际上,你取图像的九个小块,你基本上试图预测你是否有中心小块,比方说,对于猫的脸,你有一个。然后,您希望预测所显示的修补程序的 ID。所以,你放入两张图片,试着预测第二块的正确位置。请注意,这有点棘手,因为有一个简单的解决方案。如果您有持续的边界模式,就会发生这种情况。如果你有连续的纹理,那么在下一个补片中实际的补片很容易被发现,因为纹理是连续的。因此,您应该使用足够大的间隙来解决这个问题。颜色可能也很棘手。您可以使用色差,并通过将绿色和洋红色向灰色移动来预处理图像,或者您可以随机删除两个颜色通道,以避免您只是了解颜色。
学习更难的谜题。来自深度学习讲座的 CC BY 4.0 下的图片。
这是拼图游戏的改进版本。在 jigsaw puzzle++中,想法是你基本上随机化补丁的顺序,并且你试图预测每个补丁的正确位置。现在,最酷的事情是,如果你有 9 块瓷砖,那么你就有 9 块!可能的排列。这是 30 多万。因此,我们可以为这项任务创建大量的标签,你会看到,以正确的方式完成这项任务实际上是非常关键的。所以,不仅仅是你有很多排列。
问题的正确选择至关重要。 CC 下的图片来自深度学习讲座的 4.0 。
您还需要确保有一个合适的平均汉明距离。你可以看看你是否真的遵从了这个想法,那么这就有所不同了。如果你有一个太低的平均汉明距离,拼图任务精度不是很高。如果你增加它,拼图任务的准确性也会增加。这种高精度很有可能也会应用到感兴趣的实际任务中。在这里,这是一个检测任务,在 jigsaw 任务精度很高的情况下,您还可以构建一个更好的检测器。
学习形象定位。来自深度学习讲座的 CC BY 4.0 下的图片。
嗯,我们还会对哪些想法感兴趣呢?当然,你可以用旋转做类似的事情。然后,你试着预测图像的正确旋转。这也是一个非常便宜的标签,你可以生成。
在扭曲中学习等价。 CC 下的图片来自深度学习讲座的 4.0 。
让我们看一下上下文相似性。这里的想法是,你想弄清楚这个图像是来自相同还是不同的上下文。所以,你可以选择一个输入补丁,然后扩大它。您可以使用不同的增强方式,如颜色对比度的变化、轻微的移动和一般的像素转换:您还可以添加噪声,这基本上为每个补丁提供了大量其他补丁,它们应该显示相同的内容。现在,您可以用其他补丁重复这一过程,这样您就可以构建一个大型数据库。有了这些补丁,你就可以训练它是否是同一个补丁,然后你可以区分这几个好的类,并以类似的方式训练你的系统。
聚类作为标签。来自深度学习讲座的 4.0CC 下的图片。
另一种方法是使用集群。这是我的同事文森特·克里斯特林的作品。他感兴趣的是为作者识别构建更好的特征。所以,他从检测关键点开始。然后关键点允许你提取补丁。同时,如果使用像 SIFT 这样的算法检测到关键点,则这些关键点会带有一个特征描述符。在未来的描述符上,您可以执行聚类,您得到的聚类可能已经是相当好的训练样本。因此,您可以使用 cluster-ID 来训练一个 ResNet 来预测相应的补丁。这样,您可以使用完全无标签的数据集,进行聚类,生成伪标签,并训练您的系统。文森特已经表明,这实际上给了相当多的性能,以改善表征学习。
迭代聚类学习。 CC 下的图片来自深度学习讲座的 4.0 。
这个想法后来得到了进一步发展。你可以交替进行。这个想法被称为 DeepCluster。现在,你接受一些输入,你有一个网络,然后你基本上从一个未经训练的网络开始。您可以对生成的特征进行聚类,通过聚类,例如简单的 k-means,您可以生成伪标签,从而允许反向传播和表示学习的训练。现在,当然,如果你从随机初始化开始,聚类可能不是很好。因此,您希望在分类和聚类之间交替进行。然后,这也允许你建立一个非常强大的卷积神经网络。琐碎的解决方案也有一些你想避免的问题。因此,您希望重新分配空的聚类,当然,您可以使用一些技巧,例如通过分配给它的聚类大小的倒数来对输入的贡献进行加权。
具有最佳运输的集群。来自深度学习讲座的 CC BY 4.0 下的图片。
你甚至可以进一步发展这个想法。这导致最佳运输的自我标记[24]。在这里,他们基本上进一步发展了 DeepCluster。他们没有使用聚类,而是使用 Sinkhorn-Knopp 算法来确定伪标签。这里的想法是你试图预测最佳运输。这里,我们可以看到一个最优运输问题的例子。假设,您在仓库 A 和仓库 b 中有供应品。它们各有 25 台笔记本电脑,您在商店 1 和商店 2 中各有 25 台笔记本电脑的需求。然后,您可以看到您想要将这些笔记本电脑运送到各自的商店。当然,你从仓库 A 拿走最近的一台和所有的笔记本电脑,在这种情况下,去商店 1,仓库 B 的所有笔记本电脑去商店 2。
聚类方法的比较。 CC 下的图片来自深度学习讲座的 4.0 。
这个算法的好处是,你可以找到它的线性版本。所以,你可以用线性代数来表达所有这些,这意味着你也可以把它嵌入到神经网络中。如果您将 DeepCluser 与最优传输进行比较,那么您可能需要记住,如果您没有单独的聚类损失,这可能会导致退化的解决方案。此外,请记住,聚类方法会最小化网络也试图优化的相同交叉熵损失。
综合和多任务学习也非常有用。来自深度学习讲座的 CC BY 4.0 下的图片。
嗯,还有几个主意。我们知道这些食谱就像多任务学习一样。也可以做多任务学习,进行自我监督学习。这里的一个例子是你使用合成图像。所以,你有一些合成图像,你可以生成深度,表面法线,或者轮廓。然后,你可以使用这些作为标签,以训练你的网络,并产生一个良好的表现。此外,您还可以在一种 GAN 设置中最小化真实数据和合成数据之间的特征空间域差异。这也导致了非常好的表征学习。
在这个深度学习讲座中,更多令人兴奋的事情即将到来。 CC 下的图片来自深度学习讲座的 4.0 。
下一次,我们想谈谈如何处理这些损失,并使它们更适合自我监督的学习任务。我们将特别看到,对比损失对此非常有用。非常感谢大家的收听,下期视频再见。拜拜。
更多的自我监督的人脸建模。使用 gifify 创建的图像。来源: YouTube 。
如果你喜欢这篇文章,你可以在这里找到更多的文章,更多关于机器学习的教育材料,或者看看我们的深度学习讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTube 、 Twitter 、脸书或 LinkedIn 。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。如果你有兴趣从视频讲座中生成文字记录,试试自动博客。
参考
[1] Özgün Çiçek, Ahmed Abdulkadir, Soeren S Lienkamp, et al. “3d u-net: learning dense volumetric segmentation from sparse annotation”. In: MICCAI. Springer. 2016, pp. 424–432.
[2] Waleed Abdulla. Mask R-CNN for object detection and instance segmentation on Keras and TensorFlow. Accessed: 27.01.2020. 2017.
[3] Olga Russakovsky, Amy L. Bearman, Vittorio Ferrari, et al. “What’s the point: Semantic segmentation with point supervision”. In: CoRR abs/1506.02106 (2015). arXiv: 1506.02106.
[4] Marius Cordts, Mohamed Omran, Sebastian Ramos, et al. “The Cityscapes Dataset for Semantic Urban Scene Understanding”. In: CoRR abs/1604.01685 (2016). arXiv: 1604.01685.
[5] Richard O. Duda, Peter E. Hart, and David G. Stork. Pattern classification. 2nd ed. New York: Wiley-Interscience, Nov. 2000.
[6] Anna Khoreva, Rodrigo Benenson, Jan Hosang, et al. “Simple Does It: Weakly Supervised Instance and Semantic Segmentation”. In: arXiv preprint arXiv:1603.07485 (2016).
[7] Kaiming He, Georgia Gkioxari, Piotr Dollár, et al. “Mask R-CNN”. In: CoRR abs/1703.06870 (2017). arXiv: 1703.06870.
[8] Sangheum Hwang and Hyo-Eun Kim. “Self-Transfer Learning for Weakly Supervised Lesion Localization”. In: MICCAI. Springer. 2016, pp. 239–246.
[9] Maxime Oquab, Léon Bottou, Ivan Laptev, et al. “Is object localization for free? weakly-supervised learning with convolutional neural networks”. In: Proc. CVPR. 2015, pp. 685–694.
[10] Alexander Kolesnikov and Christoph H. Lampert. “Seed, Expand and Constrain: Three Principles for Weakly-Supervised Image Segmentation”. In: CoRR abs/1603.06098 (2016). arXiv: 1603.06098.
[11] Tsung-Yi Lin, Michael Maire, Serge J. Belongie, et al. “Microsoft COCO: Common Objects in Context”. In: CoRR abs/1405.0312 (2014). arXiv: 1405.0312.
[12] Ramprasaath R. Selvaraju, Abhishek Das, Ramakrishna Vedantam, et al. “Grad-CAM: Why did you say that? Visual Explanations from Deep Networks via Gradient-based Localization”. In: CoRR abs/1610.02391 (2016). arXiv: 1610.02391.
[13] K. Simonyan, A. Vedaldi, and A. Zisserman. “Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps”. In: Proc. ICLR (workshop track). 2014.
[14] Bolei Zhou, Aditya Khosla, Agata Lapedriza, et al. “Learning deep features for discriminative localization”. In: Proc. CVPR. 2016, pp. 2921–2929.
[15] Longlong Jing and Yingli Tian. “Self-supervised Visual Feature Learning with Deep Neural Networks: A Survey”. In: arXiv e-prints, arXiv:1902.06162 (Feb. 2019). arXiv: 1902.06162 [cs.CV].
[16] D. Pathak, P. Krähenbühl, J. Donahue, et al. “Context Encoders: Feature Learning by Inpainting”. In: 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2016, pp. 2536–2544.
[17] C. Doersch, A. Gupta, and A. A. Efros. “Unsupervised Visual Representation Learning by Context Prediction”. In: 2015 IEEE International Conference on Computer Vision (ICCV). Dec. 2015, pp. 1422–1430.
[18] Mehdi Noroozi and Paolo Favaro. “Unsupervised Learning of Visual Representations by Solving Jigsaw Puzzles”. In: Computer Vision — ECCV 2016. Cham: Springer International Publishing, 2016, pp. 69–84.
[19] Spyros Gidaris, Praveer Singh, and Nikos Komodakis. “Unsupervised Representation Learning by Predicting Image Rotations”. In: International Conference on Learning Representations. 2018.
[20] Mathilde Caron, Piotr Bojanowski, Armand Joulin, et al. “Deep Clustering for Unsupervised Learning of Visual Features”. In: Computer Vision — ECCV 2018. Cham: Springer International Publishing, 2018, pp. 139–156. A.
[21] A. Dosovitskiy, P. Fischer, J. T. Springenberg, et al. “Discriminative Unsupervised Feature Learning with Exemplar Convolutional Neural Networks”. In: IEEE Transactions on Pattern Analysis and Machine Intelligence 38.9 (Sept. 2016), pp. 1734–1747.
[22] V. Christlein, M. Gropp, S. Fiel, et al. “Unsupervised Feature Learning for Writer Identification and Writer Retrieval”. In: 2017 14th IAPR International Conference on Document Analysis and Recognition Vol. 01. Nov. 2017, pp. 991–997.
[23] Z. Ren and Y. J. Lee. “Cross-Domain Self-Supervised Multi-task Feature Learning Using Synthetic Imagery”. In: 2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition. June 2018, pp. 762–771.
[24] Asano YM., Rupprecht C., and Vedaldi A. “Self-labelling via simultaneous clustering and representation learning”. In: International Conference on Learning Representations. 2020.
[25] Ben Poole, Sherjil Ozair, Aaron Van Den Oord, et al. “On Variational Bounds of Mutual Information”. In: Proceedings of the 36th International Conference on Machine Learning. Vol. 97. Proceedings of Machine Learning Research. Long Beach, California, USA: PMLR, Sept. 2019, pp. 5171–5180.
[26] R Devon Hjelm, Alex Fedorov, Samuel Lavoie-Marchildon, et al. “Learning deep representations by mutual information estimation and maximization”. In: International Conference on Learning Representations. 2019.
[27] Aaron van den Oord, Yazhe Li, and Oriol Vinyals. “Representation Learning with Contrastive Predictive Coding”. In: arXiv e-prints, arXiv:1807.03748 (July 2018). arXiv: 1807.03748 [cs.LG].
[28] Philip Bachman, R Devon Hjelm, and William Buchwalter. “Learning Representations by Maximizing Mutual Information Across Views”. In: Advances in Neural Information Processing Systems 32. Curran Associates, Inc., 2019, pp. 15535–15545.
[29] Yonglong Tian, Dilip Krishnan, and Phillip Isola. “Contrastive Multiview Coding”. In: arXiv e-prints, arXiv:1906.05849 (June 2019), arXiv:1906.05849. arXiv: 1906.05849 [cs.CV].
[30] Kaiming He, Haoqi Fan, Yuxin Wu, et al. “Momentum Contrast for Unsupervised Visual Representation Learning”. In: arXiv e-prints, arXiv:1911.05722 (Nov. 2019). arXiv: 1911.05722 [cs.CV].
[31] Ting Chen, Simon Kornblith, Mohammad Norouzi, et al. “A Simple Framework for Contrastive Learning of Visual Representations”. In: arXiv e-prints, arXiv:2002.05709 (Feb. 2020), arXiv:2002.05709. arXiv: 2002.05709 [cs.LG].
[32] Ishan Misra and Laurens van der Maaten. “Self-Supervised Learning of Pretext-Invariant Representations”. In: arXiv e-prints, arXiv:1912.01991 (Dec. 2019). arXiv: 1912.01991 [cs.CV].
33] Prannay Khosla, Piotr Teterwak, Chen Wang, et al. “Supervised Contrastive Learning”. In: arXiv e-prints, arXiv:2004.11362 (Apr. 2020). arXiv: 2004.11362 [cs.LG].
[34] Jean-Bastien Grill, Florian Strub, Florent Altché, et al. “Bootstrap Your Own Latent: A New Approach to Self-Supervised Learning”. In: arXiv e-prints, arXiv:2006.07733 (June 2020), arXiv:2006.07733. arXiv: 2006.07733 [cs.LG].
[35] Tongzhou Wang and Phillip Isola. “Understanding Contrastive Representation Learning through Alignment and Uniformity on the Hypersphere”. In: arXiv e-prints, arXiv:2005.10242 (May 2020), arXiv:2005.10242. arXiv: 2005.10242 [cs.LG].
[36] Junnan Li, Pan Zhou, Caiming Xiong, et al. “Prototypical Contrastive Learning of Unsupervised Representations”. In: arXiv e-prints, arXiv:2005.04966 (May 2020), arXiv:2005.04966. arXiv: 2005.04966 [cs.CV].
弱自我监督学习——第四部分
FAU 讲座笔记关于深度学习
对比损失
FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座
这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是与幻灯片匹配的讲座视频&的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。 自己试试吧!如果您发现错误,请告诉我们!
航行
通过视频学习进行自我监督。使用 gifify 创建的图像。来源: YouTube 。
欢迎回到深度学习!所以,今天我们想在最后一部分讨论弱自我监督学习:一些新的损失也可以帮助我们进行自我监督。那么,让我们看看幻灯片上有什么:今天是第四部分,主题是对比自我监督学习。
对比学习导论。 CC 下的图片来自深度学习讲座的 4.0 。
在对比学习中,你试图把学习问题公式化为一种匹配方法。这里,我们有一个监督学习的例子。这样做的目的是将正确的动物与其他动物相匹配。学习的任务是动物是相同的还是不同的。这实际上是一种非常强大的训练形式,因为你可以避免生成模型或上下文模型中的一些缺点。例如,像素级损失可能过度集中于基于像素的细节,而基于像素的目标通常假定像素无关。这降低了模拟相关性或复杂结构的能力。在这里,我们基本上可以建立抽象模型,这些模型也是以一种分层的方式建立的。现在,我们有了这个受监督的示例,当然,这也适用于我们之前看到的许多不同的伪标签。
数学实现。来自深度学习讲座的 CC BY 4.0 下的图片。
然后我们可以建立这种对比损失。我们所需要的是当前样本 x 一些正样本 x plus,然后是来自不同类别的负样本。此外,我们需要一个相似度函数 s,例如,这可以是余弦相似度。你也可以有一个可训练的相似性函数,但一般来说,你也可以使用一些我们在这节课中已经讨论过的标准相似性函数。此外,您希望应用网络 f( x )并计算相似性。目标是在阳性样本和考虑中的样本以及所有阴性样本之间具有更高的相似性。这就导致了对比损失。它有时也被称为信息归一化交叉熵损失。在文献中也有其他名称:n 对损失,一致性损失,和基于 NCE 的排名。对于 n 路 softmax 分类器来说,这本质上是交叉熵损失。这里的想法是,你基本上有正面的例子,然后这被所有的例子标准化。这里,我将第一行中的两个样本进行拆分,但您可以看到,拆分实际上是所有样本的总和。这就产生了一种 softmax 分类器。
对比损耗也可以包括温度参数。 CC 下的图片来自深度学习讲座的 4.0 。
因此,最小化对比损失实际上最大化了 f( x )和 f( x plus)之间的互信息的下限,如这两个参考文献所示。还有一个常见的变化是引入温度超参数,如本例所示。所以,你除以一个额外的τ。
对比损失的两个重要性质。 CC 下的图片来自深度学习讲座的 4.0 。
对比损失是非常有效的,它们有两个非常有用的性质。一方面,它们是一致的。所以,相似的样本有相似的特征。另一方面,它们创造了一致性,因为它们保留了最大限度的信息。
SimCLR 中的设置。来自深度学习讲座的 4.0CC 下的图片。
让我们来看一个如何构建的例子。这是出自[31]。在这里,您可以看到,我们可以从一些样本 x 开始。假设你从一个小批量的 n 个样本开始。然后,用两种不同的数据扩充操作来转换每个样本。这导致 2n 个扩充样本。因此,对于该批次中的每个样本,您会得到两个不同的增量。这里,我们将 t 和 t '应用于同一个样本。然后,这个样本是相同的,并且你的变换 t 和 t '取自一组扩充 t。现在,你最终得到每个样本的一个正对和 2(n-1)个负对。因为它们都是不同的样本,所以您可以通过基本编码器 f( x )计算一个表示,然后产生一些 h ,这是我们感兴趣的实际特征表示。f( x )的一个例子可以是 ResNet-50。在此之上,我们有一个表示头 g,然后进行额外的降维。注意 g 和 f 在两个分支中都是相同的。所以,你可以说这种方法和所谓的连体网络有很多相似之处。因此,您可以从 g 中获得两个不同的集合 z 下标 I 和 z 下标 j。利用这些 z ,您可以计算对比损失,然后将其表示为两个 z 在温度参数τ上的相似性。你看,这基本上是我们之前已经看到的相同的对比损失。
通过运动传播的自我监督学习。使用 gifify 创建的图像。来源: YouTube 。
当然,对比损失也可以在监督下合并。这就导致了有监督的对比学习。这里的想法是,如果你只是进行自我监督的对比,你会有正面的例子和负面的例子。有了监督对比损失,你还可以嵌入额外的类信息。
监督与自我监督的对比学习。来自深度学习讲座的 4.0CC 下的图片。
所以,这有额外的积极影响。让我们看看这是如何应用的。我们基本上保持训练两个耦合网络的相同想法。
自我监督和监督对比损失是兼容的。 CC 下的图片来自深度学习讲座的 4.0 。
所以让我们总结一下对比学习和监督对比学习的区别。在监督学习中,你基本上有你的编码器,这里显示为这个灰色块。然后,你最终得到一些描述,这是一个 2048 维向量,你进一步训练一个分类头,使用经典的交叉熵损失产生类别 dog。现在,在对比学习中,你可以扩展这个。基本上你会有两个耦合的网络,你有两个补片,它们要么相同,要么不同,使用不同的增强技术。你训练这些耦合的重量共享网络来产生 2048 维的表现。在顶部,你有这个表现头部,你使用表现层本身的对比损失。现在,如果将监督损失和对比损失两者结合起来,基本上与对比损失的设置相同,但在表示层,您可以增加一个严格监督的额外损失。这里,你仍然有典型的 softmax,比如说一千个类,在这个例子中预测 dog。你把它耦合到表示层来融合对比损失和监督损失。
监督对比损失。来自深度学习讲座的 CC BY 4.0 下的图片。
因此,自我监督不知道类别标签,它只知道一个正例。被监督的人知道所有的类别标签,并且每个例子都有许多优点。然后可以将其合并,并计算具有相同类别锚的任何样本 z 之间的损耗。然后,这允许你计算任何样本 z 下标 j 与锚 z 下标 I 具有相同类别之间的损耗。因此,这两个类别是相同的。这导致了下面的损失:你可以看到这仍然是基于这种对比损失。现在,我们明确地使用余弦相似度,仅仅使用两个向量的内积。此外,您可以看到,我们在这里添加了红色术语,告诉我们只使用有不同样本的情况。所以 I 不等于 j,我们想在这个损失中使用样本,我们想在这个损失中使用样本,实际的类成员是相同的。
监督对比损失的性质。来自深度学习讲座的 4.0CC 下的图片。
有几件额外的事情你必须记住。向量 z 需要被归一化。这意味着您想要引入一个缩放比例,其中这个 w 实际上是投影网络的输出,您对其进行缩放,使其具有单位范数。这实质上导致了某种你可以解释为内置焦损失的东西,因为相对于 w 的梯度对于硬正片和负片来说会很高,否则会很小。顺便说一下,对于一个正的和一个负的,这个损失与实际观测值和正的欧几里德距离的平方成正比,减去实际观测值和负的欧几里德距离的平方。顺便说一下,这也是暹罗网络中非常常见的对比损失。
根据[33],监督对比损失相对于超参数而言相当稳定。来自深度学习讲座的 4.0CC 下的图片。
让我们来看看超参数。事实证明,对于超参数,监督对比损失也非常稳定,就学习速率、优化器以及增强而言,您不会看到这些大的变化,就好像您只使用监督交叉熵损失一样。如果你对确切的实验细节感兴趣,请看看[33]。
你应该知道的关于对比损失的其他一些事情。 CC 下的图片来自深度学习讲座的 4.0 。
还有什么?嗯,训练比交叉熵损失慢 50%左右。它确实通过 CutMix 等最先进的数据增强技术改进了训练,并且支持潜在空间中的无监督聚类。这允许他们校正标签噪声。它还为半监督学习等引入了新的可能性。
引导你自己的潜能使用其他学习方式的技巧。来自深度学习讲座的 CC BY 4.0 下的图片。
嗯,是这样吗?没有别的想法了吗?嗯,还有一个有趣的想法是自我监督学习。你可以说这是一个范式的转变。这是一篇非常新的论文,但我把它放在这里是因为它有一些非常有趣的想法,与对比损失非常不同。所以这叫做“引导你自己的潜能”(BYOL),他们观察到的问题是,配对的选择是至关重要的。因此,为了得到正确的配对,通常需要大批量、内存库和定制挖掘策略。你还需要有正确的增强策略。在引导你自己的潜能时,他们不需要消极的一对。它们不需要对比损失,并且与对比对应的图像相比,它们对批量大小和图像增强集的变化更有弹性。
该架构从在线网络和目标网络构建损耗。 CC 下的图片来自深度学习讲座的 4.0 。
有什么想法?他们这里也有类似的设置。他们有这种网络来进行观察、表现、投射和预测。现在,他们有了一个在线网络和一个目标网络。他们相互影响,相互学习。现在,当然,这是有问题的,因为理论上有一个微不足道的解决方案,比如对所有图像都是零。因此,他们用在线网络的慢速移动平均值作为目标网络来应对。这可以防止塌陷或重量很快变为零。作为损失,他们使用 l2 归一化预测的均方误差。这与余弦距离成正比。
BYOL 超越了最先进的性能。 CC 下的图片来自深度学习讲座的 4.0 。
非常有趣的是,通过这个非常简单的想法,他们实际上胜过了最先进的和自我监督的学习方法。因此,你可以在这里看到我们在开始和 simCLR 中谈到的着色和不同的想法。他们用他们的方法胜过他们。他们甚至超过了 simCLR。
就性能与参数而言,BYOL 也接近监督学习。来自深度学习讲座的 CC BY 4.0 下的图片。
有趣的是,就参数数量而言,它们非常接近监督学习,在 ImageNet 上的图像精度排名第一。因此,他们用非常简单的方法就能非常接近最先进的性能。事实上,我很想知道这是否也可以转移到 ImageNet 之外的其他领域。特别是,例如,在医学数据上研究这种方法将是有趣的。你可以看到,有了自我监督学习,我们非常非常接近最先进的水平。这是一个非常活跃的研究领域。所以,让我们看看这些结果在接下来的几个月和几年里会如何发展,以及在几个月后哪些方法会被认为是最先进的方法。
在这个深度学习讲座中,更多令人兴奋的事情即将到来。 CC 下的图片来自深度学习讲座的 4.0 。
当然,我们现在正慢慢接近我们的讲座的尾声。但是下次还是会有一些事情出现。特别是,下次我们要讨论如何处理图形。还有一个非常好的概念,叫做图卷积,我想在下一个视频中向你们介绍这个主题。我仍然想展示的另一个新兴方法是如何避免从头开始学习一切以及如何将特定的先验知识嵌入深度网络的想法。也有一些非常酷的方法,我认为值得在这个讲座中展示。所以,我下面有很多参考资料。非常感谢您的收听,期待在下一段视频中与您见面。拜拜。
如果你喜欢这篇文章,你可以在这里找到更多的文章,或者看看我们的讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTube 、 Twitter 、脸书或 LinkedIn 。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。如果你有兴趣从视频讲座中获得文字记录,试试自动博客。
参考
[1] Özgün Çiçek, Ahmed Abdulkadir, Soeren S Lienkamp, et al. “3d u-net: learning dense volumetric segmentation from sparse annotation”. In: MICCAI. Springer. 2016, pp. 424–432.
[2] Waleed Abdulla. Mask R-CNN for object detection and instance segmentation on Keras and TensorFlow. Accessed: 27.01.2020. 2017.
[3] Olga Russakovsky, Amy L. Bearman, Vittorio Ferrari, et al. “What’s the point: Semantic segmentation with point supervision”. In: CoRR abs/1506.02106 (2015). arXiv: 1506.02106.
[4] Marius Cordts, Mohamed Omran, Sebastian Ramos, et al. “The Cityscapes Dataset for Semantic Urban Scene Understanding”. In: CoRR abs/1604.01685 (2016). arXiv: 1604.01685.
[5] Richard O. Duda, Peter E. Hart, and David G. Stork. Pattern classification. 2nd ed. New York: Wiley-Interscience, Nov. 2000.
[6] Anna Khoreva, Rodrigo Benenson, Jan Hosang, et al. “Simple Does It: Weakly Supervised Instance and Semantic Segmentation”. In: arXiv preprint arXiv:1603.07485 (2016).
[7] Kaiming He, Georgia Gkioxari, Piotr Dollár, et al. “Mask R-CNN”. In: CoRR abs/1703.06870 (2017). arXiv: 1703.06870.
[8] Sangheum Hwang and Hyo-Eun Kim. “Self-Transfer Learning for Weakly Supervised Lesion Localization”. In: MICCAI. Springer. 2016, pp. 239–246.
[9] Maxime Oquab, Léon Bottou, Ivan Laptev, et al. “Is object localization for free? weakly-supervised learning with convolutional neural networks”. In: Proc. CVPR. 2015, pp. 685–694.
[10] Alexander Kolesnikov and Christoph H. Lampert. “Seed, Expand and Constrain: Three Principles for Weakly-Supervised Image Segmentation”. In: CoRR abs/1603.06098 (2016). arXiv: 1603.06098.
[11] Tsung-Yi Lin, Michael Maire, Serge J. Belongie, et al. “Microsoft COCO: Common Objects in Context”. In: CoRR abs/1405.0312 (2014). arXiv: 1405.0312.
[12] Ramprasaath R. Selvaraju, Abhishek Das, Ramakrishna Vedantam, et al. “Grad-CAM: Why did you say that? Visual Explanations from Deep Networks via Gradient-based Localization”. In: CoRR abs/1610.02391 (2016). arXiv: 1610.02391.
[13] K. Simonyan, A. Vedaldi, and A. Zisserman. “Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps”. In: Proc. ICLR (workshop track). 2014.
[14] Bolei Zhou, Aditya Khosla, Agata Lapedriza, et al. “Learning deep features for discriminative localization”. In: Proc. CVPR. 2016, pp. 2921–2929.
[15] Longlong Jing and Yingli Tian. “Self-supervised Visual Feature Learning with Deep Neural Networks: A Survey”. In: arXiv e-prints, arXiv:1902.06162 (Feb. 2019). arXiv: 1902.06162 [cs.CV].
[16] D. Pathak, P. Krähenbühl, J. Donahue, et al. “Context Encoders: Feature Learning by Inpainting”. In: 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2016, pp. 2536–2544.
[17] C. Doersch, A. Gupta, and A. A. Efros. “Unsupervised Visual Representation Learning by Context Prediction”. In: 2015 IEEE International Conference on Computer Vision (ICCV). Dec. 2015, pp. 1422–1430.
[18] Mehdi Noroozi and Paolo Favaro. “Unsupervised Learning of Visual Representations by Solving Jigsaw Puzzles”. In: Computer Vision — ECCV 2016. Cham: Springer International Publishing, 2016, pp. 69–84.
[19] Spyros Gidaris, Praveer Singh, and Nikos Komodakis. “Unsupervised Representation Learning by Predicting Image Rotations”. In: International Conference on Learning Representations. 2018.
[20] Mathilde Caron, Piotr Bojanowski, Armand Joulin, et al. “Deep Clustering for Unsupervised Learning of Visual Features”. In: Computer Vision — ECCV 2018. Cham: Springer International Publishing, 2018, pp. 139–156. A.
[21] A. Dosovitskiy, P. Fischer, J. T. Springenberg, et al. “Discriminative Unsupervised Feature Learning with Exemplar Convolutional Neural Networks”. In: IEEE Transactions on Pattern Analysis and Machine Intelligence 38.9 (Sept. 2016), pp. 1734–1747.
[22] V. Christlein, M. Gropp, S. Fiel, et al. “Unsupervised Feature Learning for Writer Identification and Writer Retrieval”. In: 2017 14th IAPR International Conference on Document Analysis and Recognition Vol. 01. Nov. 2017, pp. 991–997.
[23] Z. Ren and Y. J. Lee. “Cross-Domain Self-Supervised Multi-task Feature Learning Using Synthetic Imagery”. In: 2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition. June 2018, pp. 762–771.
[24] Asano YM., Rupprecht C., and Vedaldi A. “Self-labelling via simultaneous clustering and representation learning”. In: International Conference on Learning Representations. 2020.
[25] Ben Poole, Sherjil Ozair, Aaron Van Den Oord, et al. “On Variational Bounds of Mutual Information”. In: Proceedings of the 36th International Conference on Machine Learning. Vol. 97. Proceedings of Machine Learning Research. Long Beach, California, USA: PMLR, Sept. 2019, pp. 5171–5180.
[26] R Devon Hjelm, Alex Fedorov, Samuel Lavoie-Marchildon, et al. “Learning deep representations by mutual information estimation and maximization”. In: International Conference on Learning Representations. 2019.
[27] Aaron van den Oord, Yazhe Li, and Oriol Vinyals. “Representation Learning with Contrastive Predictive Coding”. In: arXiv e-prints, arXiv:1807.03748 (July 2018). arXiv: 1807.03748 [cs.LG].
[28] Philip Bachman, R Devon Hjelm, and William Buchwalter. “Learning Representations by Maximizing Mutual Information Across Views”. In: Advances in Neural Information Processing Systems 32. Curran Associates, Inc., 2019, pp. 15535–15545.
[29] Yonglong Tian, Dilip Krishnan, and Phillip Isola. “Contrastive Multiview Coding”. In: arXiv e-prints, arXiv:1906.05849 (June 2019), arXiv:1906.05849. arXiv: 1906.05849 [cs.CV].
[30] Kaiming He, Haoqi Fan, Yuxin Wu, et al. “Momentum Contrast for Unsupervised Visual Representation Learning”. In: arXiv e-prints, arXiv:1911.05722 (Nov. 2019). arXiv: 1911.05722 [cs.CV].
[31] Ting Chen, Simon Kornblith, Mohammad Norouzi, et al. “A Simple Framework for Contrastive Learning of Visual Representations”. In: arXiv e-prints, arXiv:2002.05709 (Feb. 2020), arXiv:2002.05709. arXiv: 2002.05709 [cs.LG].
[32] Ishan Misra and Laurens van der Maaten. “Self-Supervised Learning of Pretext-Invariant Representations”. In: arXiv e-prints, arXiv:1912.01991 (Dec. 2019). arXiv: 1912.01991 [cs.CV].
33] Prannay Khosla, Piotr Teterwak, Chen Wang, et al. “Supervised Contrastive Learning”. In: arXiv e-prints, arXiv:2004.11362 (Apr. 2020). arXiv: 2004.11362 [cs.LG].
[34] Jean-Bastien Grill, Florian Strub, Florent Altché, et al. “Bootstrap Your Own Latent: A New Approach to Self-Supervised Learning”. In: arXiv e-prints, arXiv:2006.07733 (June 2020), arXiv:2006.07733. arXiv: 2006.07733 [cs.LG].
[35] Tongzhou Wang and Phillip Isola. “Understanding Contrastive Representation Learning through Alignment and Uniformity on the Hypersphere”. In: arXiv e-prints, arXiv:2005.10242 (May 2020), arXiv:2005.10242. arXiv: 2005.10242 [cs.LG].
[36] Junnan Li, Pan Zhou, Caiming Xiong, et al. “Prototypical Contrastive Learning of Unsupervised Representations”. In: arXiv e-prints, arXiv:2005.04966 (May 2020), arXiv:2005.04966. arXiv: 2005.04966 [cs.CV].
摧毁数学的武器:数据科学家的收获
凯茜·奥尼尔为广大读者写的书也呼吁数据科学家采取行动
威廉·康托伊斯·让拍摄的关于 Pix 生活的照片
尽管 Cathy O’Neil 几年前写了《数学毁灭的武器》(2016 年出版),但它向数据科学家传达了一个信息,即 100%适用于今天,并将可能被证明是永恒的。在这里你可以找到我的要点:
数据科学家不仅需要考虑他们的模型对底线的影响,还需要考虑对人的影响。
我们必须检查假阳性和假阴性,看看谁被我们的模型描述错了。我们需要思考我们的模型是如何被使用的——能够准确预测每分钟在任何给定位置将出现的客户数量是非常酷的,但是经理或公司领导人会如何处理这些信息呢?我们是不是让艰难的工作变得更加艰难了?我们需要让我们的公司遵守与我们的价值观一致的标准(参见下文:政策)。
数据科学家需要有效地沟通他们的算法做什么和不做什么。
不完全理解数据建模的人很容易兴奋,认为模型是“科学的”和“无偏见的”,它反映了基本事实。事实上,我们正在根据历史数据对人们进行分类,这些数据可能充满了制度化的种族主义、性别歧视、能力歧视、阶级歧视等,并使用这种分类来预测他们的未来,决定他们在监狱里呆多久,并设定信贷、保险等的价格。我们需要明确我们模型的假设和输入。
数据科学家需要为符合其价值观的政策变革做出贡献。
仅仅因为你选择不做歧视性的数据科学来帮助有钱有势的人在不太有钱没势的人身上变得越来越有钱有势,并不意味着其他人不会。了解数据科学技术方面的人需要为围绕不同行业的公司被允许使用数据的方式以及他们被允许将哪些数据用于各种目的的政策对话做出贡献。许多公司都在努力在法律允许的范围内最大限度地实现利润最大化(或者是灰色地带,或者不是,取决于你的视角,对美国公司的信念等)。在推动执法的同时,我们需要加强和更新法律,以影响算法和模型的使用。法律通常落后于技术进步,但近年来技术进步的速度迅速提高,而国会的行动却越来越慢。这种不断扩大的差距正在扩大我们的能力、道德和法律之间的可疑灰色区域。
一些惊人的报价:
- 种族主义是最不修边幅的预测模型。它由随意的数据收集和虚假的相关性驱动,由制度不平等强化,并被确认偏差污染。
- 尽管模型以公正著称,但它们反映了目标和意识形态……从我们选择收集的数据到我们提出的问题,我们自己的价值观和欲望影响着我们的选择。模型是嵌入在数学中的观点。
- 模型的盲点反映了其创建者的判断和优先级。
- 承诺效率和公平的[数学毁灭武器,即重要的、秘密的和破坏性的算法]扭曲了高等教育,推高了债务,刺激了大规模监禁,几乎在每个关头都打击了穷人,并破坏了民主。
- 大数据流程整理了过去。他们没有发明未来。做到这一点需要道德想象力,而这是只有人类才能提供的。我们必须明确地将更好的价值嵌入到我们的算法中,创建符合我们道德标准的大数据模型。有时,这意味着将公平置于利润(最大化)之前。
渴望更多?
- 《卫报》一次非常坦率和快速的采访
- 听或读 NPR与凯茜·奥尼尔关于所有考虑事项的对话(7 分钟)
- 在数据营的播客 DataFramed 上听凯茜·奥尼尔在的对话(1 小时)
- 在你当地的图书馆或喜欢的书店寻找凯茜·奥尼尔的《数学毁灭武器》。
天气数据收集:使用 Python 进行网络搜集
在这篇博客中,我将讨论如何从网站上收集数据。希望你已经使用 API 参观了我的数据收集技术。在现实世界中,我们可能会遇到不同的数据源,如数据库、日志文件、结构化文件、服务或 API 等。这些来源可能包含记录、图表或文本形式的数据。因此,数据随处可见,为了执行不同的创新数据科学技术,我们需要解析这些数据。我们知道维基百科是文本形式数据的最大来源之一。
如何解析这些类型的文本数据?
这里网页抓取进入图片!这是一种使用 HTML 标签提取数据的技术。这里我将讨论从 EstesPark 天气网站获取天气数据的技术。这个网站主要是为科罗拉多州埃斯蒂斯帕克附近的居民提供公共服务。下面是网站截图。你可以点击链接进入网站。
来源:https://www.estesparkweather.net/archive_reports.php?日期=202005 年
一些关于网站的有用信息
- 该网站包含日期方面的天气数据,如平均温度、平均湿度、平均露点等。这些数据存储在 HTML web 表中。
- 有一个下拉框,你可以自由选择月份和年份来查看天气数据。
- 每次您更改下拉选择时,日期值将根据所选的月份和年份进行更改,但采用 yyyymm 格式。参考上图,我选择2020 年 5 月,链接中的,日期值改为 202005。
https://www.estesparkweather.net/archive_reports.php?日期=202005 年
首先导入案例研究所需的所有库
import bs4
from bs4 import BeautifulSoup
import requests
import pandas as pd
from datetime import datetime
让我们来理解这段代码。
url=‘https://www.estesparkweather.net/archive_reports.phpdate=202005'
page = requests.get(url)
print(page)
soup = BeautifulSoup(page.content,'html.parser')
print(soup)
requests 库允许您轻松地发送 HTTP 请求,并且不需要手动向您的 url 添加查询字符串,或者对您的帖子数据进行格式编码。requests 模块中的 urllib3 模块使 url 处于保持活动状态,您可以连续地将数据放入池中。
一个有效的 url 会给你一个状态码 200。这意味着网址工作正常。
BeautifulSoup 库帮助您解析网页上的 HTML 内容和 XML 文件中的 XML 内容。BeautifulSoup 的文档字符串如下。
您将在 BeautifulSoup 对象上调用的大多数方法都继承自
PageElement 或 Tag。在内部,这个类定义了在将 HTML/XML 文档转换成数据
结构时由
树构建器调用的基本接口。该接口抽象出了
解析器之间的差异。要编写一个新的树构建器,你需要从整体上理解
这些方法。这些方法将被 BeautifulSoup 构造函数调用:
- reset()
- feed(markup)
树构建器可以从其 feed()实现中调用这些方法:
- handle_starttag(name,attrs) #参见关于返回值的注释
- handle _ end tag(name)
- handle _ data(data)#追加到当前数据节点
- endData(containerClass) #结束当前数据节点
节目结束时,您应该能够使用“开始标记”事件、“结束标记”事件、“数据”事件和“完成数据”事件构建一个树。
在 BeautifulSoup 构造函数中,我输入了 url 的 HTML 内容,并给出了命令“html.parser”。这将给我网页的 HTML 内容。对于 XML,可以使用’ lxml '。
版权所有 Somesh
那汤是什么?
这是一个漂亮的组对象,它有专门用于处理 HTML 内容的方法。
版权所有 Somesh
正如我前面提到的,网站上的天气数据是 HTML 网页表格的形式。因此,我们在 HTML 内容中查找表格,并分析行和列。
table = soup.find_all(‘table’)raw_data = [row.text.splitlines() for row in table]
raw_data = raw_data[:-9]for i in range(len(raw_data)):
raw_data[i] = raw_data[i][2:len(raw_data[i]):3]
print(raw_data)
在下拉列表中,当我们选择 2020 年 5 月时,它将为您提供单独的表,其中包含每天的所有天气属性值。因此,我们将拆分表中的行并追加到一个列表中。最后,你会得到一个列表列表。值得注意的是,每个子列表都包含特定月份的天气属性及其值。
如何获取其他月份的天气数据?
如前所述,该链接包含页面值等于下拉值,但格式为 yyyymm。因此,您创建了一个日期范围,将日期分解成所需的格式,并与字符串 URL 连接起来。
Dates_r = pd.date_range(start = ‘1/1/2009’,end = ‘08/05/2020’,freq = ‘M’)
dates = [str(i)[:4] + str(i)[5:7] for i in Dates_r]
dates[0:5]for k in range(len(dates)):
url = "[http://www.estesparkweather.net/archive_reports.php?date=](http://www.estesparkweather.net/archive_reports.php?date=)"
url += dates[k]
现在,您可以执行字符串剥离技术来创建数据集。下面是一个例子。
for u in url:
for i in range(len(raw_data)):
c = [‘.’.join(re.findall(“\d+”,str(raw_data[i][j].split()[:5])))for j in range(len(raw_data[i]))]
df_list.append(c)
index.append(dates[k] + c[0])
f_index = [index[i] for i in range(len(index)) if len(index[i]) > 6]
data = [df_list[i][1:] for i in range(len(df_list)) if len(df_list[i][1:]) == 19]
要将日期作为数据集的索引,可以使用下面的代码。
final_index = [datetime.strptime(str(f_index[i]), ‘%Y%m%d’).strftime(‘%Y-%m-%d’) for i in range(len(f_index))]
您可以为列名制作一个天气属性列表,如湿度、温度、降雨量,或者为数据选择自定义列名。
恭喜你!!!你离创建一个数据框架还差得很远。
在 DataFrame()中,您将赋予 数据 值作为您为所有天气属性值所做的数据, 列 等于包含自定义列名的列表变量,最后 索引 值将成为日期的列表变量。
样本输出版权所有 Somesh
这不是结束,而是开始。你可以用这个概念来抓取电子报、歌曲网站等的数据。
在下一篇博客中,我将提出不同的数据收集技术。我希望你已经喜欢了自然语言处理第一部分 & 第二部分。
我很乐意听到对上述分析的任何评论——欢迎在下面留言,或者通过 LinkedIn 和 twitter @RoutraySomesh 联系我!!!
天气预报:深度学习方法
利用印尼 10 年的数据集和 LSTM 模式预测天气
天气不仅与我们息息相关,而且对我们的生存至关重要。不利的天气可能会摧毁我们吃的食物、我们依赖的商业和我们依赖的福祉。因此,必须准确及时地预报天气,以便我们能够采取必要的预防措施,最大限度地减少与天气相关的风险。
在本文中,我们将了解如何利用印度尼西亚遍布群岛的 70 多个气象站的 10 年每日降水记录来提前预测天气,特别是降雨量。我们将建立一个基于长短期网络(LSTM)的模型。
LSTM:概述
LSTM 通常适用于时间序列数据(如我们的降水数据集),因为它能够“记住”来自称为单元状态的特征的长期相关性/信息。这种细胞状态在整个网络中运行,并向下(或向上)传递信息,例如,来自一个序列的早期信息可以影响后来输入的预测。这种信息传递对于时间序列天气数据至关重要,因为每个输入都依赖于不同时间点的其他输入。
存储、删除、修改和传递的信息由门控制。下面的图 1 展示了 LSTM 模型的一般架构。本文假设读者熟悉 LSTM,但不会涉及网络架构的具体细节。如果你想了解更多,你可以访问这本简明扼要的 LSTM 简介。
图 1: LSTM 单个细胞的架构
天气预报:数据准备
既然我们已经解释了基本网络,让我们开始导入数据集。你可以在这里找到我们的雨量 CSV 数据的清理版本。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout, BidirectionalDATA_DIR = './dataset/rainfall.csv'
dataset = pd.read_csv(DATA_DIR)
rainfall_df = dataset[['rainfall']]rainfall_df
CSV 的摘要可以在下面的图 2 中看到。
图 2:降雨量数据框汇总
然后,我们将按照 90:10 的比例分割训练集和测试集。
train_split= 0.9
split_idx = int(len(rainfall_df) * 0.9)training_set = rainfall_df[:split_idx].values
test_set = rainfall_df[split_idx:].values
我们的想法是利用过去 30 天的数据,预测未来 5 天的**。为此,我们需要创建一个训练数据集,其中 x 值是 30 天的窗口化数据,相应的 y 值是未来 5 天的后续降雨量数据。**
# 5-day prediction using 30 days datax_train = []
y_train = []
n_future = 5 #Next 5 days rainfall forecast
n_past = 30 #Past 30 daysfor i in range(0, len(training_set) - n_past - n_future + 1):
x_train.append(training_set[i : i + n_past, 0])
y_train.append(training_set[i + n_past : i + n_past + n_future, 0])
在为训练集生成 x 和 y 之后,我们将确保数据类型是正确的,并且形状符合模型的要求。
x_train , y_train = np.array(x_train), np.array(y_train)
x_train = np.reshape(x_train, (x_train.shape[0] , x_train.shape[1], 1))
天气预报:模型定义
现在我们已经有了我们的训练集,我们将利用 LSTM 架构来定义我们的预测器。我们有以下内容:
- 双向:确保序列前一部分的信息对后一部分可用,反之亦然。
- LSTM (x3)层:30 个单元代表 30 天窗口化的历史数据集,而 return_sequences 参数指定每个单元的输出将作为下一层的输入。
- Dropout (p=0.2) :用于正则化效果,防止网络过拟合训练集。
- 密集层:有 5 个预测神经元,每个神经元代表未来的一天。
EPOCHS = 500
BATCH_SIZE = 32regressor = Sequential()regressor.add(Bidirectional(LSTM(units=30, return_sequences=True, input_shape = (x_train.shape[1], 1))))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units= 30, return_sequences=True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units= 30, return_sequences=True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units= 30))
regressor.add(Dropout(0.2))
regressor.add(Dense(units = n_future, activation=’relu’))regressor.compile
(
optimizer=’adam’,
loss=’mean_squared_error’,
metrics=[‘acc’]
)regressor.fit
(
x_train,
y_train,
epochs=EPOCHS,
batch_size=BATCH_SIZE
)
天气预报:推论
既然模型已经被训练了 500 个时期,我们就可以在准备好的测试集上进行推论了。
x_test = test_set[: n_past, 0]
y_test = test_set[n_past : n_past + n_future, 0]x_test, y_test = np.array(x_test), np.array(y_test)
x_test = np.reshape(x_test, (1, x_test.shape[0], 1))predicted_temperature = regressor.predict(x_test)print('Predicted temperature {}'.format(predicted_temperature))
print('Real temperature {}'.format(y_test))
如果我们对样本数据集中的 30 天进行采样,预测结果及其对应的实际温度将打印如下:
Predicted temperature
[[47.51087 11.603558 2.5133722 0\. 2.019637 ]]Real temperature
[9.8 6.6 0.2 0\. 0\. ]
讨论和结论
我们的初始预测器似乎对极端降水水平(如 47 毫米)表现不佳。可以通过以下方式进行一些改进:
- 调整历史窗口期以说明季节性(如 120 天而不是 30 天)。
- 通过增加更多的 LSTM 层、改变损失函数和增加丢失概率来改进架构,以更好地正则化训练数据。
总之,在天气预报(一般来说,时间序列数据集)的情况下,使用 LSTM 作为改进的基于 RNN 的架构是有趣的。并且能够以及时有效的方式进行天气预报不仅是有益的,而且对于直接或间接依赖好天气的大众来说是至关重要的。
注意:本文提供的数据已经被清理并合并成一个 CSV 文件。如果你想获得 70+印度尼西亚的天气信息,你可以随时 PM 我!
做订阅我的邮件简讯:https://tinyurl.com/2npw2fnz在这里我定期用通俗易懂的语言和漂亮的可视化方式总结 AI 研究论文。
参考
[1] 了解 https://colah.github.io/posts/2015-08-Understanding-LSTMs/ LSTM 网
[2]【https://www.bmkg.go.id/ 印尼气象局:印尼
使用 FOSS4G 和 JavaScript 处理天气模型:最佳实践
作者图片
使用免费开源地理软件(FOSS4G)和/或 JavaScript 检索、处理和管理天气模型数据的技巧和诀窍。
一年前我写了《用 FOSS4G 自动化天气模型处理 :经验教训 ,概述了我创建一个使用开源地理软件自动检索、处理和管理天气模型数据的系统的旅程。我已经用这个系统工作了一年,包括为科罗拉多州发布了一个最先进的天气预报网站,并有机会向商业和学术天气预报领域的关键人物学习。
作为分发和使用原始天气模型数据的常见范例的介绍,原始文章中的发现仍然很有用。后续文章在此基础上进行扩展,涵盖了处理这些数据的最佳实践和技术,仅使用免费和开源地理软件(FOSS4G)。还有一些使用 JavaScript 处理这些数据的技巧和诀窍,JavaScript 正在成为一种更普遍的语言,包括在地理信息系统(GIS)领域。
本文假设您已经安装了 GDAL ,并且已经知道从哪里下载天气模型文件以及它们通常是如何构造的。“索引文件”会经常被引用,也就是您经常看到的伴随着grib2
文件的.idx
文件:
这些文件对于管理大型栅格和可变波段排序非常有用,您应该尽可能地利用它们。
作者图片
1.使用梯度
不直接推荐这一点的原因是它偏离了本文的主题-已经有大量的人在使用 GIS 和地理空间栅格做令人难以置信的事情,目标是帮助在该领域更容易地访问天气模型数据并利用现有的人才。
然而,如果你的重点是纯粹的气象学或更科学的学科,你可能只想使用处理天气模型和其他科学数据的行业标准——GRaDS。该软件有自己的脚本语言,它需要大量的工作来制作看起来像普通桌面 GIS 应用程序中可以轻松生成的质量的地图,因此它代表了一种可能超出 GIS 学科范围的用例。
2.除非需要在 web 地图上绘制数据,否则不要重新投影数据
天气模型有各种各样的投影(通常是某种形式的朗伯共形圆锥曲线),如果不丢失数据或强制插值,就不容易重新投影到 EPSG:4326 或 Web 墨卡托。如果查询重新投影的数据,与原始模型数据相比,您可能会得到不准确的预测。
顶部栅格(NAM 3km 模型)处于其原始投影中。底部栅格是重新投影到 EPSG 的结果:4326。忽略倾斜(底部的图像仍然用顶部图像的投影绘制在地图上),注意原始数据是如何未被充分表示的,例如画圈的像素簇。图片作者。
3.基于 JavaScript 的投影库(如 Proj4js)不能正确地重新投影大多数天气模型的坐标
如果您正在使用 Node.js 查询地理空间栅格(使用类似于 Geotiff.js 的东西),并且您希望在查询纬度/经度坐标时将它们保留在原始投影中,那么 GDAL 提供的 Proj4 和 WKT 字符串可以传递给 proj4js —但是您会注意到重新投影后出现了一些非常严重的空间误差(许多英里,而不是几英尺)。有些转换是 proj4js 做不到的,似乎大多数天气模型预测都属于这一类。
您将需要使用 gdal 绑定( gdal-js —不理想,因为它们需要旧版本的 GDAL)或者调用一个 shell 来调用 GDAL 的gdaltransform
以获得更精确的重新投影——或者 JavaScript 之外的另一个重新投影库。为了简单起见,您可以将 grib2 文件加载到 QGIS 中,并使用“提取投影”工具导出一个可以传递给gdaltransform
的.prj
文件。
4.使用 PostGIS out-db 栅格来管理大量文件
如果您以任何程度的规律性处理天气模型数据,您将拥有大量的地理空间栅格,其中包含许多波段。 PostGIS for PostgreSQL 是一个很好的工具来组织这些数据,但是在读取/写入数据本身时太慢了——但是,您可以将栅格作为文件系统上的 GeoTIFF(或任何东西)保存,并从 PostGIS 中将其作为 out-db 栅格进行引用。
5.对于制作处理地理空间天气模型数据的 API 来说,Node.js 是一个不错的选择
使用其他语言作为后端或 API 有很多好处(比如 python,及其 GDAL 绑定),但是 Node.js 越来越流行,它是处理这些数据的可行选择。如果您使用 Postgres 和 GeoTIFF 文件,这是一个可以接受的解决方案,但是如果您预计有巨大的并发需求,您可能会希望采用不同的方法,使用原始二进制文件或极端的缓存技术。对于基于 JS 的方法,您可以使用 Geotiff.js 加载天气模型 GeoTIFF 文件,并以不错的性能查询它们。我写了一篇文章,详细介绍了这里的细节。
6.识别未知波段
NOAA 的 NCEP(通常负责开发和传播天气模型的美国机构)与 GRIB2 格式的使用并不完全一致,这导致了各种 GRIB 解码器,包括 NOAA 自己创建的一些解码器!在撰写本文时,NBMv4 模型显示了未知的谱带,甚至在 NCEP 自己的索引查找文件中也是如此:
然而,GDAL 似乎比其他一些库更难识别波段,因此您的栅格中可能有许多“未知”波段。如果元数据似乎无法描述天气模型参数和/或级别,则尝试找出波段所属的工作流程如下:
- 试着在附随里找。grib2 文件的 idx 文件。
- 使用美国宇航局的全景数据查看器,它似乎比其他 GRIB 解码器如 degrib 更成功。
- 使用 wgrib2 ,这是标准的(也是 GRaDS 中使用的一个选项),但可能很难使用。
Grib2 文件在历史上被辛勤工作的 GDAL 贡献者忽略了一点,但它们在修复我最近在更新的天气模型(如 NBMv4)中发现的一些错误方面非常棒。这些模型应该在 GDAL >3.1 中完全工作,但是旧版本,比如一些 Linux 发行版中的当前上游版本(3.0.4),在处理一些参数(比如积雪)时会出现阻塞。如果您注意到其他问题,请联系 gdal listserv!
7.订阅游牧者列表服务
天气模型的主要分发服务器——NCEP 游牧部落——往往会以相当惊人的频率经历中断,但通常会被排除或很快在列表服务器上发布中断通知。其他重要的通知包括对模型的更改以及对它们的添加或删除,这可能会破坏您的脚本。
8.优化服务器的读/写速度和 RAM,而不是 CPU 速度
一般来说,如果您只是执行天气模型数据的基本转换和简单的分析或查询,那么您将受到在磁盘上读/写数据和将大型栅格文件加载到 RAM 中的能力的限制,而您的 CPU 大部分时间都处于空闲状态。你肯定应该使用固态硬盘。如果你正在做大量的光栅文件重投影,CPU 将会更重要。如果你要存储全球天气模型或者一些更高级的模型(比如 NAM 或者 HRRR ),你需要几兆字节的硬盘空间。
9.“表面”高度完全取决于模型的分辨率
在不同空间分辨率的模型之间比较表面上的两个值(例如温度)是不公平的比较,尤其是在崎岖的地形中。每个模型都有一个基本的 DEM,通常可以从“分析”预测小时(也就是零)中提取。例如,根据相应的索引文件,此数据在fh00
/ analysis 的 NAM 模型中可用:
10.索引文件可能会将两个变量视为同一字节范围的一部分
你可能会在风的ugrd
和vgrd
分量中遇到这种情况。
您只能同时获得这两个变量,这意味着如果您的检索/处理脚本完全依赖于索引文件中每一行的一个变量,事情将会出错。当您检索这个字节范围时,您将得到一个双波段栅格,第一个波段属于ugrd
,第二个属于vgrd
。
11.有些模型的投影经度范围为 0 到 360 度
这似乎是全球通用的模式,如 GFS 和 GEFS。当你开始使用这个投影时,奇怪的事情会发生。在处理这些数据之前,您可能想用--config CENTER_LONG 0
(或者 Python 绑定中的config=["CENTER_LONG 0"]
)调用gdalwarp
。
天气预测:“经典”机器学习模型 Vs Keras
在深度学习中应用管道和网格搜索等有用的 Scikit-learn 功能的实际例子。
照片:蔡展汉
在花了 2019 年的大部分时间学习机器学习的基础知识后,我热衷于开始尝试一些基本的深度学习。
虽然不缺乏像 Keras 这样的用户友好型库入门的伟大教程,但要找到通过展示管道和网格搜索等 Scikit-learn 功能如何在深度学习中发挥作用来为初学者连接这些点的例子要难得多。
因此,我决定将我在这个主题上找到的材料收集在一起,并匆匆制作了一系列笔记本,希望能够帮助那些希望投身深度学习的新来者。
在这些笔记本中,我使用了机器学习和深度学习技术的混合,试图预测 2019 年 12 月新加坡的降雨模式。这些模型是根据新加坡从 1983 年 1 月 1 日到 2019 年 1 1 月底 37 年的天气数据进行训练的。
笔记本、数据和假设
这是我正在进行的一系列数据科学项目的 Github repo ,使用的是新加坡的历史天气数据。这个帖子的具体笔记本可以在这里,这里这里,这里这里,这里这里找到。
为了简洁起见,我不会在这篇文章上粘贴任何代码。这些笔记本简单易懂,在 Github 上或通过直接下载更容易阅读。
这篇文章的数据来自新加坡气象局的网站。为了保持项目的简单,它被保持为一个二元分类问题,以预测某一天是多雨(1)还是干燥(0)。我还选择不丢弃离群值,以便将模型暴露给尽可能多的数据。
我使用的数据集跨越了 37 年,但它包含了不到 13,500 行数据。有理由问你是否需要像这样的数据集进行深度学习,它是否一定会产生更好的结果。
这些都是合理的担忧,尤其是考虑到所需的额外时间和资源。但是我决定把它们放在一边,因为这里的目标是实验和学习。
结果
我讨厌仅仅为了看到结果而滚动冗长的博客帖子,所以让我们快速看一下 XGB 模型在预测 2019 年 12 月新加坡的降雨/无雨模式时如何对抗 Keras 分类器:
Keras 模型比 XGB 模型表现稍好,在 31 天中正确地将 26 天划分为下雨/不下雨。XGB 模型管理了 31 个中的 25 个。
Keras 和 XGB 模型在回忆分数方面都有相同的弱点(与 precision 和 f1 分数相比相对较低),即正确分类雨天的能力。
尽管如此,总的来说还不算太差。有了更丰富的气象数据,如湿度和大气压力,我们可能会得到更准确的预测。
现在,让我们分别深入研究每种方法。
使用逻辑回归和 XGB 分类器的“经典”机器学习方法
预测建模包括尝试许多不同的模型,看看哪一个效果最好,以及微调每个模型的超参数,以获得最佳组合。
Scikit-learn 的管道和网格搜索功能允许您有效地组织这两项任务并一次运行它们。在笔记本 5.1 中,我选择用逻辑回归模型对抗 XGB 分类器。
您可以在同一管道中包含更多的模型,或者增加 XGB 超参数的数量来调优。但是时间和资源的权衡是你必须仔细权衡的。我选择了 LogReg 和 XGB 模型来说明在这些任务中可能遇到的权衡取舍的极端情况。
LogReg 模型只需要几秒钟就可以完成一次像样的网格搜索,而 XGB 分类器需要 7 个小时(在 6 核 2018 Mac Mini 上)才能完成超过 5 个超参数的网格搜索。
XGB 模型给出了稍微好一点的分数,并且可能通过更彻底的网格搜索得到改进。但是这 0.02 分的提升值得付出额外的努力吗?在这种情况下很有争议。
在任何情况下,我都继续使用 XGB 模型,尽管它的性能只比 LogReg 模型稍好一点。让我们来看看 XGB 对 2019 年 12 月预测的困惑矩阵:
XGB 模型正确地将 31 天中的 25 天划分为多雨/干旱天,准确率为 0.8。
模型错误地预测两天后会下雨,而实际上是晴天(误报)。它还错误地预测了 4 个晴天,而实际上这几天有雨(假阴性)。
就回忆分数而言,XGB 模型是最弱的,在这种情况下,这意味着它正确识别雨天的能力(14 分中的 10 分)。深度学习模型能做得更好吗?
带网格搜索的 Keras 分类器
人们可以通过多种方式开始尝试深度学习模型。我想从小处着手,看看我是否能把我在 Scikit-learn 中学到的东西与新技术结合起来。
鉴于 Scikit-learn API (用于分类和回归)的两个包装器,Keras 很快成为一个不错的选择。我还依靠两个优秀的在线帖子(这里和这里)来指导我的笔记本 5.2 的代码。
工作流本质上类似于常规的 Scikit-learn 方法,尽管有一个新步骤需要一点反复试验:定义创建和返回 Keras 顺序模型的函数。
根据您想要优化的超参数的数量,函数的结构必须相应地进行调整。在这篇文章中,我选择调整隐藏层的数量、神经元的数量、优化器、退出率、批量大小和时期的数量。
pipeline/gridsearch 结构本质上是相同的,只是需要将您定义的 Keras 函数传递给 Keras 分类器的“build_fn”参数。
在我的机器上用这些设置进行网格搜索花了 18 个多小时(仅限 CPU)。如果你想要更快的审判,相应地调整。让我们看看优化的 Keras 分类器预测的混淆矩阵:
Keras 模型比 XGB 模型表现得更好,它正确地预测了多一天的多雨天气,即它正确地将 31 天中的 26 天划分为多雨/少雨天,而 XGB 模型为 25 天。
模型错误地预测两天后会下雨,而实际上是晴天(误报)。它还错误地预测了 3 个晴天,而实际上这几天有雨(假阴性)。
与 XGB 模型一样,Keras 模型在回忆分数方面也是最弱的,在这种情况下,这意味着它正确识别雨天的能力(14 分中的 11 分)。让我们在验证集(2019 年 12 月的天气数据)上比较 XGB 和 Keras 模型的预测指标:
Keras 模型明显优于 XGB 版本,但网格搜索花费的时间是 XGB 的两倍多。在现实世界中,性能的提高意味着那个月的 31 天天气预报正确率增加了一天。
我最近发现了关于 Keras Tuner 的情况,并渴望看到它是否能提供比 Scikit-learn/grid 搜索方法更好的结果。
Keras 调谐器
至少有 4 个调谐器可供选择,但我选择尝试只 Hyperband 和 RandomSearch 调谐器。我还选择使用 HyperModel 子类方法,这使得两个调谐器的测试更加有效。
我改编了两个有用的在线帖子和的代码。我选择了以下参数进行调整:隐藏层数、辍学率、学习率和动量。两个调谐器的性能水平相当:
带 Hyperband 的 Keras 调谐器(左)和带 RandomSearch 的 Keras 调谐器(右)
与通过 Scikit-learn 的网格搜索过程相比,Keras Tuner 非常快。不幸的是,尽管进行了几轮试错,我还是无法让精度水平超过 0.7。
可能还有很多我不知道的使用 Keras 调谐器的艺术,但我将不得不把它留给将来的更合适的数据集。
结束注释
正如许多在线文章所表明的那样,你正在处理的数据的性质和数量在很大程度上决定了你是采用“经典”的机器学习模型还是使用深度学习方法。
但是,很难获得一个大规模的真实世界数据集,它很容易进行深度学习。大规模数据集所需的时间和计算资源对初学者来说可能也不实际。
简而言之,不要让完美妨碍了美好。在这一点上,学习过程比结果更重要。在从事这个项目的过程中,我获得了一些好的经验,希望这些笔记本能够帮助任何想要尝试深度学习的人。
和往常一样,如果您发现代码中有任何错误,请 ping 我@
推特: @chinhon
领英:【www.linkedin.com/in/chuachinhon
如果你对研究新加坡的天气数据集感兴趣,这里是我使用相同记录的早期项目:
编织与人工智能
过去的技术能告诉我们未来的技术
在人类历史的大部分时间里,女人总是与编织联系在一起。编织是制作服装不可或缺的一部分,而制作服装是妇女操持家务的核心角色。甚至像雅典娜这样的女神也与编织有着密切的联系(正如我们在雅典娜和阿拉克尼的故事中看到的)。在这篇维基百科文章中,你可以看到在许多文化中,编织和女性是如何在他们的神话和民间传说中紧密交织在一起的。然而,这种联系并没有延续到今天,这要归功于纺织的自动化,特别是提花织机,它引入了用机器代替人织布的理念。
在赛迪·普兰特的《未来织布机:编织妇女和控制论》一书中,她讨论了玛格丽特·米德对尼日尼亚 Tiv 人的研究。她特别指出,编织的机械化导致了家庭的巨大混乱,而妇女的主要任务之一实际上就是编织。这使她得出这样的结论:
米德的研究表明编织是 Tiv 女性身份的一部分;在其他文化中,洗衣、捶打和挑水可能会起到这种作用,在这些文化中,洗衣、捶打和挑水就像织布一样,永远不仅仅是实用的任务。(第。56)
换句话说,编织不仅仅是生产布料。编织是 Tiv 女性身份的一部分,是她定义自己的方式之一。工厂继续讨论机械化编织的含义如下:
将机械引入到这些工作中所造成的家庭关系的破裂打破了女性身份的风景:机械化节省了时间和劳动力,但这些都不是问题所在(pg。56)
对于一个 Tiv 女性来说,编织不仅仅是结果。编织不仅与最终产品有关,也与制作它的人有关。所有这些都使电厂面临一个新技术引入带来的核心问题:
如果女人不是织工和挑水工,她们会是谁呢?
这在现在看来可能是一个荒谬的问题,但在当时,这是一个非常合理的问题。编织是女性身份不可或缺的一部分,现在这项工作被机器取代了,它们现在是谁呢?
这个问题听起来很荒谬,因为我们知道女人不仅仅是挑水工和织布工。虽然他们可以选择专注于家务和呆在家里,但他们不会局限于此。至少,他们不再像以前那样局限于此。总的来说,我们当然承认女性不仅仅是由她们的家务技能来定义的。
这跟 AI 有什么关系?
任何关于人工智能的报道都是两极分化的。要么是拯救世界的东西,要么是终结世界的东西。这是我在以前的文章中讨论过的事情,也是在关于构建大数据的新闻语料库研究中详细讨论过的事情。其中一件被讨论为负面的事情是,人工智能将自动化一切,并取代我们所有的工作。每个人都或多或少听说过,不管是认真的还是开玩笑的,“机器人将会取代我们的工作。”这被认为是担忧和焦虑的巨大原因。一旦技术做了他们能做的事情,人们就会失业,特别是如果技术更高效、更不容易出错或者可以工作更长时间。
虽然我不会说这些担忧完全不合理,但我确实认为这是另一个“天没有塌下来”的例子。当然,有些工作将不复存在,因为机器可以像人一样做好这些工作。但这并不是人工智能独有的,这只是人类进步的方式。此外,通过关注我们失去的东西,我们忘记了关注我们可能得到的东西。这就是机械化编织的出现可以向我们展示我们自己的未来的地方。
让妇女选择离开家庭领域有许多原因。其中一个巨大的原因是因为有足够的技术可以自动做她过去必须手动做的事情。她不用织布,甚至不用做自己或家人的衣服。当我们获得为我们做事的技术时,我们能够完成更多的事情。女性能够做更多的事情,完成更多的事情,因为管理一个家实际上比过去需要更少的工作。这并没有导致整个性别在家里萎靡不振,几乎无所事事。这导致了性别角色的重新定义和妇女在社会中更多的选择。
人们很容易对未来感到焦虑,但事实是,太阳底下没有新鲜事。虽然技术本身可能是新颖的,但它的影响和潜力我们已经见过很多次了。通过回顾看似不起眼的编织例子,我们可以看到机械化和自动化改变人类社会角色的例子。当然有人会说自动化失去了一些东西,作为一个自己编织和制作衣服的人,我不能说我完全不同意他们的观点。然而,我不是出于必要才编织的,正因为如此,我可以自由地做更复杂、更耗时的项目。同样地,自动化能够,也确实,导致人类的创造力和创新,因为他们不局限于单调的任务。另外,我想我们都知道有人的职位不久前还不存在。我们可能会在某些领域失去工作,但我们也会收获很多。
[1]植物,赛迪。“未来织机:编织妇女和控制论.”《身体与社会》1,第 3-4 期(1995 年 11 月):45-64 页。doi:10.1177/1357034 x 95001003003。
[2]玛丽亚·克里斯蒂娜·帕戈诺尼。构建大数据:语言和话语方法。斯普林格,2019。
网络分析数据仓库:谷歌分析和搜索
在本教程中,我们将看到如何创建一个数据仓库和一个依赖于 SEO(搜索引擎优化)的内容营销仪表板。它将利用和混合来自谷歌分析(跟踪你网站的流量)和谷歌搜索控制台(你的网站在谷歌搜索上的表现)的数据。
结果将是这个 Google Sheet dashboard (你可以点击链接或者看下面的截图)自动更新。这是来自我的博客DataIntoResults.com的直播,它运行在 WordPress 上,但是任何内容营销平台都可以。
这篇文章将包含许多主题:设置数据仓库和 ETL 基础设施,从 Google Analytics 和 Google Search 获取数据到数据仓库,对数据建模以便使用,以及在 Google Sheets 中设置一个漂亮的仪表板。
我们开始吧!
什么是网络分析数据仓库?
我们需要问自己的第一个问题是,我们想要实现什么?建立 web analytics 数据仓库的全部意义在于能够获得完全符合您需求的定制报告。如果没有,你也可以使用谷歌分析前端。
在这里,我将把我的兴趣缩小到两个问题上:什么与我的受众相关,以及如何让我的文章更加 SEO 友好。尽管如此,这篇文章的目的是让你有足够的数据来更加关注你的具体情况。
内容是否与受众相关?
哪些内容是观众感兴趣的?我不做 clickbait,所以我的文章往往比较长。因此,怀疑兴趣的一个方法是看有多少访问者阅读了整篇文章,而不是那些在文章开始就停下来的访问者。在 Medium 中有一个很酷的特性叫做读取率(见下面的截图)。我们将与谷歌分析这个功能。
第二个感兴趣的指标是谷歌搜索上显示的内容的点击率(CTR)。如果你的内容被推到人们面前,但他们没有点击,这可能是因为你的主题不正确,或者你的标题和描述不够有趣。
内容搜索引擎优化准备好了吗?
有相关的内容是很好的,但是如果没有一种方法把它放在观众面前,它是没有用的。 SEO 营销的基础是让人们正在寻找的一些关键词的内容处于有利位置。
例如,这些天我在搜索“postgresql 数据科学”上排名很好(在 DuckDuckGo 上排名第一)。这是一个合理的关键字组合,流量和排名第一有助于推动游客。
尽管如此,总的来说,该页面位于第 27 位。挖掘了一下,我发现了一些既相关又有一些流量(新内容创作的机会)的关键词组合。
设置数据仓库基础设施
现在我们知道了我们想要什么,我们需要在基础设施上花些时间。需要帮助的话可以联系我。让我们为您未来的发展打下坚实的基础。
我们将使用一个 PostgreSQL 数据仓库(开源)和数据酿酒厂 ETL (我的一个产品,也是开源的)。PostgreSQL 将是存储和处理数据的地方,而 Data Brewery 将把数据从谷歌服务转移到数据库并管理工作流。
有两个数据源,Google Analytics 和 Google Search 将存储在 PostgreSQL 数据仓库中(每个都在一个特定的模块中)。然后,我们将把它们融合到一个名为内容营销的新模块中。最后,我们将数据放入 Google 工作表中。这里没什么特别的。
你可以在 GitHub 上找到完整的 Data Brewery 项目(在文件夹 v1 中)。
我不会详细讨论实现,但是数据存储目录包含数据源的视图。例如,下面是谷歌搜索的数据存储。它定义了一个名为 seo_pages 的表(虚拟的),该表将包含一些关于过去 10 天的信息(有多少印象,点击和每页每天的平均位置)。
然后,数据被集成到归档模块中。
运行该流程(使用 shell 命令ipa run-process update
)后,将填充表 google_search.seo_pages。
Google Sheets 数据存储用于输出数据,每个表都有一个 SQL 查询要在数据仓库中执行,以便填充 Google Sheets 中的相应区域。
如果你想了解更多关于整合配置的信息,你可以阅读来自 Data Brewery 的 Google Analytics 、 Google Search 和 Google Sheets 文档页面。
数据建模
既然我们在 web analytics 数据仓库中有了原始数据,我们可能希望在仪表板中很好地呈现它。为此,我们将利用 SQL 语言(大多数数据库的说法)。
第一次查询
让我们从一些简单的东西开始(但绝不简单),每个国家每月的用户图表。
你可能会看到,我们将展示的国家数量限制为五个,并将其余的国家重新组合在另一个国家。这对可读性很重要。但是你必须定义你如何选择五个重要的国家。它可以是静态选择,也可以是动态选择。在这种情况下,我选择了前一个月最大的 5 个国家。
正如您在下面看到的, user_country 部分(第一个选择)很简单,其余的只是 5 个国家的选择。
正如您在数据—用户国家表中看到的,栏 A 到栏 C 由 ETL 填充。在此基础上,我们使用交叉表来生成图表。
正如你所看到的,这并不简单,因为我们想展示一些好的东西,我们操纵原始数据,最后是因为谷歌工作表是有限的。
但是让我们变点魔法吧。
读取比率
请记住,阅读率是阅读整个内容的访问者数量除以该内容的访问者数量。第二部分很简单,因为它在谷歌分析上是默认提供的。
对于第一部分,阅读全文的访问者数量,我们将使用 Google Analytics 的事件机制。我推荐使用谷歌标签管理器,它允许轻松配置谷歌分析事件。
我定义了下面的标签(参见截图)。我们将有一个名为 Scroll 的事件类别,它将在页面滚动时被触发(我已经设置了 25、50、75 和 90%)。参数{{UA DataIntoResults}}是我的 Google Analytics 视图 ID。
在Google _ analytics . events表中,我们将找到这些事件。
请注意,动作值与页面相同。这是因为我们将使用 unique_events 列。如果动作是一个像“滚动”一样的常量,那么 unique_event 将在每次访问时只计算一次,即使访问者阅读了许多完整的帖子。
现在,开始行动,或者 SQL 查询。我想强调三件事:
- 原始数据必须清理一点,页面有时有参数。例如,
/mypage
和/mypage?parameter=1
不是谷歌分析的同一个页面。从商业角度来看,大多数时候都是一样的。代码regexp_replace(page, '[?&].*$', '')
将会清除它(第 4 行和第 9 行)。 - 我们过滤数据,只保留 2020 年 1 月 15 日之后的数据。滚动跟踪是在那一天实现的(第 20 和 29 行)。
- 我们使用 75%的阈值来定义一篇文章为已读。合适的值取决于你的网站布局(第 18 行)。
这是我们的阅读率:
最后一个焦点:那些迷你图
我是爱德华·塔夫特的超级粉丝,他在探索信息密度的过程中发明了迷你图这个术语。迷你图无需占用太多空间即可提供时间上下文。
例如,我们使用印象指标(节选如下),它反映了在谷歌搜索上看到每个页面的人数。通过为过去 13 个月的趋势添加迷你图,我们提供了更多价值。我们可以看到,虽然第二篇文章( PostgreSQL for Data Science )上升缓慢,但第一篇文章( Jupyter for Complex Python 和 Scala Spark project)却迅速获得了更多的印象。最后一个(数据仓库宣言),印象不多,从来没有过。这只是不是搜索引擎优化的好内容。
现在坏消息是,每页绘制 13 个数据点需要 13 列,这在 SQL 中有点麻烦。我们首先创建一个参考表,提供每个月(过去 13 个月)的订单(从 1 到 13)。这是在第 8 到 11 行完成的。然后,从第 42 行开始,我们用一个关于月份的条件来聚集数据。这允许将数据从行旋转到列。
现在每个指标有 13 列(浏览量、浏览量、点击量和位置)用于每个页面(每个页面是一行),我们可以在 Google Sheet 中绘制这些小的迷你图。
请注意,除了数据点选择之外,您还可以传递参数来控制行为。你可以在 Google Sheets 文档中阅读更多关于迷你图的内容。
初始化并自动刷新
默认配置从谷歌分析和谷歌搜索中查找最近 10 天的信息。当您有一份过去 13 个月的报告时,这显然不方便(您需要等待 13 个月)。
因此,我们将使用 init.conf(见下文)来使用ipa run-module -c init.conf update
引导数据仓库。这将需要一些时间,因为我们要获取最近 400 天的数据。
最后,我们希望 web 分析数据仓库在没有人工交互的情况下被刷新。最简单的方法是使用调度程序,例如 Linux 下的 cron。在下面,您可以看到每天在 UTC 时间早上 5 点更新数据仓库的命令。
# m h dom mon dow command 0 5 * * * cd ~/dwh/web-analytics-data-warehouse/v1 && ~/app/ipa/bin/ipa run-process update
因此,我们的 Google Sheet dashboard 每天都会更新(每天不会有太大变化,因为它是一份月度报告)。
恭喜,我们现在有了一个完全可操作的 web 分析数据仓库!你会添加什么使它更相关?
用 Python 开发 Web 应用程序
构建前端用户体验简介
烧瓶是什么?
Flask 是一个帮助我们开发 web 应用程序的轻量级 Python 库。我已经在个人项目中使用 Flask 来构建交易仪表板,并在专业环境中为医院部署人工智能工作流管理系统。在本文中,我想介绍 Flask,并演示开始构建自己的 web 应用程序是多么容易。
按指定路线发送
理解 Flask 如何工作的最好方法是亲自动手使用它。之后,您将了解如何构建 web 应用程序的各个部分。首先,让我们导入并创建一个 Flask 实例。
当我们最终运行 Flask 实例并在浏览器中连接到它时,它将拥有一个默认主机( 127.0.0.1 或 localhost )和一个默认端口( 5000 )。要在浏览器中连接到我们的 web 应用程序,我们需要键入 URL 和端口(localhost:5000)以及一个规则来帮助我们检索适当的内容。因此,让我们创建一个新的 URL 规则,这基本上相当于一个主页。当我们在浏览器中键入 localhost:5000 时,它将检索该函数返回的数据。
现在我们需要一些东西来展示。
模板
模板是 HTML,它将由伴随 URL 规则的函数呈现并返回给用户。在这种情况下,home 函数将负责呈现和返回主页模板。所有模板都应该存储在名为 templates 的文件夹中,该文件夹与保存 Flask 实例的脚本位于同一文件夹中。HTML 可以是您喜欢的任何东西,对于这个例子,我将创建一个简单的网格布局,类似于我用来构建交易仪表板的布局。
为了让 home 函数呈现并返回这个模板,我们可以将下面的代码添加到 home 函数中。
每当我们到达主页(localhost:5000)时,home 函数将呈现并返回 home HTML 模板。
将 Python 变量传递给 HTML
拥有 Python 后端的全部目的是在前端向用户显示相关数据。为此,我们可以使用 Jinja。Jinja 允许我们轻松地引用 Python 变量,并编写 Python 代码来控制我们选择如何在 HTML 中显示这些变量。首先,我将在 Python 中创建两个变量: first_name 和 last_name 。然后我将通过我们的 home 函数中的 render_template 把它们传递给模板。我将把 Python 变量传递给 fn 和ln——这就是我们在 HTML 中引用 first_name 和 last_name 的方式。
我想在第一列显示名变量,在第二列显示姓变量。为此,我将把对这些变量的引用, fn 和 *ln,*用花括号( {{ fn }},{{ ln }} )包装起来,向 HTML 表明它们将从 Python 传递到模板。
这将使用 Python 变量呈现主 HTML 模板。
发射
要启动我们的 web 应用程序,我们所要做的就是运行 Flask 的实例。
运行 Python 脚本后,在浏览器中输入 localhost:5000。
我把我的文本放在 h1 标签中以提高可视性
这就是你用 Python 和 Flask 构建的第一个 web 应用程序。
实时部署
一个非常典型的问题出现了:我们如何在线部署 Python web 应用程序?有很多方法可以做到这一点。然而,如果你正在寻找一个具体的答案,我会建议看看亚马逊网络服务的弹性豆茎。这就是我部署所有 web 应用程序的方式。
[## AWS 弹性 Beanstalk -部署 Web 应用程序
易于开始,不可能超越 AWS 弹性 Beanstalk 是一个易于使用的服务,用于部署和扩展 web…
aws.amazon.com](https://aws.amazon.com/elasticbeanstalk/)
分拣机器人—第 1 部分
一个基于网络的解决方案,用于控制一群覆盆子 pi,具有实时仪表盘、深度学习推理机、一键式云部署和数据集标记工具。
这是由三部分组成的 SorterBot 系列的第一篇文章。
- 第 1 部分——项目概述和网络应用
- 第二部分——控制机械臂
- 第 3 部分—迁移学习和云部署
GitHub 上的源代码:
- 控制面板 : Django 后端和 React 前端,运行在 EC2 上
- 推理机:运行在 ECS 上的 PyTorch 对象识别
- 树莓:控制机械臂的 Python 脚本
- 安装程序 : AWS CDK、GitHub 动作和一个 bash 脚本来部署解决方案
- 标签工具:使用 Python 和 OpenCV 的数据集标签工具
我最近在 SharpestMinds 完成了一个人工智能导师项目,其核心要素是建立一个项目,或者更好的是一个完整的产品。我选择后者,在这篇文章中,我写了我构建了什么,我是如何构建的,以及我一路走来学到了什么。在我们开始之前,我想特别感谢我的导师托马斯·巴贝吉(CTO@ProteinQure)在这段旅程中给予的宝贵帮助。
在考虑构建什么的时候,我想到了一个基于网络的解决方案来控制一群树莓 pi,它具有实时仪表盘、深度学习推理引擎、一键云部署和数据集标记工具。Raspberry Pis 可以连接任何传感器和执行器。他们收集数据,将其发送到推理引擎,推理引擎对数据进行处理,并将其转化为执行器可以执行的命令。还包括一个控制面板来管理和监控系统,同时子系统使用 WebSockets 或 REST API 调用相互通信。
作为上述总体思想的实现,我构建了 SorterBot,其中传感器是一个摄像头,执行器是一个机械臂和一个电磁铁。该解决方案能够根据金属物品的外观对其进行自动分类。当用户开始一个会话时,手臂扫描它前面的区域,找到它所及范围内的物体和容器,然后自动将物体分成与找到的容器一样多的组。最后,它将对象移动到它们对应的容器中。
SorterBot 自动拾取对象(图片由作者提供)
为了处理手臂摄像头拍摄的图像,我基于脸书 AI 的 Detectron2 框架构建了一个推理机。当图片到达进行处理时,它在该图像上定位项目和容器,然后将边界框保存到数据库。在给定会话中的最后一张图片被处理之后,项目被聚类到与找到的容器一样多的组中。最后,推理引擎生成命令,这些命令指示手臂将相似外观的项目移动到同一个容器中。
为了更容易控制和监控系统,我构建了一个控制面板,前端使用 React,后端使用 Django。前端显示已注册的 arm 列表,允许用户启动会话,还显示现有会话及其状态。在每个会话下,用户可以访问逻辑分组的日志,以及工作区的前后概览图像。为了避免为 AWS 资源支付不必要的费用,用户还可以选择使用标题中的按钮来启动和停止运行推理引擎的 ECS 集群。
控制面板的用户界面(图片由作者提供)
为了让用户更容易看到手臂在做什么,我使用 OpenCV 将相机在会话期间拍摄的照片拼接在一起。此外,在手臂将物体移动到容器后拍摄另一组照片,因此用户可以看到该区域的前/后概览,并验证手臂实际上将物体移动到容器。
由会议图像拼接而成的概览图像(作者提供的图像)
后端通过 WebSockets 和 REST 调用与 Raspberry Pis 通信,处理数据库并控制推理引擎。为了能够在更新发生时从后端进行实时更新,前端还通过 WebSockets 与后端进行通信。
由于该解决方案由许多不同的 AWS 资源组成,手动提供它们非常繁琐,所以我利用 AWS CDK 和一个冗长的 bash 脚本自动化了部署过程。要部署该解决方案,必须设置 6 个环境变量,并且必须运行一个 bash 脚本。该过程完成后(大约需要 30 分钟),用户可以从任何 web 浏览器登录到控制面板,并开始使用该解决方案。
Web 应用程序
从概念上讲,通信协议有两个部分。第一部分是一个重复的心跳序列,arm 定期运行该序列,以检查是否为启动会话做好了一切准备。第二部分是会话序列,负责跨子系统协调整个会话的执行。
说明解决方案不同部分如何相互通信的图表(图片由作者提供)
心跳序列
第一部分开始执行的点用绿色矩形标记。作为第一步,Raspberry Pi ping web socket 连接到推理引擎。如果连接是健康的,它会跳到下一部分。如果推理引擎显示为脱机,它会从控制面板请求其 IP 地址。在控制面板返回 IP(或者如果推理引擎实际上是离线的,则返回“假”)之后,它试图建立与新地址的连接。这种行为使得推理引擎在不使用时可以关闭,从而大大降低了成本。它还简化了手臂的设置,这在使用多个手臂时尤其重要。
不管与新 IP 的连接是否成功,结果都会与 arm 的 ID 一起报告给控制面板。当控制面板接收到连接状态时,它首先检查数据库中是否已经注册了 arm ID,并在需要时进行注册。之后,连接状态被推送到 UI,其中状态 LED 以绿色或橙色亮起,分别表示连接是否成功。
出现在用户界面上的手臂,带有开始按钮和状态灯(图片由作者提供)
在用户界面上,状态 LED 旁边有一个“播放”按钮。当用户点击该按钮时,手臂的 ID 被添加到数据库的列表中,该列表包含应该开始会话的手臂的 ID。当 arm 检查连接状态,并且该状态为绿色时,它会检查其 ID 是否在该列表中。如果是,ID 将被删除,一个响应将被发送回 arm 以启动会话。如果不是,则发送回一个响应来重新启动心跳序列,而不启动会话。
会话序列
手臂的首要任务是拍照进行推断。为此,手臂移动到推断位置,然后开始在其底部旋转。它每隔一段时间就停下来,然后相机拍一张照片,直接以字节的形式发送给推理机,使用 WebSocket 连接。
推理机的高层图(图片由作者提供)
当从 Raspberry Pi 接收到图像数据时,图像处理开始。首先,从字节解码图像,然后产生的 NumPy 数组用作 Detectron2 对象识别器的输入。该模型输出已识别对象的边界框坐标以及它们的类别。坐标是距图像左上角的相对距离,以像素为单位。这里只进行二元分类,这意味着一个对象可以是一个项目或一个容器。项目的进一步聚类在后面的步骤中完成。在处理结束时,结果被保存到 PostgreSQL 数据库,然后图像被写入磁盘供矢量器使用,并存档到 S3 供以后参考。保存和上传图像不在关键路径中,所以它们在一个单独的线程中执行。这降低了执行时间,因为序列可以在上载完成之前继续。
当在 Detectron2 的 model zoo 中评估模型时,我选择了更快的 R-CNN R-50 FPN,因为与其他可用的架构相比,它提供了最低的推理时间(43 ms)、最低的训练时间(0.261s/迭代)和最低的训练内存消耗(3.4 GB),而没有放弃太多的准确性(41.0 box AP,是最佳网络的 box AP 的 92.5%)。
矢量器的高级图(图片由作者提供)
在所有的会话图像已经被处理并且生成会话命令的信号到达之后,将这些图片拼接在一起在单独的过程中开始,为用户提供“之前”的概览。与此同时,从数据库中加载属于当前会话的所有图像处理结果。首先,使用随请求发送的特定于 arm 的常数将坐标转换为绝对极坐标。常数 r 代表图像中心和手臂基轴之间的距离。相对坐标( x 和 y 在下图中)是距离图像左上角的像素距离。图像拍摄的角度用 γ 表示。δγ表示给定项目与图像中心之间的角度差,可以使用下图中的公式 1) 计算。项目的第一个绝对极坐标(角度, γ’ ),可以简单地用这个等式计算:γ’ =γ+δγ。第二个坐标(半径,**r’),**可以用图上的公式 2) 计算。
用于将相对坐标转换为绝对极坐标的绘图和方程(图片由作者提供)
在坐标转换之后,属于相同物理对象的边界框由它们的平均绝对坐标代替。
在矢量器的预处理步骤中,加载前一步骤中保存到磁盘的图像,然后围绕每个对象的边界框进行裁剪,从而生成每个项目的小图片。
围绕其边界框裁剪的对象示例(作者提供的图像)
这些图片被转换成张量,然后添加到 PyTorch 数据加载器中。一旦所有的图像被裁剪,所创建的批次由矢量器网络处理。选择的架构是 ResNet18 模型,它适合这些小尺寸的图像。PyTorch 钩子被插入到最后一个完全连接的层之后,因此在该层的每个推理步骤的输出中,512 维特征向量被复制到网络外部的张量。在矢量器处理了所有的图像之后,得到的张量被直接用作 K-Means 聚类算法的输入。对于其他所需的输入,即要计算的聚类数,从数据库中插入已识别容器的简单计数。这一步输出一组配对,表示哪个项目进入哪个容器。最后,这些配对被替换为发送到机械臂的绝对坐标。
这些命令是表示项目和容器的坐标对。机械臂一个接一个地执行这些动作,利用电磁铁将物体移动到容器中。
物体被移动后,手臂拍摄另一组照片进行拼接,作为手术后的景观概览。最后,机械臂复位到初始位置,会话完成。
感谢您的阅读,如果您有任何问题、意见或建议,请告诉我!
在下一部分,我将写关于装配和控制机械臂。
分拣机器人—第二部分
一个基于网络的解决方案,用于控制一群覆盆子 pi,具有实时仪表盘、深度学习推理机、一键式云部署和数据集标记工具。
我最近在 SharpestMinds 完成了一个人工智能导师项目,其核心要素是建立一个项目,或者更好的是一个完整的产品。我选择后者,在这篇文章中,我写了我构建了什么,我是如何构建的,以及我一路走来学到了什么。
这是由三部分组成的 SorterBot 系列的第二篇文章。
- 第 1 部分——项目概述和网络应用
- 第 2 部分—控制机械臂
- 第 3 部分—迁移学习和云部署
GitHub 上的源代码:
- 控制面板 : Django 后端和 React 前端,运行在 EC2 上
- 推理机:使用 PyTorch 进行对象识别,运行在 ECS 上
- 覆盆子:控制机械臂的 Python 脚本
- 安装程序 : AWS CDK、GitHub 动作和一个 bash 脚本来部署解决方案
- 标签工具:使用 Python 和 OpenCV 的数据集标签工具
机械臂
组装前的机器人(作者拍摄)
来自全球速卖通的机械臂没有特定的品牌,被宣传为 DIY 玩具,这使它成为一个负担得起的选择,只花了我 118 美元(40 美元的关税)。由于用机器人手臂抓取物体需要很高的精度,我不可能指望这个价格类别的手臂,我决定使用磁铁将物体移动到容器中。我花 11 美元从 Grove 订购了一个,专门为树莓派设计的。它自带控制电子设备,因此可以使用 GPIO(通用输入/输出)引脚来开关它。至于相机,我花了 45 美元买了一台黑色派 V2 相机,安装起来也很容易。为了运行我的软件并控制上述所有设备,我购买了最新版本的树莓 Pi,这是树莓 Pi 4 Model B,内存为 4 GB。我以 130 美元的价格订购了一个套装,连同 SD 卡、外壳、散热器和电源适配器。硬件总共花了我 344 美元。
控制手臂
手臂运到时是碎片,我不得不自己组装。我原以为这不成问题,但这比我想象的要有挑战性。首先,说明书是中文的,但是有图片。我没有任何问题地完成了最初的几个步骤,然后零件的图片开始出现在我没有的说明中。起初我认为我的工具包不完整,但后来我注意到我有类似的零件,但大小不同,孔在不同的地方,等等。我看了看手册所在的网站,还有一些其他型号,其中一些型号的零件与我的完全相同。我试图弄清楚我是否会收到一个不同的模型,但不幸的是没有:我有来自不同手臂的混合零件。从这一点来看,说明是完全无用的。因为手臂用了将近一个月的时间才到达,所以订购一个不同的并不是一个真正的选择,我不得不从我现有的开始工作。经过 8 个小时的努力,在不同的地方钻孔,在不同的地方弯曲金属片,我成功地组装了一个功能正常的手臂。它并不完美,但做得足够好了。
这个机械臂有 6 个自由度,这意味着它有 6 个伺服系统。我只需要其中的 4 个,这是幸运的,因为当我试图用手转动它时,其中一个伺服系统立即坏了,另一个则根本不起作用。
精确控制伺服系统不是一项简单的任务。当它们收到信号时,它们会尽可能快地移动到想要的位置,然后保持在那里,直到另一个信号到来。这种行为更适合像遥控飞机这样的应用,其中伺服系统用于控制飞机的鳍。相反,在机器人应用中,这可能会导致非常突然和不稳定的运动,但通过基于软件的运动平滑,这种情况可以得到缓解。
伺服系统由 PWM 控制,PWM 代表脉宽调制。PWM 有一个周期时间(T ),在模拟伺服的情况下通常为 50 赫兹。这个频率意味着所需的伺服位置每秒更新 50 次(每 20 毫秒一次)。为了设置轴角,必须向伺服系统施加电脉冲,其宽度在 0.5 至 2.5 毫秒之间,称为占空比。如果施加 0.5 毫秒的脉冲宽度,伺服将移动到最逆时针的位置,在 1.5 毫秒时,它将移动到中间(中间)位置,在 2.5 毫秒时,它将移动到最顺时针的位置。通常,伺服系统可以移动 180 度,但它会因型号而异。脉冲必须在每个周期中重复,以指示伺服机构保持该位置。如果没有施加脉冲,伺服机构关闭,轴可以自由移动。
在我将我的伺服系统连接到 Pi 并 SSH’d 到它之后,我安装了控制 GPIO 管脚的默认库: RPi。GPIO 。这是非常容易使用,我只是设置了一个引脚作为 PWM 输出,设置一个脉冲宽度和伺服已经在移动。它立即全速前进,然后突然停止。由于机器人手臂比遥控飞机的鳍重得多,我担心这些突然的运动最终会损坏伺服系统中的小齿轮,特别是承载最大重量的底部齿轮。我遇到的另一个问题是 RPi。GPIO 提供软件定时 PWM,这意味着脉冲由 Pi 的 CPU 产生。如果 Pi 同时在做其他工作,脉冲可能会明显延迟甚至失真。如果它用于使 LED 闪烁,这可能不是问题,但在我的情况下,我需要尽可能从系统中挤出所有的精度。解决方案是使用另一个提供硬件定时 PWM 的库,它更加精确(精确到几微秒)并且独立于 CPU 负载。一个提供这个特性的流行库是 PiGPIO 。
执行命令
arm 从推理机接收的每个命令都是一对绝对极坐标。第一个坐标总是项目,第二个是容器。为了将物品移动到容器,手臂必须移动到物品,打开磁铁,移动到容器上方,然后关闭磁铁。为此,必须解决两个任务:
- 以适当的速度尽可能平稳地移动单个伺服系统。
- 坐标 4 伺服移动手臂到所需的位置。
以天真的方式控制伺服,仅仅立即发送目标脉冲宽度会导致不可接受的快速和突然的移动。减慢这种运动的唯一方法是生成中间点,并以小间隔将它们发送到伺服系统,从而有效地减慢运动。
原始控制(左),较慢,但线性轨迹(中),正弦平滑(右)
为了进一步平滑移动,可以应用正弦平滑来代替线性轮廓。
线性(蓝色)和正弦(红色)轨迹
为了从 x 值产生红线,可以使用以下等式:
生成正弦平滑轨迹的方程
这种技术在开始后和停止前减慢运动,这有助于实现平稳的运动。
为了将手臂移动到特定的位置,所有的伺服系统必须同步移动。通常,如果所有伺服系统同时移动(并行控制),速度会更快,但在某些情况下,例如,在拾起一个物体后,最好先向上移动机械臂(串行控制),否则磁铁会撞到附近的物体。由于移动手臂包括以小间隔向伺服系统发送命令,并在伺服系统执行命令时休眠,因此并行控制多个伺服系统需要多线程方法。
控制手臂的最后一部分是计算出哪些伺服角度属于从推理引擎接收的坐标。接收到的位置是一个绝对极坐标:第一部分是以脉冲宽度( γ 表示的手臂基伺服角度,第二部分是以像素表示的手臂基轴和图像中心点之间的距离( d )。
由于 γ 是用脉宽表示的,所以可以直接送到伺服。弄清楚哪些伺服角度属于所需距离, d 是一项更艰巨的任务。在最佳情况下,当机器人臂的精确尺寸已知并且关节基本上没有间隙时,可以使用基本的三角学来计算伺服角度。在我的情况下,不知道尺寸,也缺乏适当的工具来测量它们,我决定采取一种实验方法:我手动移动手臂到 7 个位置,均匀分布在操作范围内,并记录每个位置的伺服角度。
显示伺服数字的照片
由于 d 主要取决于伺服 1 的角度,我绘制了伺服 2 和伺服 3 的角度作为伺服 1 位置的函数,对应于记录的 7 个点。
伺服 2 和伺服 3 的脉冲宽度值作为伺服 1 的函数,对应于所需位置
如上图所示,给定 servo1,三次多项式给出了相当好的拟合,并产生了可在代码中用于计算 servo2 和 servo3 的位置的方程。servo1 的角度可以通过特定于手臂的常数来计算,即以像素为单位测量的相机视野中心和手臂基轴之间的距离,以及对应于极坐标中最小和最大距离的 servo1 的脉冲宽度值。这些值可以通过粗略的测量来估计,比如使用尺子,然后通过反复试验来微调。
完成以上所有操作后,手臂就可以直接移动到任意坐标。唯一需要调整的是处理容器上方的落物,此时臂需要停在更高的位置。简单地用负值偏移 servo1 就可以实现。
感谢您的阅读,如果您有任何问题、意见或建议,请告诉我!
在第三部分也是最后一部分,我将讲述我如何使用迁移学习,以及我如何将解决方案部署到 AWS。
分拣机器人—第三部分
一个基于网络的解决方案,用于控制一群覆盆子 pi,具有实时仪表盘、深度学习推理机、一键式云部署和数据集标记工具。
这是由三部分组成的 SorterBot 系列的第三篇文章。
- 第一部分——项目概述和网络应用
- 第二部分——控制机械臂
- 第 3 部分—迁移学习和云部署
GitHub 上的源代码:
- 控制面板 : Django 后端和 React 前端,运行在 EC2 上
- 推理机:运行在 ECS 上的 PyTorch 对象识别
- 树莓:控制机械臂的 Python 脚本
- 安装程序 : AWS CDK、GitHub 动作和一个 bash 脚本来部署解决方案
- 标签工具:使用 Python 和 OpenCV 的数据集标签工具
推理机的迁移学习
所有的 Detectron2 模型都是在 ImageNet 上训练的,ImageNet 包括像人、狗、树等类别,但不包括小的金属物体,所以我需要定制训练模型来识别我想要使用的物体。为了节省训练时间和减少必要的数据集大小,我从预先训练的权重开始(迁移学习)。
创建数据集
对于我的用例,我需要几千张带标签的训练图片。在创建训练集时,我应用了两个策略来减少花费的精力。我的第一个想法是,我将录制一个视频,并从中抓取帧,而不是拍照。首先,我试图相对快速地移动手臂,但这样一来,大多数图像最终都很模糊,因为 Pi 相机在最大分辨率下只能提供 30 fps。为了克服这一点,我试图将手臂移动得更慢,但由于手臂的质量较差,这导致了不均匀、不平稳的运动。解决方法是移动手臂,等待一秒钟直到它稳定下来,然后进一步移动。由此产生的视频被用作我的数据集创建工具的输入。
为了减少用户必须绘制的边界框的数量,我计算了一个点在视频中出现的轨迹。
用于计算训练视频上项目的表观轨迹的绘图和方程(图片由作者提供)
最初,边界框是在笛卡尔坐标系中定义的,其原点在图像的左上角。这个计算的目标是在手臂旋转了δγ之后,检索一个点的新坐标。为此,我定义了两个额外的坐标系:一个极坐标系统和另一个笛卡尔坐标系。它们的两个原点都被定义为手臂的基轴,在这两个原点中,图像的中心点的坐标为(0,rc),其中 rc 是特定于手臂的半径常数。
为了进行计算,首先我在新的笛卡尔坐标系中表示旧的点(图上的点 1),然后将其转换为极坐标(点 2)。在我有了旧点的极坐标之后,我简单地把手臂的旋转加到它上面(点 3),然后把它转换回原来的笛卡尔系统(点 4)。使用这种方法,我可以计算出物品在摄像机视口中移动时的表观轨迹。这种方法的好处是,我可以为每个视频绘制一个边界框,然后为其余的帧计算它的位置,而不是抓取每个帧并在其上手动绘制边界框。这将标注数据集所花费的时间减少了至少十分之一。
绘制边界框,然后在数据集标注工具上调整旋转滑块(图片由作者提供)
在数据集创建工具中,有两个滑块定义边界框的轨迹:半径(以像素为单位)和角度(以度为单位)。半径表示机器人的基轴和摄影机视口中心之间的距离。而角度代表最逆时针和最顺时针位置之间的角度。设置这些滑块定义了边界框的位置,因此用户应该找到边界框适合实际对象的值。首先,半径滑块的值应该是近似值,然后角度滑块应该移动,直到边界框处于正确的位置。
在数据集标注工具中调整角度和半径滑块(图片由作者提供)
另外两个滑块用来定义应该抓取哪些帧:间隔和偏移。用户应该以一种方式设置它们,以确保在手臂不移动时的短暂停顿中抓取帧。为了使这更容易,当当前帧被设置为抓取时,边界框的颜色将变为白色。
即使我想出了所有的软件技巧,一些图片还是模糊不清,或者边框放错了位置。为了避免这些出现在数据集中,我创建了另一个简单的工具,它允许我浏览整个数据集,并通过按键来保留或删除图像。这增加了数据集创建的时间,但也提高了结果的质量。验证后,创建的数据集由标记工具上传到 AWS S3 桶,以便于培训。
训练网络
培训是在 DeepNote 上进行的,使用的是这个笔记本。我基本上遵循了 Detectron2 文档中描述的标准训练程序。作为我的第一次尝试,学习率为 2.5e-4,批量大小为 512,训练花费了大约 5 分钟,在 600 次迭代后停止。这导致平均精度(AP)为 33.4,明显低于在 ImageNet 上测量的相同网络的基准 AP(40.2),但我使用这些权重测试了应用程序,它工作得非常好,即使对象不在训练数据集中。这样做的原因大概是用磁铁抓取一个物品并不需要很大的精度,基本上,如果磁铁接触到物品的任何地方,它都可以捡起来。这意味着即使边界框偏离了很大一部分,磁铁仍然可以完成它的工作。最有可能的是,我可以通过更长的训练、更多的数据和超参数调整来显著提高精度,但为了避免试图修复没有损坏的东西的错误,我决定将我的努力集中在其他地方。
训练结束后,我将网络设置为推理模式,并使用验证集中的一些图片来可视化网络的表现。
可视化的预测边界框(图片由作者提供)
正如您在上面的图片中看到的,所有的物品和容器都以相对较高的置信度(87–94%)被识别,这远远高于我定义的 70%的阈值。左下角的螺钉无法识别,因为它的边界框会在图片之外。这是有意的,我从训练集中移除了每个这样的边界框,以避免边界框的中心发生位移,因为它被裁剪以适应图片。您还可以注意到,螺钉周围留有一些衬垫,这也是有意为之。我决定在物体周围画稍微大一点的边界框,以适应不完美的硬件造成的小偏差。由于磁铁被移动到边界框的中间,只要填充均匀分布在对象周围,这不会阻止手臂拾取对象。
最后,训练好的权重被上传到另一个 AWS S3 桶,GitHub Actions CI 管道可以方便地访问它们。
部署到 Amazon Web 服务
为了将整个解决方案部署到 AWS,必须创建和配置 43 个资源。首先,我使用 AWS 控制台手动完成了它,还编写了一个逐步指南来跟随。该指南有 100 个步骤,手动完成所有步骤大约需要 3 个小时,这给错误留下了很大的空间。为了确保没有人(包括我)必须再次经历这个过程,我决定利用 AWS CDK 和一个冗长的 bash 脚本来自动化部署。CDK(云开发工具包)允许用户使用传统的编程语言来定义、配置和部署 AWS 资源。目前支持 Javascript、Python、C#和 Java,我选择 Python。bash 脚本用于编排流程,也用于管理秘密,因为 CDK 不支持该功能。
自动化部署
在 sorterbot_installer 存储库中,有两个 CDK 堆栈:一个用于开发,一个用于生产。开发堆栈是生产的子集,它提供 S3 桶和 PostgreSQL 实例,因此解决方案的全部功能也可以在开发模式下访问。除此之外,生产栈还包括一个 EC2 t2.micro 实例(包含在自由层中)来运行 SorterBot 控制面板,一个 ECR 存储库来存储推理引擎的 Docker 图像,一个 ECS FarGate 集群来部署推理引擎,以及这些组件协同工作所需的一些附加基础设施,如 VPC、安全组和 IAM 角色/策略。还包括用于部署和销毁开发和生产版本的脚本。开发脚本主要是生产脚本的子集,所以我不会在这里详细描述它们。部署到生产环境时,脚本执行以下步骤:
- 环境变量是从。env 文件和一些其他变量是显式设置的。必须由用户设置的环境变量如下:AWS 帐户 ID、GitHub 用户名、GitHub 个人访问令牌、训练模型权重的 S3 URL 以及用于登录控制面板的用户/密码组合(也用作 Django 管理凭证)。除此之外,将部署解决方案的 AWS 区域是从本地系统的默认配置文件中检索的,可以使用“aws configure”命令进行设置。
- 为了存储机密,使用 AWS 简单系统管理器(SSM)的参数存储。这是一个免费的选项(相对于 AWS Secrets Manager,每个秘密每月花费 0.40 美元),如果选择 SecureString 选项,秘密将被加密存储。
- AWS CLI 用于创建一个 SSH 密钥对,稍后可用于访问已部署的 EC2 实例。
- 授予 GitHub 操作工作流对 AWS 帐户的访问权限。为此,首先创建一个 AWS IAM 用户,然后将一个提供必要权限的策略附加到该用户。最后,为这个用户创建一个访问密钥,使用 GitHub API 将它作为 GitHub 秘密保存到 sorterbot_cloud 存储库中。
- CDK 部署生产堆栈,它提供和配置上述所有资源。
- 检索新创建的 EC2 实例的主机,并通过 SSH 在其上执行 bash 脚本,以安装运行控制面板所需的依赖项:Git LFS、Python、Docker、Docker Compose 等。
- 安装完依赖项后,控制面板的 Docker 映像就构建好了。
- 为了避免使用密码作为 Docker 构建参数时出现的安全问题,Django 迁移和用户创建在 Docker 之外执行。为此,requirements.txt 中列出的 pip 包也安装在 Docker 容器之外。
- 设置控制面板时,在 sorterbot_cloud repo 中创建了一个新的版本,它触发了 GitHub Actions 工作流,该工作流将推理引擎的 Docker 映像部署到 ECS。
- 最后,在创建了发行版之后,控制面板开始使用 Docker Compose。DNS 地址被打印到日志中,用户可以使用。部署前的 env 文件。
部署推理引擎的 CI 工作流
将推理引擎部署到 AWS ECS 的 CI 工作流被定义为 GitHub 动作。它可以通过在 GitHub repo 中创建一个新版本来触发,这是在生产部署脚本运行时自动完成的。工作流首先检查主分支,使用 flake8 链接它,安装依赖项(或者如果 requirements.txt 文件没有改变,从缓存中加载它们),然后使用 pytest 运行测试。如果所有测试都通过了,部署就开始了。
首先,通过 Git LFS 检查主分支,因此如果没有提供模型权重 URL,可以使用默认的样本权重,这些权重被提交给存储库。然后,下一个操作配置 AWS 凭证,这些凭证用于登录 ECR。之后,Docker 映像被构建、标记并推送到 ECR。接下来,创建任务定义的新版本,最后,部署任务定义。使用此工作流可以轻松替换模型权重。在新的权重被上传到适当的 S3 存储桶之后,只需要创建一个新的发布,Github Actions 会自动部署它,无需用户进一步输入。
结论和未来工作
在这个项目中,我构建了一个易于部署和管理的 web 应用程序。它可以控制任意数量的机械臂。目前的架构可能可以处理同时运行的几个分支,但如果超过这一水平,由于缺乏适当的多处理,很可能会导致严重的延迟。因为在这个项目中,我的目标不是处理许多 arm,而且我不想花钱购买具有 1 个以上内核的更强大的 ECS 实例,所以我没有太关注扩展推理引擎。由于它部署在 ECS 上,因此通过设置自动扩展或将图像处理转移到每个图像的单独流程,以及购买多核实例,可以轻松实现可扩展性。
到目前为止,最大的问题是机械臂的低质量。为了避免它的缺点,我在软件中实现了一些额外的逻辑,如果使用高质量的 arm,可以省略这些逻辑。此外,神经网络的准确性仍然可以提高,但由于硬件的准确性受到严重限制,致力于改善模型可能不会导致太多的整体改善,如果有的话。
下一步,我计划用 3D 打印技术自己制造一个机器人手臂。高精度 3D 打印变得非常实惠,Elegoo Mars 树脂打印机的价格不到 400 美元,精度不到 50 微米。结合创成式设计,就像 Autodesk 提供的设计,一个精确、轻便、看起来像有机体的机械臂就能被制造出来。
另一个限制是抓握:使用磁铁会限制手臂抓握金属物体。为了解决这个问题,可以使用另一种抓取机制,像【Festo 的这个(灵感来自变色龙抓住猎物时的舌头)。
感谢您的阅读,如果您有任何问题、意见或建议,请告诉我!
Python 中的 Web 应用程序
Django 入门
Django 是一个基于 python 的开源 web 框架,可以轻松创建数据库驱动的网站。使用 Django 的网站包括 Instagram、Mozilla 和 Bitbucket。
在这篇文章中,我们将介绍用 Django 构建一个简单的 web 应用程序的步骤。Django 的文档可以在这里找到。
我们开始吧!
我们需要做的第一件事是确保我们已经安装了 Django。要安装 Django,打开终端并执行以下 pip 命令:
pip install django
然后我们可以显示 Django 的版本:
python -m django --version
在我写这篇文章的时候,我使用的版本是 2.2.6。现在,让我们在桌面上创建一个名为“first_site”的新目录:
mkdir first_site
cd first_site
让我们在“first_site”文件夹中创建 Django 项目:
django-admin startproject first_site
我们可以看看创建的文件的结构,我们看到:
我们有一个“manage.py”文件和一个 Django 项目目录“first_site”。“manage.py”文件是命令行实用程序,它允许我们执行管理任务。
’ init '“py”文件是一个空文件,它告诉 python 我们的应用程序是一个 python 包。“setting.py”文件允许我们更改设置和配置。“url.py”允许我们指定从 url 到我们将用户发送到的位置的映射。“wsgi.py”用于允许我们的服务器和 web 应用程序之间的通信。
现在,让我们打开每个新项目的默认网站。在我们的终端中,我们运行:
python manage.py runserver
我们应该看到以下内容:
我们看到我们的网站正在运行。我们可以通过“http://127.0.0.1:8000/”访问我们的网站,这对应于我们的本地计算机。我们应该看到以下内容:
这是 Django 为我们创建的默认网站。Django 框架背后的思想是,在创建一个网站项目时,它本身就是一个应用程序,我们可以在我们的 web 应用程序中创建额外的应用程序。你可以把每个应用程序想象成我们网站上它自己的部分,比如博客部分、商店部分等等。这个框架的好处在于,在创建应用程序时,您可以在后续的 web 应用程序中重用代码。
我们将继续为我们的网站创建一个博客应用程序。首先,按“control”+“C”来关闭运行我们的 web 应用程序的服务器:
接下来,为了创建我们的博客应用程序,我们要做以下事情:
python manage.py startapp blog
我们可以在创建新应用程序时查看我们的项目结构:
现在,让我们进入博客目录,打开“views.py”文件。我们应该看到以下内容:
from django.shortcuts import render# Create your views here.
让我们也导入 HttpResponse。让我们也创建一个名为“home”的新功能,它将允许我们处理来自我们博客主页的流量:
from django.shortcuts import render
from django.http import HttpResponsedef home(request):
return HttpResponse('<h1>Blog Home</h1>')# Create your views here.
接下来,我们需要将我们的 url 模式映射到这个‘view’函数。我们转到我们的博客应用程序目录,创建一个名为“urls.py”的新文件。在该文件中,我们复制并粘贴以下内容:
from django.urls import path
from . import viewsurlpatterns = [
path('', views.home, name='blog-home'),
]
现在我们有了一个映射到视图文件中 home 函数的博客主页的 url 路径。
为了充分发挥作用,我们需要修改主项目目录“first_site”中的“urls.py”模块。这个模块告诉我们的网站哪些网址会把我们发送到我们的博客应用程序。
让我们打开“first_site”目录中的“urls.py”文件:
from django.contrib import admin
from django.urls import pathurlpatterns = [
path('admin/', admin.site.urls),
]
我们看到有一条路由映射到我们的管理站点 URL。我们现在需要指定映射到我们博客 URL 的路由。我们需要从 django.urls 导入 include 函数,并为我们的博客 url 添加一个额外的路径:
from django.contrib import admin
from django.urls import path, includeurlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls'))
]
现在让我们试着运行服务器。在尝试运行服务器时,我经常遇到以下错误:
要解决此问题,请执行:
ps -ef | grep python
并使用以下命令终止适当的进程:
kill -9 procees_id
现在尝试运行服务器:
python manage.py runserver
如果我们键入 http://127.0.0.1:8000/blog/我们应该会看到以下内容:
我们可以进一步编辑博客主页的内容。让我们引用我最喜欢的小说之一,戴维·福斯特·华莱士的《无限玩笑》:
from django.shortcuts import render
from django.http import HttpResponsedef home(request):
return HttpResponse('<h1>Blog Home</h1><p1>Everybody is identical in their secret unspoken belief that way deep down they are different from everyone else.</p1>')
我们还将为我们的博客添加一个关于页面。在“views.py”模块中,让我们定义一个名为“about”的函数:
from django.shortcuts import render
from django.http import HttpResponsedef home(request):
return HttpResponse('<h1>Blog Home</h1><p1>Everybody is identical in their secret unspoken belief that way deep down they are different from everyone else.</p1>')def about(request):
return HttpResponse('<h1>About Home</h1>')
现在,让我们在博客应用程序的“urls.py”模块中为“关于”部分添加一个新路径:
from django.urls import path
from . import viewsurlpatterns = [
path('', views.home, name='blog-home'),
path('about/', views.about, name='blog-about')
]
现在如果我们去http://127 . 0 . 0 . 1:8000/blog/about我们应该会看到:
我将在这里停下来,但是您可以随意摆弄博客主页的内容以及我们的 web 应用程序的各个部分。此外,了解 Django 的一个很好的资源是科里·斯查费的 YouTube 教程,你可以在这里找到。
结论
总之,在这篇文章中,我们讨论了如何使用 Django 构建 web 应用程序和定义 url 路由。首先,我们讨论了用 Django 创建新的 web 应用程序时生成的特定文件。然后,我们在项目中创建了一个博客应用程序,并定义了视图函数,这允许我们指定用户看到的内容。我们还展示了如何在我们的博客应用程序中添加额外的 url 路由和视图。我希望你觉得这篇文章有用/有趣。感谢您的阅读!
Web 自动化噩梦:克服它们的 6 个技巧
当硒和美丽的食物不够的时候。
当我第一次发现 Python 的一些网络抓取库时,真是梦想成真。想想一个人能做的所有事情!可能性是无限的。不用说,当我想刮的那几页纸直接从地狱出来时,我的希望破灭了。
当你开始怀疑如果你自己动手,这个过程会不会更快时,你知道你遇到了一个真正的障碍。
经过几个小时的搜索 StackOverflow,以下是我在开始自动化我的 web 流程时克服一些挑战的 6 个简单方法:
1.从 Selenium 导入例外
**问题:**有时候你想定位的按钮可能会被隐藏,可能是因为讨厌的弹出窗口。当您无法确定这些弹出窗口何时会弹出时,这就变得更加令人恼火了。而在其他时候,您的问题可能是由于互联网连接速度慢造成的…
**解决方案:**顺利抓取网页的道路布满了例外——并学习如何处理它们!每当发生这些异常时,知道自己有一个备份计划总是很方便的。首先导入它们:
from selenium.common.exceptions import NoSuchElementExceptionfrom selenium.common.exceptions import StaleElementReferenceExceptionfrom selenium.common.exceptions import ElementClickInterceptedExceptionfrom selenium.common.exceptions import ElementNotInteractableException
然后用 try/except 块解决可能出现的问题!
2.让您的浏览器等待
回到上一个问题:假设一个缓慢的互联网连接导致了 NoSuchElementException。上面提到的一种方法是使用 try/except 块让您的脚本等待 10 秒钟:
try:
button = driver.find_element_by_id('button-id')
button.click()except NoSuchElementException:
sleep(10)
button = driver.find_element_by_id('button-id')
button.click()
这很棒,而且很可能解决了问题(如果没有,那么你真的需要考虑修理那个路由器),但是这意味着每次你想点击那个按钮的时候都必须等待整整 10 秒钟。
**解决方法:**换个更优雅的方式怎么样?使用 WebDriverWait,并将按钮的可见性指定为条件!一旦找到按钮,你的浏览器就会停止等待,允许你点击它。每当你想找到一个按钮时,这可以节省你宝贵的时间:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECbutton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, 'insert_button_xpath_here')))
3.用 Javascript 输入文本
**问题:**现在你正在填写一张表格,然后你意识到 Selenium 的send_keys()
选项是有帮助的,但是帮助不够快。当然,它能以最快的速度打字,但是你很快就会怀疑自己复制粘贴是否真的会更快。当你看到你的一大段文字在页面上一行一行慢慢串起来时,自我怀疑就开始了。
**解决方案:**通过执行脚本输入文本!这要容易得多,也不需要导入。
text = text.replace('\n', '\\n')script='''document.getElementById("source").value='{}';'''.format(text)driver.execute_script(script)
现在,您的文本值立即被设置,文本几乎立即出现在表单中!请注意,您应该首先在新行前面添加一个额外的反斜杠’ \ ',否则它将不起作用。如果您使用大量文本,这尤其有用。
另外,我唯一一次遇到这个问题是在输入外语时(在这种情况下,它不起作用)。如果有人找到了更好的解决方法,请告诉我!
4.使用动作链点击
**问题:**一些网站的格式很糟糕,或者找到一些带有 id(或任何其他属性)的按钮似乎无法工作。
解决方法:在这种令人沮丧的情况下,不要惊慌!有其他方法可以解决这个问题。首先问问自己: 什么是工作?也许我们可以利用这一点。
在之前类似这样的体验中,我首先找到了我知道我肯定能识别的按钮,然后弄清楚了我想点击的按钮的相对位置,但却不能这样做。
因为有了 ActionChains,你可以先找到一个工作按钮,然后通过选择的坐标偏移点击来点击屏幕上的任何地方!这在大多数情况下工作得很漂亮,但是找到坐标是关键的一步。
from selenium.webdriver.common.action_chains import ActionChainsac = ActionChains(driver)ac.move_to_element(driver.find_element_by_id('insert_id_here').move_by_offset(x,y).click().perform()
现在你可以点击屏幕上的任何地方!
5.做人,随机应变
**问题:**最后,事情进展顺利,你收集了所有你需要的信息…直到你找到验证码。
**解决方法:**负责任的刮!在操作之间引入随机等待时间,以防止服务器过载。更重要的是,它可以防止你的脚本的重复模式被发现。
from time import sleep
import randomsleepTimes = [2.1, 2.8, 3.2]
sleep(random.choice(sleepTimes))
6.最后,确保您的数据得到备份
**问题:**我一开始犯的一个新手错误就是没有引入备份选项,以防我的抓取在中途随机失败(有我的互联网中途断网的可能)。我只是在脚本的结尾将我收集的数据保存到一个文件中。这是个大错误。
**解决方案:**备份数据有很多种方法。一些对我有用的方法:
- 将我的数据的每个“条目”保存到一个 JSON 文件(或任何其他方便的格式)。这让我放心,因为我知道我的脚本运行的每个循环/页面都保存在我的计算机上的某个地方,如果有任何失败,我仍然有我的数据。这也是节省计算机内存的好方法。
- 将循环放在一个 try/except 块中,如果出现任何问题,它会将我的所有数据保存到一个文件中。
布伦特兰博的 Gif
成功了!
这些只是除了简单的 BeautifulSoup 和 Selenium 库之外,您可以使用的许多技巧中的一部分。
我希望这有所帮助,感谢您的阅读!