给我讲个故事:关于模型可解释性的思考
最近,我的思考围绕着感觉像是机器学习的一些最大的元对话:学习一个普遍智能的演员的潜力和局限性,算法公平性的细微差别和真正的规范挑战,以及现在,模型对人类来说是可解释和可理解的意味着什么。
随着思想市场被越来越多的---复杂架构充斥,似乎在所有这些层的重压下摇摇欲坠,呼吁可解释机器学习的声音越来越大。NIPS 在过去两年里主办了一个关于这个主题的研讨会,DARPA 正在资助一个可解释的人工智能项目,欧洲许多国家都在争先恐后地应对欧盟的新要求,即模型做出的任何“重大决定”都必须向用户解释。
Oh no! I think that heatmap of pixel importances is in the shape of a Grim
我发现这些争论通常分为三大类。
- 对模型稳定性的担心,以及检查脆弱或不正确的概括的愿望:这种心态主要是担心,在缺乏对模型决策进行反思的能力的情况下,它可能会以最终不适当的方式拾取模式。这方面的一个常见例子是一个模型,该模型了解到哮喘患者的死亡率较低,因为医院的政策是总是将这些患者紧急送入重症监护。当模型被用在关键场景中时,这种检查为什么模型知道它拥有什么的“原因”的能力是至关重要的。事实也是如此,因为这种模型经常由熟练的专业人员实施,他们对部署一个他们认为无法担保的系统感到不舒服。
- **希望可以从这些模型中提炼出新的知识:以给人类新的概念洞察力的方式:**这主要是你从应用科学中使用机器学习的人那里听到的观点。在这里,可解释性被视为一种强大的附加值,因为如果我们可以将这些机器抽象转化为人类有意义的概念,我们就可以将这些概念编织到我们现有的知识网中,并使用它来推动更多的研究。
- 一种对我们所做的决定进行逻辑论证的权利感:这种感觉有点难以解释,但确实有一些情感上的显著性。这与关于机器偏见的争论有关,的确,许多从这个角度争论的人担心黑盒内的模型以我们社会认定不恰当的方式使用信息。但是,我认为这里有一个更广泛的公平概念:一个人应该能够在做出决定时要求理由的信念——贷款,缓刑听证会。当有人给你理由的时候,你可以抓住这些理由,潜在地反驳它们。当一个模型给了你一个不可接受的、不透明的决定时,我可以理解当你不能“为自己辩护”(如果有正当理由的话)反对所使用的逻辑时,你会有一种专制的感觉
为什么复杂性会降低可解释性?
冒着听起来迂腐的风险,为什么 ResNet 是不可解释的?它缺少什么根本素质?这个系统是一个完全确定的系统,一旦训练完毕,你就可以写出方程,将模型中的每一个量与其他量联系起来。我觉得这里根本缺失的一块,跟模型的缺点关系不大,跟人类认知的缺点关系更大。当我们“思考”时,我们需要有意义的概念作为思考的单位,我们通常需要抽象和概括这些概念——有些压缩——以便它们易于处理。给某人一个叙述化的散文解释与给他们三个充满重量的矩阵会导致非常不同层次的可解释性,因为我们不可能一次将这些矩阵中包含的信息保存在我们的大脑中。这激发了我认为可解释性中的一个关键思想:复杂模型的可解释表示几乎总是它的压缩表示。
这一概念,即概念在真正的可解释性中的必要性,提供了一个视角来解释为什么我们经常发现深度学习模型特别难“搜索”。当然,这部分归因于模型本身的架构。但我也认为,问题的一部分是深度学习在历史上对非常原始的输入数据最有效。作为对比,当您将经济普查数据作为输入要素时,根据定义,每个要素都代表一个对人类有意义的概念,因为因果链的方向是正在计算的要素,因为人类认为计算它是有意义和有价值的。对于非常原始的输入数据,您会遇到单个输入变量(在本例中为像素值)与概念不相关的问题;无论模型在多大程度上使用了更高层次的抽象,它们都是完全习得的抽象,而不是由人类输入系统的。每当有人执行神经元或层可视化时,你都会看到这种对意义的争夺,我们不可避免地试图附加人类概念——这一个是寻找眼睛,这一个是建筑物等——即使在某种程度上,我们知道期望机器抽象巧妙地嫁接到人类思想上有点被误导了。
有哪几种可解释性?
当阅读一篇旨在解决模型可解释性问题的论文——LIME、Shapley 值、神经元可视化等——时,我发现将其分为几类是很有用的
**特性属性与内部逻辑:**对我来说,最有意义的区别是试图给特性赋值的方法和试图阐明模型实际内部工作的方法。沙普利值和石灰是前者的例子。他们的主要目标是将模型的行为投射回一组输入要素(或人类创建的替代输入要素),以某种方式为那些在模型的所有曲折过程中具有更大影响的要素分配更多权重。相比之下,层模板可视化等方法属于后一类:试图理解模型在达到最终答案的过程中创建的中间抽象。虽然在某种意义上他们都在追求“可解释性”,但我认为更广泛地为这些不同的可解释性子目标采用某种清晰的名称是有价值的。
**通过模拟获得的知识与通过内省获得的知识:**第二个更微妙的区别与给定的可解释性方法的目标无关,而是它用来得出答案的技术。基于模拟的知识意味着,我们通过生成某种形式的模拟数据,捕捉模型在这些数据点上的表现,并将其作为您的理解,来获得对模型的理解。这与上述轴的方向略有不同,因为 LIME(在本地模拟数据样本,也使用本地内核)和神经元可视化(在数字上优化像素,以将内部状态推至高激活值)都属于这个等式的“模拟”侧。相比之下,通过内省获得的知识来自于获取模型的固定方面,并使用它们来获得知识,而不必进行这种模拟。第二种类型的一些示例是线性模型中的基本特征重要性(其中线性和固定项数意味着您可以通过分析计算 FI),以及随机森林总体中的基尼系数减少特征重要性,因为这两者都只是训练模型的属性。不过,总的来说,我认为后一类方法不太适用于更复杂的模型,因此大多数较新的论文属于前一类。
构建一个我们并不完全理解的系统的想法——暗示着可能无法完全控制——基本上是傲慢的同义词,这是最近对复杂模型的建模者经常提出的指控。而且,虽然这种对人类可以理解的解释的渴望偶尔会从技术角度感到沮丧和勒德派风格,但我确实认为有令人信服的原因——最突出的是关于采用信任和测试内部表示的脆弱性——为什么这仍然是一个富有成效的研究领域。我的一个抱怨是,我认为我们把一系列期望的目标和潜在的动机混为一谈,这使得我们在这个问题上的讨论更加模糊不清。
区分人工智能和人类#1:人类 VS 人形机器人
ALife 2018 conference, © Lana Sinapayen
在一个视频中,人们认为一个人实际上是一个超现实的机器人,受此启发,我决定写一篇关于如何识别人形机器人的文章。这里有几个小技巧!
在花了这么多时间研究 Alter Android 和各种超现实机器人之后,我对你面对的是一个机器人而不是一个人的迹象略知一二。上面的视频是一个人类。这是机器人圣坛,由石黑浩实验室建造,由我的博士实验室 T2 池上实验室编程。
我们还远远不能制造出真正像人类一样的机器人;目前的技术还没有先进到足以愚弄一个 6 岁的孩子,让他认为机器人实际上是一个人。有趣的是,目前存在的动作最流畅、最无缝的机器人看起来一点也不像人类:它们要么是制造你的汽车的工厂机器人,要么是著名但非常像机器人的波士顿动力公司的生物。如果你认为一个机器人看起来像人类,它很可能是人类。在寻找下一个“非凡机器人”视频吗?这里有 6 点需要记住。
1.不要相信图片,找视频。看看机器人的皮肤,尤其是脖子。机器人皮肤扭曲不良,做 flappy 包。
2.注意关节。在上面的视频中,女子整个手臂都在摆动,而不仅仅是肘部以下的部分。机器人真正一次移动一个关节的能力暴露了他们。
3.寻找未完成的动作。她开始半眨眼。机器人的动作缓慢而谨慎。他们在光速下不会眨眼。
4.眼皮。机器人的眼睑通常是硬塑料。它们需要滑入眼睛的顶部。你总会在那里看到一条深深的线。
5.反射运动。她把注意力集中在摄影师以外的东西上。她有很多不自觉的眼跳。
6.最后,寻找完美。没有机器人能如此好地聚焦在它们面前的物体上。没有人能笑出美丽的笑容(即使是假笑)。
回到圣坛。再看一遍那个视频:Alter 有柔软的眼睑,但是看看他脖子的皮肤,他的手腕和肘部的运动。当然,Alter 是为了展示它的框架和机械部件而建造的……但是当你看到任何一个石黑实验室机器人时,请记住这个建议。
区分人工智能和人类#2:照片与 GAN 生成的图像
如果你错过了这个系列的第一集,人类对机器人在这里。
受生成性对抗网络(GAN)的推动,一年前我在推特上发了一条关于区分相机拍摄的图片和生成的图片的帖子。这里是该线程的更新版本。我的一些建议仍然适用。谁知道会持续多久?趁热吃吧。
自第一篇 GAN 论文发表以来的几年中,已经有了许多进展,导致了越来越好的“假”图像。GANs 是在成千上万张真实图片上训练的神经网络,目的是产生完全虚构但看起来像真实图片的图像。
不完全是人类。
我们的贝恩斯特别擅长识别人脸,这是你最有机会发现一个甘的类别。请记住,下一次播放紧张的音乐时,你必须选择哪个是你最好的朋友,哪个是邪恶的替身。
寻找透视问题:眼睛看向不同的方向,眼睛向前看,但脸转向一侧,或者在这种情况下,毕加索对称性:我们不应该看到那个人的左耳…
化妆的女性有时更容易发现对称问题。只有一只眼睛画了眼影,眉毛的形状也各不相同……当然,下面的女性有更紧迫的问题,但她们也有非常原始的妆容——一只熊猫眼,一条缺失的眉毛,不同颜色的眼睑↓
即使是最新的 GANs 仍然很难处理这些问题。
可疑的模糊。
旧的网络往往在帧的四个角有强烈的失真,导致奇怪的模糊世界。对于较新的网络来说,这不是问题,但模糊性以不同的方式表现出来:GANs 最典型的特征,即从一个图像平滑地变换到另一个图像的能力,也是它们的弱点。
暂停在上面 gif 的任何地方。你能说出脸和头发从哪里开始,到哪里结束吗?通常他们只是融入到另一个人的头发或脸上。跟随物体的轮廓,检查是否一切都像它应该的那样清晰,如果部分没有融入其他部分。
有时是…一些不同的东西。
Oh no
外星剧本。
詹妮尔·谢恩说对了,甘斯不会写。他们得到了文字在标签上,数字在钟面上的概念,但有些东西不太对。下面的图片来自与上面相同的论文。
The price of gas will drive you nuts
My favorite brand of not-quite-round golf balls.
无关的一切。
甘斯不会数数。最多两个就可以了:两只眼睛,两只手…除此之外,所有的赌注都取消了!
这个帖子很棒,我邀请你阅读每一条推文。
高分辨率图像。
这一点源于一个非常基本的事实:在计算机上运行 GAN 算法是一件痛苦的事情。它们需要特定的硬件,并且需要几天时间在数据集上进行训练。他们天生贪吃计算时间和资源,因此通常被训练生成小的、低分辨率的图像。如果图像小而模糊,也更容易蒙骗人眼。如果你觉得活泼,常见的尺寸从 64x64 到 256x256 像素不等;有时更多一点。
— —
我希望你对识别假货感觉好些——在大多数情况下,photoshop 仍然比 GANs 更令人担忧。但是甘更有趣!这只蜘蛛同意了。
区分人工智能和人类#3:文本和幽默
如果你错过了这个系列的前几个装置,在这里了解一下人类和机器人的区别和照片和生成的图像。
在本帖中,我们攻击自动生成输出的最古老的形式之一:文本。对许多人工智能研究人员来说,给计算机编程以生成类似人类的文本是一个圣杯,这不仅是因为图灵测试,还因为围绕语言存在的神秘性。包括科学家在内的许多人都喜欢用近乎宗教的术语来看待语言——在你所选择的上帝的创造物中,语言会让人类“凌驾”于其他生物之上,这是一种神秘而神奇的东西,让我们变得特别(因此更优越,这是逻辑)。想象一下,如果你能创造一个会说话的机器人,你会变成什么样!
无论你是在寻找让你比你的宠物狗更好的东西,还是对语言本身感兴趣,文本生成算法都是无尽的乐趣。目前没有算法可以理解人类的话(不,甚至谷歌机器翻译。尤其不是谷歌机器翻译!).目前没有算法有足够的真实世界的经验来知道字母“椅子”应该是什么。最好的语言处理算法是那些可以计算诸如“R 完成 CHAI 序列而不是 O 完成相同序列的可能性有多大?在法语文本中,CHAISE 翻译的字母 CHAIR 的频率是多少?”。这是一个非常不同的过程,当你读到“椅子”这个词时,你会立即想到椅子是什么样子,以及它是如何使用的。
知道算法不理解意义是你需要辨别一段文本是由机器人还是由人类生成的最重要的事情。人类可能会犯错误,但它们是人类的错误:句法、语法……计算机错误是意义上的错误。这正是它们如此有趣的原因。让我们转向我最喜欢的神经网络幽默来源:詹妮尔·谢恩。
詹妮尔·谢恩用她能找到的任何有趣的数据来训练网络。以下是生成的 cookie 配方的示例:
我觉得很精彩!也是剖析典型神经网络错误的绝佳例子。
- 重复:这里使用的特定模型具有短暂的记忆。这意味着它不跟踪它以前写的超过几个单词或几行的东西。它会经常重复自己。毕竟,如果它知道“一杯糖”在食谱中出现的概率很高,并且记忆短暂,它就没有办法理解食谱中没有 6 杯糖,也没有办法跟踪它已经写了多少杯。它还会忘记在食谱中使用所有这些杯子。
- 忘记标点符号:网络可能很难学习跨越长时间尺度的关系。例如,括号需要在打开后的某个地方关闭。这比短期规则难学多了,比如“一个大写字母紧跟在句号之后!”所以最后你会看到永久的左括号、引号等等。
- 混淆的标点符号:在普通文本中,大写字母出现在句号之后,但有时也会出现在句子中间:地名或人名。有时候大写字母在名字中间!但是网络无法理解普通单词和名字之间的区别。都是字母。所以它会随机放置大写字母,因为从统计上来说,你时不时需要一个大写字母…
- 最明显的迹象表明你正在和一个网络打交道。大多数时候,一个训练有素的网络会使用现有的单词。但是,接受过字母训练的网络对“单词”没有很好的概念。是一组字母,周围有两个空格吗?好吧,那“Mapkamares”怎么样?我看不错!一些网络从一开始就接受完整单词的训练。给他们一个单词列表,以及只包含这些单词的文本。这些网络无法组成随机的单词,但它们仍然会在意义和标点符号上挣扎。
这里还有两个来自我自己的机器人的例子。第一个是纽约餐馆菜单的培训:
注意重复、随机大写和左括号。巧克力片肉汁和外套。
第二个是我在自己的推特档案上训练的机器人:
文字还可以,但是意思就是有点太奇怪了,不像真的。与这个“我强迫了一个机器人…”迷因相比。
这可能是人类的幽默,但不是神经网络幽默。剧情太一致,意思太平实,大写太对,语法太完美。幽默来自对意义的高度理解。很难像机器人一样写作,正是因为机器人远非人类。
完全披露:我对这种喜剧有两个理由。首先,人类以一种不明显虚假的方式伪装成机器人伤害了我的研究领域。大多数人根本不知道这些是人类写的,也不知道有什么先进的算法可以产生这种类似人类的幽默。他们告诉我,“你见过这个机器人吗?太搞笑了!”或者“我不确定这是不是真的,你怎么看?”任何混淆计算机能做什么和不能做什么的东西对我的领域来说都是一种威胁。人们提高了他们的期望,并将算法视为银弹,一个可以在眨眼之间做任何事情的魔盒。当有人真的制造出一个具有人类幽默的机器人时,谁会理解其中的含义呢?当外行人期望高水平的输出在我们的能力范围之内时,谁来解释为什么最先进的输出看起来像是乱码垃圾?第二个问题:如果你说“这是我写的”时,你的喜剧并不好笑,如果整个机器人的事情是人们发笑的唯一原因,也许它一开始就没那么好笑。
让我们来看一个更难的例子:
这让我哭笑不得,当它第一次出现。然而,这个场景的时间线是不是有点太一致了,标点符号是不是太好了?
Botnik 工作室有一种不同的生成文本的方法。是的,在某个地方涉及到了算法,但它是一个人写的文本。电脑只是提出建议,就像你手机的自动更正功能;但最终,是人来决定写什么。你可以在https://botnik.org/apps/试试(可惜经常宕机)。
那么,我怎么知道其中涉及到一个算法呢?可能需要一些训练来确定你的判断,但是如果你发现自己不断地问“我错过了什么吗?”,想知道为什么事情会发生,或者必须使用大量的想象力来使场景工作,这是一个很好的机会,你正在阅读算法的散文。这就是神经网络幽默的核心:当文字实事求是地在你的脑海中创造出一个极其荒谬的场景时,当大多数喜剧作品不是由文本而是由你的大脑生成的图像完成时,这就是你知道你有一个神经网络来感谢这些笑声的时候。
我给你留下三个链接供你欣赏。遇见 inspirobot 及其励志名言:
Inspirobot 在美国生活中亮相。
看一部科幻电影,其中每个人都尽了最大努力来遵循机器人编写的场景:
并在 J anelle Shane 的博客上找到真正的神经网络幽默的无穷乐趣。
用数据讲故事是新的商业智慧
每隔几个月,我就会把它转寄过去,作为一名导师,与“女性无限”的一群了不起的女性一起工作。如果你不熟悉这个组织,你应该去看看(【https://www.women-unlimited.com】T2)我很幸运地成为了“领导”项目的毕业生,它对我今天的领导技能产生了重大影响。
上周,我们像往常一样讨论了商业头脑。我喜欢这一点,因为我知道确保我们辅导的女性能够陈述清晰的业务案例并有效地使用业务语言是多么重要。他们还需要能够回答棘手的问题,并获得在工作中取得成功所需的资金和赞助。
这次会议真的让我思考商业敏锐度的技巧以及它是如何在这些年里发展的。
我曾经认为,如果我能有效地阅读资产负债表,我会成为一名更好的女商人。我真的认为那些为我们的业务构建和管理这些的财务人员是不可思议的。(好吧,我仍然有点认为他们是)。
但是今天,事情发生了变化。资产负债表只是数据点,除非你能围绕这些数据讲述一个故事,让它变得生动,给它一个视角——这只不过是报告数字而已。
对于大多数公司来说,财务团队对业务有很大的影响力,为什么呢?他们有关于这个行业的所有数据。
但他们真的会吗?
收入并不总是说明全部情况,在那次会议上,我真的受到了打击。我相信今天最有商业头脑的是那些能拿数据(比如营收)、能搜索其他数据点 并讲故事的人。
是的,编制资产负债表的人当然非常聪明,但他们能站起来讲一个关于公司整体健康和前景的故事吗?他们能谈论增长和采用吗?也许,如果他们拥有用数据讲故事的神奇技能。
另一个有趣的事实是我的朋友大卫·麦吉森在 CDO 峰会上谈到的一个趋势。这是他实际上正在跟踪的一个趋势。几位首席数据和数字官将被任命为首席执行官,并在他们的公司中担任最高职位。事实上,每年都越来越多。仔细想想这是个有趣的趋势。这些角色取决于他们用数据讲述故事的能力,很明显,这对于那些高层领导来说是非常重要的。
我相信,CDO 们正在让首席财务官们为了钱去争第一。
这些新领导者的秘密武器很简单——利用#数据和#分析。他们所做的一切都是由数据驱动的,结果是用数据衡量和验证的。一切都是关于数据和分析,并利用这些来讲述故事、交流和真正了解他们的客户。
你可能会问自己——除了收入,还有哪些数据点真正重要?好吧,让我们稍微探索一下……
对于许多以客户为中心和数据驱动的公司来说,NPS 正迅速成为一个关键数据点。事实上,NPS 可以讲述一个比资产负债表更具前瞻性的故事。对于 IBM Analytics 的我们来说,它以我们从未预见到的方式改变了我们。我们每天都更加了解客户的挑战和成功。是的,我说每天。我们每天都做出反应,更快地解决问题,获得惊人的反馈,更快地取悦客户。NPS 以一种资产负债表永远做不到的方式影响了我们如何制造产品、支持产品、走向市场和与客户打交道。
“积极使用”是另一个有趣的衡量标准。如果你的目标是让你的产品对客户来说是必不可少的,那就用他们使用你的产品的多少来衡量。想想脸书,他们的目标是用户数量以及我们每个人在脸书上花费的时间。他们所做的一切都是为了实现这些目标——包括那些令人疯狂上瘾的游戏,迫使你登录才能玩(还记得黑手党战争和那个疯狂的农场游戏吗?).不用说,它奏效了,现在大多数人都把时间花在了脸书身上。现在,如果脸书仅仅关注收入,他们可能不会达到这个目标。我相信如果你有一个积极使用的好基线,你监控它,发展它,真正倾听它告诉你什么-那么收入就会随之而来。
嘿,我们生活在“大数据时代”,我们不缺乏数据,如果你想成功,就使用这些数据,让它对你说话,告诉你公司内部的故事,告诉你的股东和风投。我们的董事长在这方面做得非常出色,她是如何领导 IBM 转型的。我认为这是一项重要的领导技能。
是的,对我来说,用数据讲故事是新的商业智慧,他们说“讲故事的人统治世界。我相信他们!
你怎么想呢?
临时表与变量表— SQL 数据准备
Image by Markus Spiske on unsplash.com
数据科学的很大一部分是数据准备,确保我们使用的数字是有效的,格式是正确的,并且能够有效地准备和访问。我花了大量时间在 SQL 上,从许多来源收集数据,并将它们从堆积的表中汇集到可访问的数据立方体中,这些立方体是自动准备的,具有引用完整性,并且在几秒钟而不是几小时内运行!我遇到和读到的一个概念是临时表和变量表。我认为总结我发现的一些要点是值得的,希望对你们有些人有帮助!
作为一名商业智能顾问,我的主要工作是与公司合作,继承他们现有的程序/视图/工作,然后对其进行逆向工程,以改善处理时间、数据准确性和故障率。有时小的变化可以带来巨大的好处,所以理解 SQL 的一些核心概念是如何真正工作的是非常宝贵的,即使你的重点是高级分析和机器学习。
继续吧!
如果你花了很多时间使用 SQL 和阅读其他人的代码(如果你自己没有使用过的话),那么临时表和变量表是名称前面分别带有#和@符号的表。这两个选项都允许您像存储存在于任何一个数据库中的永久表一样存储数据。下面列出了每种方法的一个例子。
-- This is a variable tabledeclare @VariableTable as table([ID] int,[Name] varchar(100),[Description] varchar(500))-- and this is a temporary tableCREATE TABLE #TemporaryTable([ID] int,[Name] varchar(100),[Description] varchar(500))
现在我们有了两个表,insert 语句可以用来填充这两个表。
INSERT INTO @VariableTableSELECT [ID], [Name], [Description]FROM [PermanentTable]INSERT INTO #TemporaryTableSELECT [ID], [Name], [Description]FROM [PermanentTable]
到目前为止,它们都很容易创建和填充。现在是有趣的部分了…它们有什么不同。
坚持
首先,变量表只存在于正在运行的批处理中,一旦查询执行完毕,数据就消失了。然而,临时表是“持久的”,这意味着在运行查询后,您可以检查表中的数据。这在调试复杂过程时非常有用,因为您可以运行查询,如果它没有返回您期望的结果,您可以查看任何/所有临时表中的数据,看看哪里出错了。
数据量
可变表仅设计用于保存少量数据。另一天的概念涉及执行计划,例如,存储过程用来优化查询的性能。SQL 中的执行计划假设一个变量表有一行数据,而它们通常用于存储数万行数据。这可能导致低效的计划和不必要的长时间运行。
分度
就其本身而言,临时表和变量表对于各种任务(插入、更新和删除等)具有不同的性能水平,但是一个关键的性能差异是向临时表添加索引的能力。这对于变量表是不可能的,这意味着任何时候你从变量表中访问数据,它都存在于一个“堆”中。
索引的工作方式就像你在图书馆遇到的索引一样。你的选择(除了问图书管理员)是走到最近的书架前,开始阅读书名,直到你找到你要找的书,或者你可以使用目录。目录会给你一个与书的位置相对应的号码,这样你就可以走到一个特定的书架,并且(希望)在找到你要找的书之前只浏览几本书。SQL 以同样的方式运行,如果数据存在于一个堆中,SQL 将简单地从数据的顶部开始运行,直到找到相应的记录。如果有索引,它将跳转到您所在的行所在的数据部分,这大大减少了它需要读取的行数。下面是对[ID]列的简单索引的示例。
--example index statement
create index idx_temp on #TemporaryTable ([ID])
索引是一个巨大的主题,非常值得花时间去研究。它们带来了额外的开销,但是根据我的经验,从表中选择数据的好处要大得多。
对于感兴趣的人来说,一些有用的主题包括堆和聚集表、表扫描和查找以及聚集和非聚集索引。对这些有一个坚实的理解将极大地提高您的数据库的性能!
我更喜欢哪个
尽管变量表有它的好处,特别是对于少量的数据,我通常坚持使用临时表,因为我发现它们更有用。持久性差异意味着当您完成时应该‘丢弃’(删除)表,这与变量表相比是一个额外的步骤。在这一点上,我仍然喜欢花额外的时间来准备我的代码,因为我知道最后的过程会更有效。
当我开发一个新的过程时,有时我会忘记在重新运行之前删除临时表,这会导致执行失败。如前所述,需要先删除该表,然后才能重新创建它。通常,我会在临时表上方添加一条语句,该语句会删除该表(如果它存在)并重新创建它。这省去了执行失败的麻烦,但保留了其他好处。下面是这个“check”语句和“drop”语句的例子。
--Example 'check' statement
IF OBJECT_ID('tempdb..#TemporaryTable') IS NOT NULL DROP TABLE #TemporaryTable--Example 'drop' statement
drop table #TemporaryTable
希望这是有用的。这绝不是详尽无遗的,我相信你们中的许多人会有更多的细节来补充这个话题。我期待着阅读您的回复!
基于递归神经网络的温度预测
试图预测未来一直是男人的遐想。当我们看到达伦·阿罗诺夫斯基导演的电影《圆周率》中的数学家伙陷入混乱时,这似乎是一个非常糟糕的主意;也就是说,直到递归神经网络来拯救。
Max analyzing the stock market
值得庆幸的是,与股票市场相反,季节性气候条件遵循一种自然模式。这里我们讨论一个可能解决 Max 问题的潜在工具;或者可能没有,因为它没有提供关于数字圆周率的神圣属性的线索,这是一个在电影中从未得到充分解释的谜。
传统的神经网络受到消失梯度问题的困扰;也就是说,灵敏度随时间呈指数衰减。对于从连续的时间相关数据中收集重要性来说,这是个坏消息。为了解决这个问题,你可以使用 LTSM,或 GRU,或类似的神经网络衍生工具,利用长期的依赖关系来保持头脑中的大画面。
每小时记录 14 个不同的量(包括气温、气压和湿度)。原始数据可以追溯到 2003 年,但我们为这次比赛使用了一个子集,从 2009 年到 2016 年(含)。这本质上是一个多变量回归分析,因此变量之间的相关性很重要,为此我使用 Seaborn 来制作一个热图,以便简单地可视化。似乎大多数都是高度负相关或正相关,这使得预测模型有效。
Correlation heat map
然后,数据被分割成 24 小时窗口,然后根据预先指定的日期和时间进行解析,以创建训练和测试集。后来,标签的大小变得有点短,所以我将开头连接到结尾,以匹配训练集的大小,因为温度是及时的,这种方法匹配自然会发生的事情。我们必须记住将变量调整到 0 和 1 之间,以便它们一致地适合回归模型。需要从 2D 到 3D 的矢量整形,因为循环网络想要知道它工作的时间范围,在这种情况下是 24 小时。
我决定在最后的神经网络架构中使用 3 个卷积层,然后是 3 个 GRU 单元,然后是一个密集层。GRU 是一种时间敏感架构,使用更新门和复位门。决定应该输出什么信息的两个向量。他们可以被训练保留很久以前的信息,而不会随着时间的推移而稀释。更新门决定保留多少过去,重置门决定遗忘多少过去。
GRU cell
这种架构从头到尾都有 0.25 的压降,因为我发现否则它会由于捕捉的细节量而很快过度拟合。最终密集(分类)层的激活函数必须是“线性”函数,因为这本质上是复杂的线性回归。
在编译和运行模型之后,模型是如何随着时间的推移而改进的:
Loss over time
它相对较快地收敛到大约 0.02。总的来说,这是一次相当成功的实验。
试图预测未来是个好主意吗?似乎没有对黄金比例的神圣理解,或者其他超自然的洞察力,预测永远不会是 100%,特别是对于像股票市场这样的人造系统,尽管马克斯可能不同意。值得庆幸的是,自然是比较一致的。出于实用目的,这个模型对于捕捉天气模式中的异常、捕捉黑天鹅事件(如极端天气事件)非常有用。
人工智能在金融科技中的十大应用
几周前,我作为 Swish 的机器学习负责人,参加了 Fintech 论坛(蒙特利尔)。
在两场讲座和精彩的讨论之间,我举办了一场研讨会,讨论人工智能在金融科技行业的应用。
如果你参加了研讨会并想要更多,下面是一个更长的版本,有例子和技术解释。如果你没有机会参加这个研讨会,这个分析将为你提供你应该知道的关于金融行业人工智能的一切。
Fintech?
金融业以极大的兴趣关注着技术进步。摩根大通等大银行是区块链等颠覆性技术的早期采用者。
人工智能(AI)是一种范式转换技术,它正在无缝改变我们的生活、移动、互动和购物方式。金融也不例外,行业才刚刚开始见顶的冰山一角。
金融科技(Fin-tech)是对金融行业尖端技术使用案例的称呼。
在本文中,我们将介绍人工智能的十个应用,以及这项技术的一个细分领域,即金融科技中的机器学习。
个人金融和保险人工智能
#1.数字金融蔻驰/顾问
交易型机器人是人工智能中最受欢迎的用例之一,可能是因为应用的范围如此广泛——跨越所有行业,在几个层面上。
在金融领域,交易机器人可以用来为用户提供金融辅导/建议服务。
把它们想象成帮助用户管理财务计划、储蓄和消费的数字助手。这种服务增加了用户参与度,并改善了用户对他们正在交互的金融产品的整体体验。
数字助理可以使用自然语言处理 (NLP)来构建,这是一种机器学习模型,可以处理人类语言格式的数据。可以添加产品推荐模型层,允许助理基于算法和人类用户之间发生的交易来推荐产品/服务。
Sun Life 已经部署了这种应用程序的一个例子,它创建了一个虚拟助理 Ella T1,通过允许用户掌握自己的保险计划来帮助他们获得福利和养老金。该助理根据用户数据向用户发送提醒,如“健康福利即将到期”或“您的孩子将很快失去福利”
数字助理还可以用于其他与金融相关的场景:股息管理、定期寿险续期、交易限额临近或支票兑现通知。
#2.交易搜索和可视化
聊天机器人也可以用于银行业,专注于搜索任务。
管理人员向 bot 提供对用户交易数据(银行交易)的访问,它使用 NLP 来检测用户发送的请求的含义(搜索查询)。请求可能涉及余额查询、消费习惯、一般账户信息等等。然后,机器人处理请求并显示结果。
美国银行使用这样一个机器人(名为艾丽卡)作为他们客户群的数字金融助理。人工智能机器人很快被采用——三个月内有一百万用户。
该机器人提供用户友好的交易搜索,使用户能够在他们的历史数据中搜索与特定商家的特定交易,避免他们在每个银行对账单中查找这些交易的麻烦。该机器人还计算信用和债务总额,这是一项用户必须自己在计算器上完成的任务。
#3.客户风险概况
银行和保险公司工作的一个关键部分是根据客户的风险评分对他们进行分析。
人工智能是一个很好的工具,因为它可以根据客户的风险状况从低到高自动对客户进行分类。
在分类工作的基础上,顾问可以决定为每个风险状况关联金融产品,并以自动化的方式向客户提供这些产品(产品推荐)。
对于此用例,分类模型,如 XGBoost 或人工神经网络 (ANN)根据历史客户数据和顾问提供的预标记数据进行训练,这消除了数据引起的偏差。
#4.核保、定价和信用风险评估
保险公司提供承保服务,主要是贷款和投资。
人工智能驱动的模型可以对客户的信用风险进行即时评估,然后让顾问制定最适合的报价。
将 AI 用于承保服务提高了提案的效率,并改善了客户体验,因为它加快了此类操作的流程和周转时间。
加拿大金融服务集团宏利是该国第一家将人工智能用于承保服务的公司,这使得“许多加拿大人可以更快地购买基本人寿保险,这是解决加拿大‘保障缺口’的关键。”
保险公司使用一种特定的 AI,人工智能决策算法 (AIDA),该算法根据以前的承保方法&支出进行训练,可以有不同的分类过程,如大额损失支出或价格。
这种方法的应用不限于保险业;它也可以用于贷款的信用评分。
#5.自动化索赔流程
众所周知,保险业按照一个标准流程运作:客户购买保险,并为此付费。如果客户遇到问题(健康保险中的疾病、汽车保险中的车祸、房屋保险中的水损坏),她需要通过提交索赔来激活她的保险范围。这个过程通常是漫长而复杂的。
事务型机器人可以将用户体验转化为更愉快的过程。
随着图像识别、欺诈检测和支出预测的增强,整个用户之旅得到了升级-更少的摩擦、更少的公司成本、更少的运营任务(呼叫、背景调查)以及更少的错误。整个过程花费的时间更少,对客户和保险公司员工来说都是无缝体验。
机器人所做的是负责整个周期:它以对话的形式一步一步地引导客户完成整个过程。
Swishbot, a transactional bot we built from scratch, can be used by an insurer for their customers
它要求视频或照片的损害,并上传到数据库。它包含处理索赔所需的所有信息。然后,该机器人可以通过欺诈检测方法运行应用程序,寻找异常和不符合要求的数据。
然后进入调整模型,提供一系列的支出值。一旦设置好所有数据,就可以出于审计目的进行人工干预。机器人可以在这一点上计算和建议支出金额,基于支出预测模型,它已经被训练。
这个应用程序是一个三合一的机器学习解决方案,有可能缓解行业中的一个高痛点。
这是纽约一家保险初创公司 Lemonade 的使命。在他们网站的主页上,他们要求用户“忘记你对保险的了解”,明确宣布他们通过使用人工智能给该行业带来的颠覆。该公司自 2015 年成立以来已筹集 1.8 亿美元。
To be able to start fresh, one has to forget
在 这篇分析 中阅读更多关于 AI 在保险行业的应用。
跨行业
#6.合同分析器
在金融行业,合同分析是一项重复性的内部任务。经理和顾问可以将这一日常任务委托给机器学习模型。
光学字符识别 (OCR)可用于数字化硬拷贝文件。然后,具有分层业务逻辑的 NLP 模型可以高速解释、记录和修正合同。
业务逻辑是一种条件格式,类似于 Microsoft Excel 中的格式。可以将公式添加到模型中,例如“如果选中了此框,则此框应该为空。”该模型可以在现有合同上进行训练,并学习如何处理这些内容。
在这种情况下,由于合同的重复性,模型结果的准确性非常高。
JP 摩根已经利用了这种人工智能应用的力量,仅在几秒钟内就将员工的工作量从 360,000 小时(每年)中解放出来。
这些解决方案支持与合同相关的分析,而总部位于区块链的智能合同(smart contracts)正在被更广泛地采用,它是对合同管理的一种范式转换升级。
#7.流失预测
流失率是所有行业和企业的关键 KPI。公司需要留住客户,要做到这一点,预测即将到来的客户流失对采取预防措施非常有帮助。
AI 可以通过提供一份显示出考虑取消保单迹象的优先客户名单来支持经理完成这一使命。然后,经理可以相应地处理这个列表:提供更高程度的服务或改进的产品。
在这种情况下,模型是基于客户行为数据的流失效应的解释变量。Explainer 变量可以是报表被下载的次数、用户阅读账户政策的发生、对时事通讯和邮件的退订以及流失行为的其他指标。通过处理消费者数据,银行可以通过采用他们的产品和定价来更好地为他们服务。
所使用的模型是一个分类模型,该模型根据已经取消其保单的客户和在考虑离开该机构后仍然保留的其他客户的历史数据进行训练。
一篇关于银行业客户流失预测的研究论文显示了消费者研究相对于大众营销在这一特定行业中的重要性:
大众营销方法不能在今天多样化的消费者业务中取得成功。客户价值分析和客户流失预测将有助于营销计划瞄准更具体的客户群体。
#8.算法交易——你永远不会看到的最先进的 ML。
算法交易的大多数应用都是在投资银行或对冲基金的闭门造车中进行的。
交易通常是为了快速分析数据和做出决策。机器学习算法擅长分析数据,无论其大小和密度如何。
唯一的先决条件是有足够的数据来训练模型,这是交易所拥有的丰富数据(市场数据,当前的和历史的)。
该算法检测通常难以被人类发现的模式,它比人类交易者反应更快,并且它可以根据从数据中获得的洞察力自动执行交易。
这种模型可以被寻求基于快速价格运动的短期交易的做市商使用。这种操作是时间敏感的,模型提供了所需的速度。
这方面的一个例子是交易个股与标准普尔 500 指数的价格变动,这是一个已知的领先指标(即股票跟随指数)。该算法从指数中提取价格变动,并预测个股的相应变动(例如:苹果)。然后立即买入(或卖出)股票,并在预测水平下限价单,希望股票达到该价格。
#9.增强的研究工具
在投资金融领域,很大一部分时间花在了研究上。新的机器学习模型增加了给定交易想法的可用数据。
情绪分析可用于对公司和管理者的尽职调查。它允许分析师浏览大量文本数据(如新闻或金融评论)的语气/情绪。它还能让你深入了解经理如何反映他们的公司业绩。
卫星图像识别可以让研究人员洞察许多实时数据点。例如,特定位置的停车场交通(例如,零售店)或海洋中的货船交通。从这些数据中,模型和分析师可以获得业务洞察力,如在上述零售商的特定商店购物的频率、运输流量、路线等。
先进的 NLP 技术可以帮助研究人员快速分析公司的财务报告。抽出公司最感兴趣的关键话题。
其他数据科学技术也可以格式化和标准化财务报表。
#10.估价模型
估价模型通常是投资和银行业务的一般应用。
**该模型可以使用资产周围的数据点和历史实例快速计算资产的估值。**这些数据点是人类用来评估资产的(例如:一幅画的创作者),但是模型通过使用历史数据来学习将哪些权重分配给每个数据点。
该模型传统上用于房地产领域,可以根据以前的销售交易对算法进行训练。对于金融公司,它可以使用财务分析数据点、市场倍数、经济指标、增长预测;都是为了预测公司/资产的价值。
此类模型被投资银行团队用作内部工具。
这是人工智能在金融科技领域的应用综述。这项技术每天都在发展,而且这个列表还会继续扩大。目前,采用人工智能的金融公司将改善其运营、营销、销售、客户体验、收入和交易质量。
如果你想阅读更多关于我从事的机器学习和人工智能项目的信息,可以看看Swish Labs的故事。
作者科尔宾·哈德森,原载于【www.swishlabs.com】T21
成为数据科学家应该知道的十个机器学习算法
机器学习从业者性格各异。虽然其中一些是“我是 X 方面的专家,X 可以对任何类型的数据进行训练”,其中 X =某种算法,但其他一些则是“适合合适工作人员的合适工具”。他们中的很多人还订阅了《百事通》。“一个硕士”战略,他们在一个领域有深厚的专业知识,对机器学习的不同领域略有了解。也就是说,没有人可以否认这样一个事实,即作为实践数据科学家,我们必须了解一些常见的机器学习算法的基础知识,这将有助于我们处理我们遇到的新领域问题。这是一个关于常见机器学习算法和快速资源的旋风式旅行,可以帮助你开始使用它们。
1.主成分分析/奇异值分解
PCA 是一种无监督的方法,用于理解由向量组成的数据集的全局属性。这里分析数据点的协方差矩阵,以了解哪些维度(大多数)/数据点(有时)更重要(即它们之间的方差高,但与其他维度的协方差低)。考虑矩阵的顶部 PC 的一种方法是考虑其具有最高特征值的特征向量。SVD 本质上也是一种计算有序分量的方法,但是你不需要得到点的协方差矩阵来得到它。
这种算法通过获得维数减少的数据点来帮助人们对抗维数灾难。
图书馆:
https://docs . scipy . org/doc/scipy/reference/generated/scipy . Lina LG . SVD . html
http://sci kit-learn . org/stable/modules/generated/sk learn . decomposition . PCA . html
入门教程:
【https://arxiv.org/pdf/1404.1100.pdf
2a。最小二乘法和多项式拟合
还记得你大学时的数值分析代码吗,你曾经用直线和曲线来拟合点,得到一个方程。您可以使用它们在机器学习中拟合低维度的非常小的数据集的曲线。(对于大型数据或多维数据集,您可能最终会过度适应,所以不要费心)。OLS 有一个封闭形式的解决方案,所以你不需要使用复杂的优化技术。
显而易见,使用该算法来拟合简单曲线/回归
图书馆:
https://docs . scipy . org/doc/numpy/reference/generated/numpy . linalg . lstsq . htmlhttps://docs . scipy . org/doc/numpy-1 . 10 . 0/reference/generated/numpy . poly fit . html
入门教程:
2b。约束线性回归
最小二乘法可能会与数据中的异常值、伪场和噪声混淆。因此,我们需要约束来减少我们在数据集上拟合的线的方差。正确的方法是拟合线性回归模型,这将确保权重不会出现错误。模型可以有 L1 范数(LASSO)或 L2 (Ridge Regression)或两者都有(弹性回归)。均方损耗得到优化。
使用这些算法用约束条件拟合回归线,避免过度拟合并从模型中屏蔽噪声维度。
图书馆:
http://scikit-learn.org/stable/modules/linear_model.html
入门教程:
https://www.youtube.com/watch?v=5asL5Eq2x0A
https://www.youtube.com/watch?v=jbwSCwoT51M
3.k 表示聚类
大家最喜欢的无监督聚类算法。给定一组向量形式的数据点,我们可以根据它们之间的距离进行聚类。这是一种期望最大化算法,它迭代地移动聚类的中心,然后用每个聚类中心来增加点数。该算法采用的输入是要生成的聚类的数量以及它将尝试收敛聚类的迭代次数。
顾名思义,您可以使用该算法在数据集中创建 K 个聚类
图书馆:
http://sci kit-learn . org/stable/modules/generated/sk learn . cluster . k means . html
入门教程:
https://www.youtube.com/watch?v=hDmNF9JG3lo
https://www.datascience.com/blog/k-means-clustering
4.逻辑回归
逻辑回归是在应用权重后进行非线性(sigmoid 函数最常用,或者您也可以使用 tanh)应用的约束线性回归,因此将输出限制为接近+/-类(在 sigmoid 的情况下为 1 和 0)。使用梯度下降来优化交叉熵损失函数。新手注意:逻辑回归用于分类,而不是回归。您也可以将逻辑回归视为一个单层神经网络。使用梯度下降或 L-BFGS 等优化方法来训练逻辑回归。NLP 的人会经常把它用在最大熵分类器的名字上。
这是乙状结肠的样子:
使用 LR 训练简单但非常健壮的分类器。
图书馆:
入门教程:
https://www.youtube.com/watch?v=-la3q9d7AKQ
5.SVM(支持向量机)
支持向量机是线性模型,如线性/逻辑回归,区别在于它们具有不同的基于边际的损失函数(支持向量的推导是我见过的与特征值计算一起的最漂亮的数学结果之一)。您可以使用优化方法优化损失函数,如 L-BFGS 甚至 SGD。
支持向量机的另一个创新是在数据上使用内核来支持工程师。如果你有很好的领域洞察力,你可以用更聪明的内核替换旧的 RBF 内核并从中获利。
支持向量机可以做的一件独特的事情是学习一类分类器。
支持向量机可用于训练分类器(甚至回归器)
图书馆:
http://sci kit-learn . org/stable/modules/generated/sk learn . SVM . SVC . html
入门教程:
https://www.youtube.com/watch?v=eHsErlPJWUU
**注:**在 SKLearn 的http://sci kit-learn . org/stable/modules/generated/sk learn . linear _ model 中可以找到基于 SGD 的逻辑回归和支持向量机训练。SGDClassifier.html,我经常使用它,因为它让我用一个通用的界面检查 LR 和 SVM。您还可以使用迷你批处理在> RAM 大小的数据集上训练它。
6.前馈神经网络
这些基本上是多层逻辑回归分类器。由非线性(sigmoid、tanh、relu + softmax 和酷炫的新卢瑟)分隔的多层权重。它们的另一个流行名称是多层感知器。FFNNs 可以作为自动编码器用于分类和无监督的特征学习。
Multi-Layered perceptron
FFNN as an autoencoder
FFNNs 可用于训练分类器或提取特征作为自动编码器
图书馆:
http://sci kit-learn . org/stable/modules/generated/sk learn . neural _ network。MLPRegressor.html
https://github . com/keras-team/keras/blob/master/examples/Reuters _ MLP _ relu _ vs _ selu . py
入门教程:
http://www.deeplearningbook.org/contents/mlp.html
http://www.deeplearningbook.org/contents/autoencoders.html
http://www . deep learning book . org/contents/representation . html
7.卷积神经网络
当今世界上几乎任何基于视觉的机器学习结果都是使用卷积神经网络实现的。它们可以用于图像分类、对象检测甚至图像分割。由 Yann Lecun 在 80 年代末 90 年代初发明的 Convnets 具有卷积层的功能,卷积层充当分层特征提取器。你也可以在文本中使用它们(甚至是图表)。
使用 convnets 进行最先进的图像和文本分类、对象检测、图像分割。
图书馆:
https://developer.nvidia.com/digits
https://github.com/kuangliu/torchcv
https://github.com/chainer/chainercv
https://keras.io/applications/
入门教程:
RNNs 通过在时间 t 对聚合器状态和时间 t 的输入递归地应用相同的权重集来对序列建模(假设序列在时间 0 具有输入…t…t,并且在从 RNN 的 t-1 步输出的每个时间 t 具有隐藏状态)。现在很少使用纯 rnn,但是它的对应物如 LSTMs 和 GRUs 在大多数序列建模任务中是最先进的。
RNN(如果这里是一个密集连接的单元和一个非线性,现在 f 一般是 LSTMs 或 GRUs)。LSTM 单位,在纯 RNN 中用来代替普通致密层。
将 RNNs 用于任何序列建模任务,特别是文本分类、机器翻译、语言建模
图书馆:
https://github.com/tensorflow/models(谷歌的很多很酷的 NLP 研究论文都在这里)
https://github.com/wabyking/TextClassificationBenchmark
入门教程:
http://www . wild ml . com/category/neural-networks/recurrent-neural-networks/
http://colah.github.io/posts/2015-08-Understanding-LSTMs/
9.条件随机场
CRF 可能是概率图形模型(PGM)家族中最常用的模型。它们像 RNNs 一样用于序列建模,也可以与 RNNs 结合使用。在神经机器翻译系统出现之前,CRF 是最先进的,在许多具有小数据集的序列标记任务中,它们仍然会比 rnn 学习得更好,rnn 需要更大量的数据来概括。它们还可以用于其他结构化预测任务,如图像分割等。CRF 对序列的每个元素(比如一个句子)建模,使得相邻元素影响序列中组件的标签,而不是所有标签都彼此独立。
使用 CRF 标记序列(文本、图像、时间序列、DNA 等)。)
图书馆:
https://sklearn-crfsuite.readthedocs.io/en/latest/
入门教程:
http://blog . echen . me/2012/01/03/有条件随机字段简介/
Hugo Larochelle 在 Youtube 上的 7 部分系列讲座:【https://www.youtube.com/watch?v=GF3iSJkgPbA
10.决策树
比方说,给我一张 Excel 表格,里面有各种水果的数据,我必须说出哪些看起来像苹果。我要做的是问一个问题“哪些水果又红又圆?”把所有回答是和不是的水果分开。现在,所有又红又圆的水果可能不是苹果,也不是所有的苹果都是又红又圆的。所以我会问一个问题“哪些水果上有红色或黄色的颜色提示?”红色和圆形的水果,并会问“哪些水果是绿色和圆形的?”不是红色和圆形的水果。根据这些问题,我可以相当准确地说出哪些是苹果。这一连串的问题就是决策树。但是,这是一个基于我直觉的决策树。直觉无法处理高维复杂的数据。我们必须通过查看标记数据来自动提出一连串的问题。这就是基于机器学习的决策树所做的事情。像 CART trees 这样的早期版本曾经用于简单数据,但是随着数据集越来越大,偏差-方差权衡需要用更好的算法来解决。现在使用的两种常见的决策树算法是随机森林(在属性的随机子集上构建不同的分类器,并将它们组合起来输出)和提升树(在其他树的顶部训练一系列树,纠正下面的树的错误)。
决策树可以用来分类数据点(甚至回归)
图书馆
http://xgboost.readthedocs.io/en/latest/
入门教程:
http://xgboost.readthedocs.io/en/latest/model.html
https://arxiv.org/abs/1511.05741
【https://arxiv.org/abs/1407.7502
http://education . parrot prediction . teachable . com/p/practical-xgboost-in-python
TD 算法(最好有)
如果你仍然想知道上述任何方法如何解决像 DeepMind 那样击败围棋世界冠军的任务,它们不能。我们之前讨论的所有 10 种算法都是模式识别,而不是策略学习器。为了学习解决多步骤问题的策略,如赢得一盘棋或玩雅达利游戏机,我们需要让世界上没有代理,并从它面临的奖励/惩罚中学习。这种类型的机器学习被称为强化学习。该领域最近的许多(不是全部)成功是将一个康文网络或一个 LSTM 的感知能力与一套称为时间差异学习的算法相结合的结果。其中包括 Q-Learning、SARSA 和其他一些变体。这些算法是对贝尔曼方程的巧妙运用,以获得一个损失函数,该函数可以用代理从环境中获得的回报来训练。
这些算法主要用于自动玩:D 游戏,也用于语言生成和对象检测中的其他应用。
图书馆:
https://github.com/keras-rl/keras-rl
https://github.com/tensorflow/minigo
入门教程:
抢免费的萨顿和巴尔托的书:https://web 2 . Qatar . CMU . edu/~ GDI caro/15381/additional/Sutton barto-RL-5 nov17 . pdf
观看大卫·西尔弗课程:https://www.youtube.com/watch?v=2pWv7GOvuf0
这是 10 种机器学习算法,你可以通过学习成为一名数据科学家。
你也可以在这里阅读关于机器学习库。
我们希望你喜欢这篇文章。请注册免费的 ParallelDots 账户,开始你的 AI 之旅。你也可以在这里查看我们的 API的演示。
点击阅读原文。
使用主题建模和其他 NLP 方法分析脸书帖子和活动
4 月,我永久删除了我在脸书的存在。我于 2008 年加入,这些年来相当活跃。
在删除我的帐户的过程中,我下载了我所有的数据。我忍不住问自己:这个数字时间胶囊告诉了我关于我十年生活的什么?它对脸书十年的生活给出了什么样的暗示?是时候让我的数据科学技能发挥作用了。
对于阅读这篇文章的 R 程序员,我已经把我的代码发布到了 RPubs *,*上,利用了包括tm
,topicmodels
,ldatuning
,plotly
和ggplot2
在内的许多包进行可视化。希望您可以用它来做一些类似的事情,只需很少/不需要调整。我希望你能试一试,希望你能学到一些有趣的东西。
1.对我的时间线进行分析
我下载了我的脸书数据的 zip 文件,并将其解压缩到我的计算机上的一个文件夹中。如果您不确定如何操作,下面是如何操作的。我感兴趣的特定文件位于名为 timeline.htm 的 html 子目录中。这个文件包含了我加入以来(几乎)十年时间线上的所有帖子。虽然其他人可以在你的时间线上发表文章,但是绝大多数的评论都是我自己的。
接下来,我使用文本分析从这个文件的沉重的 html 代码中提取所有文本,直到我只剩下一个来自我的时间线的评论列表。这并不简单,但是几行正确的代码就可以让你达到目的。
我还以类似的方式提取了所有的活动日期,这样我就可以分析我发布的时间和日期的模式。
总的来说,在 3632 天的会员时间里,有 5115 个帖子,平均每天 1.4 个帖子,所以我的个人资料在这十年里相当活跃。
2.分析我在脸书的活动
我获取了我活动的日期和时间的数据,并使用 R 的优秀功能将它们分组,这样我就可以了解我的活动在一年、一年中的几个月以及一天中的几个小时是如何变化的。
首先,我看了看我的活动是如何逐年变化的,我制作了这张图表,它显示我在 2010 年几乎没有活动(我记得我故意从脸书休假一年!),在 2013–2015 年最为活跃。
然后我逐月观察我的活动的整体发展,用一个黄土平滑曲线的散点图来显示整体趋势。这证实了我在 2013-2015 年左右达到了一个活动高峰。2015 年后活跃度大幅下降。我不禁要问:这是脸书的总趋势吗?对我来说确实是这样!
最后,我对我的每日发帖趋势感兴趣,所以我查看了一天中每个小时的总发帖量。这看起来像我是奇怪的夜间活动,直到我意识到脸书记录的时区是 GMT,但在这段时间的大部分时间里,我住在澳大利亚,根据一年中的时间,澳大利亚要提前 9-10 个小时。从这个角度来看,这种活动看起来相对正常,在(澳大利亚)早上和晚上有一个高峰,在工作时间和晚上活动水平较低。
3.我帖子中最重要的词
接下来,我整理了课文,以便于我分析。我去掉了标点符号、数字,把所有东西都转换成小写。我还删除了停用词,它们是像‘和’这样的无意义的词,在互联网搜索查询中经常被删除。最后,我替换了一些我知道会出现的名字,特别是我的两个孩子的名字,我把它们转换成了“孩子 1”和“孩子 2”。我这样做是为了保护他们的隐私,因为我希望分享我的分析。
我把我的帖子列表变成了一个文档语料库,每个帖子都是一个单独的文档。我创建了一个文档术语矩阵,计算每个单词在每个文档中出现的次数。然后,我使用一种叫做词频-逆文档频率(TF-IDF) 的方法来确定文档中单词的重要性。
我对所有单词的 TF-IDF 频率进行平均,然后从大到小排列。最后,我用这些数据创建了一个文字云来代表我十年来发表的文章。在这里。
首先,这告诉我,至少在脸书,我的孩子就是我的生命。然而,TF-IDF 相对于简单字数统计的价值在于,与简单字数统计相比,它给予稍微不太频繁的单词额外的分数,并使它们更加突出。这些额外的单词给我的帖子增添了一些色彩。看着它,我看起来很开心,也很忙。我认为这是一个公平的结论。
4.我最常见的发帖主题
接下来,我继续看我是否能阐明一些我定期发布的常见话题。为此,我使用了一种叫做主题建模的技术。使用我的文档术语矩阵,我首先使用一种数学技术来确定将我的帖子分成的最佳主题数量。我登陆了八个主题——比这更多的似乎会产生递减的回报,每增加一个额外的主题,就会显著增加处理时间。
我的主题建模过程按照要求找到了八个主题。每个主题出现的频率在这个条形图中,最常见的主题是主题 8,尽管所有主题都以一定的频率出现。
但是主题到底是什么呢?
我按主题列出了前十个单词,以帮助我找出主题,结果如下:
所以这很好玩!主题建模可能有点断断续续——尤其是当语料库中的文档很短时,如脸书帖子或推文——但看看按主题排列的前十个词,我发现一些有意义的东西:
- 最常见的话题(话题 8)是关于电视的,最佳、剧集和季节等词可以说明这一点。我的确是一个伟大的电视爱好者——稍后会有更多的介绍。
- 话题 1 并不奇怪——生日祝福——可能是这些年来别人给我的。
- 话题 2 也很受欢迎,显然是关于我的家庭生活。我很幸运能够每天早上把我的孩子送到学校,这是我已经做了很多年的事情,看起来我发布了很多关于这个的内容。
- 话题 3 是关于我对足球的热爱和我最喜欢的球队——埃弗顿。
- 话题 6 把我带回到电视,以及我一直以来最喜欢的节目——《广告狂人》。我确实记得发布了很多关于这个节目的帖子。很多年来每一集之后。
- 其他主题似乎有点难以理解,但例如在主题 7 中,提到了“新闻”和“阿博特”(托尼·阿博特,我在澳大利亚生活的大部分时间里是总理和反对党领袖),这表明这可能是一些基于澳大利亚新闻和政治的热门帖子。
所以我在脸书的十年告诉我,我是一个顾家的男人,我热爱足球,对政治评论太多,我花了太多时间分析《T2 广告狂人》的剧集。
这就是了。感谢脸书十年的快乐时光!
最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在LinkedIn或Twitter上找我。
电报机器人、我的早餐、水果和交互式对话上的张量流对象检测
在本文中,我们将探索一个案例,其中我们使用张量流(对象检测 API)将图像中的对象检测与通过 bot 架构(电报平台)的交互相结合。
面临的挑战是创造一个能够在对话中使用图像进行交互的机器人,以告知用户早餐中包含的水果。利用这些信息,这款软件可以在未来提供许多不同的分析,目前还只是一个概念证明。
我们将提出一个 TensorPhotoXRay (我们的图像检测解决方案,以前的文章)的集成,以检测图像中的水果,我们将创建一个与电报机器人的集成(项目 appengine-telegram-bot )。
这是已经完成并正在运行的解决方案:
让我们描述一下使用这个架构的基本元素。
电报中机器人的创建:你可以通过这个官方链接探索更多关于这个选项的信息。此步骤的重要元素,获取令牌*以连接电报平台。
创建 bot 电报解决方案:让我们创建一个基于 App Engine 的 bot。(项目 appengine-telegram-bot )。*这是对来自电报的消息进行分析的方法,以及对图像检测方法的调用。
*我们使用超过 50%的置信度来显示标签。在这里您将找到要部署的完整项目。
部署 Telegram Bot 解决方案:在本例中,该解决方案是为 Google App Engine 传统环境设计的。您应该特别注意这些要素:
- 电报令牌:要获得这些信息并在电报平台上创建机器人,你应该与机器人父亲对话。在这里你有所有的官方指示。
- 与 TensorPhotoXRay 的 url 集成:一旦部署了解决方案,您将需要 Url 来执行分析。记住你有一个新方法,格式如下:
root URL/photobot/photourl
- rooturl : app 引擎 url。
- photourl :要分析的照片的 url。
电报钩子配置:您需要在 App Engine 上部署解决方案。完成此操作后,您将获得以下 URL 格式。
rooturl/ 水果 _ 分析
*rooturl:应用程序引擎 url
部署 TensorPhotoXRay 解决方案:该活动可按照以下说明进行。请记住,该解决方案使用应用引擎灵活环境。
我在原项目上做了修改,增加了一个新方法,在图像检测上只返回一个标签数组*。
这是新方法:
最后一步,将电报与我们开发的机器人
连接起来。现在让乐趣开始吧…
- 对于与我们的应用引擎解决方案的 bot 链接,我们必须设置挂钩。(仅访问此链接并验证 web_hook 配置正常)
rooturl/set_webhook
- rooturl:应用程序引擎 url
现在,我们可以与一个组件交互,让我们在食物选择方面进行合作,在未来以一种非常灵活的方式建议和学习。
有几个要素需要发展和改进,但这个简单的解决方案展示了一条有趣的道路,在与用户的交互中充满了新的机会。
Tensor2Tensor 和一个模型来学习所有内容
最近谷歌宣布发布 Tensor2Tensor 库。T2T 的主要目的是通过向每个人提供最先进的模型来加速深度学习研究。现在,它主要集中在 NLP 问题和一般的序列到序列。然而,它是建立在 Tensorflow 之上的,Tensor2Tensor 的模块化结构允许开发人员和研究人员以简单的方式添加新模型。
这个 python 库为数据集生成、训练和超参数调整提供了简单的 API。它包含:
- 流行的序列数据集生成工具
- 不同输入/输出模式的工作模型:符号、图像、音频、标签
- 模型及其优化器的预调超参数集
- 具有简单 CLI 界面的训练器
- 像 ByteNet、MultiModel( paper )、SliceNet、Transformer( paper )和 Xception 这样的 SOTA 模型
但是这一个值得特别注意:
多模态建筑
这个网络最吸引人的特点是它可以学会同时解决一系列不同的问题。研究人员训练同一个神经网络来进行图像分类、图像字幕、文本解析、语音识别、英语德语和英语法语翻译。它在每一个方面都做得很好!
这在迁移学习中是一个巨大的成功,在不久的将来,我们可能会看到很多论文和对这个架构的改进。
Transformer 也很酷,它使用注意力机制而不是递归层,并在 WMT 英语->德语翻译基准测试中获得 SOTA。与此同时,相对于竞争对手,它只需要 1%到 10%的计算能力。
事实上,我相信多式联运网络有一个非常光明的未来。也许会成为 DL 最大的突破之一。
最初发表于CognitiveChaos.com
TensorBoard:可视化学习
一个使实现透明的简洁工具
为什么选择 TensorBoard?
这是 tensorflow 提供的可视化工具。但这很有用的原因是,它有一些特殊的功能,例如将您的机器学习模型视为节点和连接这些节点(数据流)的边的概念性图形表示(计算图)。此外,它还为我们提供了根据期望的指标评估模型性能的能力。
谷歌创建 tensorboard 这样的工具的进一步动机是,当我们使用 tensorflow 创建模型时,我们不知道幕后发生了什么,特别是在神经网络这样的算法中,它的操作是一个完全的黑盒,可能具有非常复杂的结构。在这种情况下,我们如何确保我们的实现流程没有错误?
Tensorboard 能提供什么?
Google 的 Tensorflow 机器学习库通过提供操作和各种信息(即维度、数据类型等)的可视化表示(tensorboard 计算图)来解决这个问题。)流经其中的数据。
使用汇总操作
汇总操作使您能够存储所选操作的汇总值(例如:-与每个时期相关的训练精度)以备后用。首先,您必须首先指定操作的名称。以便将来参考时更容易。在你保存了你的汇总操作之后,你必须使用 tf.summary.mergeall() 将所有这些操作合并成一个操作。现在,您必须使用文件写入器对象将这些元数据写入一个期望的位置,以便将来能够访问。
一个例子如下:
Illustration of setting up summary operations
上面的代码创建了第一层的权重和偏差的汇总直方图。这将在 tensorboard 上显示如下:
这些图像基本上描述了在训练时期权重和偏差分布的变化。每个切片是特定时期的参数分布。
可以在下面的链接中找到关于更多可用概要操作的更多信息。请参考此官方文档以获得更多参考。
[## tf.summary .直方图|张量流
fake _ quant _ with _ min _ max _ vars _ per _ channel _ gradient
www.tensorflow.org](https://www.tensorflow.org/api_docs/python/tf/summary/histogram)
将模型保存到图表中
此外,在 tensorboard 中,我们可以查看由执行操作的张量和通过图形表示数据流的边组成的计算图形。这种设计可用于确定模型的创建是否合适。这种可视化图形让我们确保图形中的数据流是有意义的,并且转换应用于正确数据的正确位置。下面的代码可以用来保存图表。请注意,这应该在会话实例中执行,因为张量属性只能在会话中访问。
保存后的图形示例如下所示:
Example of a computational graph
通过使用如下标量运算,可以获得性能评估度量的进一步图形:
在 tensorboard 上,其可视化效果如下:
这是 tensorboard 入门的简要概述,如果您需要更多资料,可以在下面的 references 标签下找到 tensorflow 官方网站的链接。因此,如果你觉得这篇文章的内容有用,请与他人分享。
参考
[## 深入 TensorBoard:示例教程- neptune.ai
有一个常见的商业说法是,你不能改进你没有衡量的东西。这在机器学习中是正确的,因为…
海王星. ai](https://neptune.ai/blog/tensorboard-tutorial) [## 张量板:可视化学习|张量流
你将使用 TensorFlow 进行的计算——比如训练一个大规模深度神经网络——可能会很复杂和令人困惑…
www.tensorflow.org](https://www.tensorflow.org/get_started/summaries_and_tensorboard)
TensorFlow 1.9 已经到来!
你需要知道的一切…
在撰写本文时, TensorFlow 1.9 尚未在他们的官方网站上更新,但 TensorFlow 1.9 rc-0 已经在他们的**GitHub上发布。**
主要内容和改进🚀
- 将您的 tf.keras 更新到 Keras 2.1 API。
- 请继承
tf.keras.Model
,因为tfe.Network
现在已经被弃用**。** - 向梯度增强树估计器添加核心特征列和损失的支持。****
- Bijectors API 支持通过新的 API 更改来广播 bi objectrs。
- 分层变量在以下条件下发生变化
- 在子类
tf.keras.Model
中使用tf.layers
。支持的链接
可能会在这里断裂
**替换 **variable_scope**
(“,…)由 **variable_scope**
( **tf.get_variable_scope()**
**,…)如果你正在打开变量作用域。
错误修复🐛
tf.data
DatasetBase::DebugString()
方法现在是const
。- 添加了从多个数据集随机采样的
tf.contrib.data.sample_from_datasets()
API。
tf.keras
- 将 Keras 代码移出 _impl 文件夹,并移除 API 文件**。**
tf.keras.Model.save_weights
现在默认保存为 TensorFlow 格式。- 将数据集迭代器传递给
tf.keras.Model
训练/评估方法。
加速线性代数(XLA)
张量流调试器(tfdbg) CLI
tf .贡献
- 添加
tf.contrib.data.choose_from_datasets()
。 tf.contrib.data.make_csv_dataset()
现在支持引用字符串中的换行符。从make_csv_dataset
中删除了两个参数。tf.contrib.framework.zero_initializer
支持资源变量。- 将“ constrained_optimization ”添加到 tensorflow/contrib。
进入以下链接查看更多** Bug 修复 。**
感谢您阅读本文,希望您能利用新特性编写出高效的代码。
有关 TensorFlow 版本的更多更新以及更多关于 Medium 和Twitter的关注。
鼓掌吧!分享一下!跟我来。
你会喜欢的以前的故事:
** [## 50 tensor flow . js API 5 分钟讲解| TensorFlow.js Cheetsheet
TensorFlow API Cheetsheet
towardsdatascience.com](/50-tensorflow-js-api-explained-in-5-minutes-tensorflow-js-cheetsheet-4f8c7f9cc8b2) [## 手机上的 tensor flow:tensor flow Lite
我们得到了什么?
towardsdatascience.com](/tensorflow-on-mobile-tensorflow-lite-a5303eef77eb) [## 手机上的 TensorFlow:教程
在 Android 和 iOS 上
towardsdatascience.com](/tensorflow-on-mobile-tutorial-1-744703297267) [## 激活函数:神经网络
Sigmoid,tanh,Softmax,ReLU,Leaky ReLU 解释!!!
towardsdatascience.com](/activation-functions-neural-networks-1cbd9f8d91d6) [## 纪元与批量大小与迭代次数
了解您的代码…
towardsdatascience.com](/epoch-vs-iterations-vs-batch-size-4dfb9c7ce9c9)**
张量流——实践方法
[Source: www.tensorflow.org]
这是我将要撰写的系列文章的第一篇,介绍 TensorFlow 并深入研究它提供的无数数学和机器学习库。首先,在这篇文章中,我将描述 TensorFlow 框架背后的思想,它的构造方式,它的关键组件等。到本文结束时,您将能够用 TensorFlow 编写简单的数值求解器代码片段。
对于那些不知道的人来说,
TensorFlow 是一个用于构建机器学习模型的计算框架。它是由杰夫·迪恩领导的谷歌大脑的第二代系统。它于 2017 年初推出,通过引入从可扩展性到构建生产就绪模型的众多功能,颠覆了 ML 世界。
【鸣谢:维基百科】
[Source: www.tensorflow.org]
框架
TensorFlow toolkit hierarchy
TensorFlow 提供了各种不同的工具包,允许您在自己喜欢的抽象级别上编写代码。例如,您可以在核心 TensorFlow (C++)中编写代码,并从 Python 代码中调用该方法。你也可以定义你的代码应该运行的架构(CPU,GPU 等等。).在上面的层次结构中,可以编写代码的最低层是 C++或 Python。这两个层次允许你编写数值程序来求解数学运算和方程。虽然这并不强烈推荐用于构建机器学习模型,但它提供了大量的数学库来减轻您的任务。您可以编写代码的下一个层次是使用 TF 特定的抽象方法,这些方法针对模型组件进行了高度优化。例如,使用 tf.layers 方法抽象,您可以处理神经网络的层。您可以使用 tf.metrics 方法构建模型并评估模型性能。使用最广泛的级别是 tf.estimator API,它允许您使用 easy 构建(训练和预测)生产就绪模型。estimator API 非常容易使用,并且经过了很好的优化。尽管它提供的灵活性较低,但它具有训练和测试您的模型所需的所有功能。让我们看看 estimator API 的一个应用程序,它只用三行代码就构建了一个分类器。
Simple Classifier Using TensorFlow Estimator API
在本文中,我将使用核心 TensorFlow (Python)来编写代码。但在此之前,让我先讨论一下 TensorFlow 中可用的数据类型。
数据类型
这个框架中的基本数据类型是一个**张量。**张量是数据的 N 维数组。例如,你可以称一个标量(一个常量值,比如整数 2)为 0 维张量。向量是一维张量,矩阵是二维张量。下图详细描述了张量的每个维度。
Tensor Data Type
观察上图。变量 x 是使用 tf.constant 类声明的张量。
**常数:**常数是一个值根本不能改变的张量。在第一个例子中, x 取常数值 3,因此形状为 None。你可以通过使用 tf.stack 函数在现有张量上叠加张量来声明任何维度的张量,这可以从 nD 张量的例子中看出。
现在我们已经看到了如何在 TensorFlow 中声明常数,让我们看看声明变量。
**变量:**变量是一个张量,它的值被初始化,然后通常随着程序的运行而改变。在 TensorFlow 中,变量由 tf 操纵。变量类。创建变量的最好方法是调用 tf.get_variable 函数。该函数要求您指定变量的名称。其他副本将使用此名称来访问同一变量,并在检查指向和导出模型时命名此变量的值。 tf.get_variable 还允许您重用之前创建的同名变量,从而轻松定义重用层的模型。
my_variable = tf.get_variable("my_variable", [1, 2, 3])
**初始化变量:**由于使用了低级 API 核心张量流,变量需要明确初始化。如果像 tf 这样的高层框架。正在使用估算器或 Keras ,变量将自动为您初始化。为了初始化变量,需要调用TF . global _ variables _ initializer。您可以使用以下代码行初始化会话中的所有变量。
session.run(tf.global_variables_initializer())
但是什么是 session.run ??什么是会话?
会话和图表
会话封装了 TensorFlow 运行时的状态,并运行 TensorFlow 操作。使用 TensorFlow 编写的每一行代码都由一个底层图形表示。下面我们用一个例子来理解这一点。
TensorFlow sessions
我创建了两个 1D 张量 x 和*y。*我将它们相加并存储在一个名为 z1 的变量中。我将它们相乘并存储在变量 z2 中。我通过从 z2 中减去 z1 创建了另一个变量 z3 。当执行这个特定的代码片段时,TensorFlow 不计算结果,而是创建一个表示上述代码的图形(如下所示)。
TensorFlow Graph
利用图形背后的想法是创建可移植的代码。是的,任何人都可以在任何类型的架构上导出和使用这个图。但是,TensorFlow 为什么不计算结果呢?因为,它遵循了懒惰的评估范式。所有创建的图形都绑定到一个会话,我们必须告诉 TensorFlow 使用 session.run 计算结果。
session.run(z3)
记住这一点,如果一个 tf。图形就像一个*。py* 文件,一个 tf。会话类似于 python 可执行文件。
现在我们已经知道了会话、图形、数据类型以及如何创建变量的基础知识,让我们通过编写一些 TensorFlow 代码来尝试一下。
张量流代码
加法和减法
乘法和除法
重塑
我已经用上面讨论的简单操作编写了一个二次方程解算器,同样的代码可以在我的 GitHub 库中找到。[ 链接
结论
TensorFlow 主要用作后端框架,其模块通过 Keras API 调用。通常,TensorFlow 用于解决图像分类、对象识别、声音识别等复杂问题。在本文中,我们学习了张量流的结构和组成。在下一篇文章中,我们将深入研究机器学习,并使用 TensorFlow 构建我们的第一个线性回归模型。
深入了解 TensorFlow 的一些资源:
- TensorFlow 文档。
- Coursera 上 TensorFlow MOOC 介绍。
敬请关注我的后续文章。
Photo by Alexandru-Bogdan Ghita on Unsplash
张量流文件系统—以不同方式访问张量
Tensorflow 很棒。真的,我是认真的。问题是它在某种程度上是伟大的。有时候你想做非常简单的事情,但是 tensorflow 却在为难你。我写 TFFS (TensorFlow 文件系统)背后的动机可以被任何使用过 TensorFlow 的人分享,包括你。
我只想知道一个特定张量的名字是什么;或者它的输入张量是什么(忽略运算)。
使用 tensorboard 可以轻松回答所有这些问题。
当然,你只需打开图形选项卡,并目视检查图形。真的很方便吧?如果你想对图表有一个总体的了解。但是如果你很专注,并且有一个特定的问题想要回答,使用键盘是一个不错的选择。
那么为什么不在 python shell 中加载图形并检查它呢? 这是可行的,但是每次我想做那个任务的时候都要写这几行代码?必须记住如何加载图形,如何寻找张量,如何获得它的输入…当然,这只是几行代码,但一旦你一次又一次地重复同样的任务,就该写脚本了!
那么为什么不写一个交互式脚本呢?你是指一个脚本,它给出了模型的路径,为你加载它,并提供实用函数来减轻你写张量流代码的痛苦?好吧,我们可以这么做,但那不会比我要给你看的更棒!
声明:如果你想要一个有意义的解决方案,停止阅读这里,只使用交互式脚本方法。只有当你想学习一些不同的东西时,才继续阅读;)
文件系统拯救世界!
张量的名称有斜杠——与 UNIX 文件系统非常相似。想象一个有张量流文件系统的世界,其中目录类似于张量流范围,文件类似于张量。给定这样一个文件系统,我们可以使用传统的 bash 来做我们想做的事情。例如,我们可以通过运行find ~/tf
列出所有可用的作用域和张量——假设~/tf
是 tensorflow 文件系统的挂载位置。想只列出张量?没问题,用find ~/tf -type f
就行了。
嘿,我们有文件,对吧?它们的内容应该是什么?让我们运行cat ~/tf/.../tensor_name
。哇!我们得到了张量的值——很好……这只有在张量不依赖占位符的情况下才有效,原因很明显。
如何得到张量的输入呢?嗯,你可以跑~/tf/bin/inputs -d 3 ~/tf/.../tensor_name
。这个特殊的脚本将打印递归深度为 3 的输入的树形视图。不错…
好吧,我加入。我们如何实现它?这个问题问得好。我们可以在用户空间(FUSE)中使用文件系统。这是一种允许我们在用户空间实现文件系统的技术。它为我们省去了进入低层次领域的麻烦,如果你以前没有做过,这真的很难做到(并且实现起来很慢)。包括用 C 写代码——恐怖!我们将使用名为 fusepy 的 python 绑定。
在这篇文章中,我将只解释实现中有趣的部分。完整的代码可以在这里找到。包括文档在内,只有 345 行代码。
首先我们需要加载一个张量流模型:
- 使用
tf.train.import_meta_graph
导入图形结构。 - 如果模型经过训练,使用
saver.restore
加载重量。
将张量映射到文件
接下来,我将描述主类。构造函数中有几件有趣的事情。首先,我们称之为_load_model
。然后,我们将图中的每个张量映射到文件系统中的一个路径。假设一个张量的名字是a/b/c:0
——它将被映射到路径~/tf/a/b/c:0
,假设挂载点是~/tf
。
每个目录和文件都是使用_create_dir
和_create_tensor_file
函数创建的。这些函数返回一个简单的 python 字典,其中包含关于目录或文件的元数据。
我们也叫_populate_bin
,后面我会讲到。
使用 fusepy
fusepy 要求你实现一个扩展fuse.Operations
的类。这个类实现文件系统支持的操作。在我们的例子中,我们想要支持读取文件,所以我们将实现read
函数。当被调用时,这个函数将计算与给定路径相关的张量。
担心printoptions
部分?当实现文件系统时,你需要知道文件的大小。为了知道大小,我们可以评估所有的张量,但是这需要时间和内存。相反,我们可以检查每个张量的形状。给定它的形状,并且给定我们使用一个格式化程序在结果中输出每个条目的固定数量的字符(这就是_fixed_val_length
出现的地方),我们可以计算大小。
获取输入和输出
虽然张量流观测仪的结构类似于文件系统,但张量输入和输出却不同。因此,我们可以不使用文件系统来获取输入和输出,而是编写一个可以如下执行的脚本:
~/tf/bin/outputs — depth 3 ~/tf/a:0
结果将如下所示:
~/tf/a:0
├── ~/tf/b:0
└── ~/tf/c:0
└── ~/tf/d:0
| └── ~/tf/e:0
└── ~/tf/f:0
不错!我们有输出树!要实现它,我们要做的就是:
- 获取数据,这是从每个张量到其输出的映射。
- 实现一个输出树的递归函数。这并不复杂(它花了我 6 行代码),并且是一个很好的练习。
不过有一个挑战……outputs
脚本将在一个新进程中执行——这是 UNIX 的工作方式。这意味着它不能访问 tensorflow 图,它是在主进程中加载的。
那么如何访问张量的所有输入/输出呢?我可以在两个进程之间实现进程间通信,这是一个很大的工作量。但是我选择了不同的方法。我创建了一个包含以下行的模板 python 文件:
_TENSOR_TO_DEPENDENCIES = {{TENSOR_TO_TENSORS_PLACEHOLDER}}
这是非法的 python 代码。我们之前看到的_populate_bin
函数读取这个 python 文件,并用输出(或输入)的张量字典替换{{TENSOR_TO_TENSORS_PLACEHOLDER}}
。然后,结果文件被映射到我们的文件系统中的一个路径— ~/tf/bin/outputs
(或~/tf/bin/inputs
)。这意味着如果您运行cat ~/tf/bin/outputs
,您将能够看到文件内部(潜在的)巨大的映射。
猫。/最终想法
我们做到了!我们将张量流模型映射到文件系统。TFFS 是一个有趣的小项目,我在这个过程中了解了 FUSE,这很棒。
TFFS 是一个可爱的工具,但它不能代替旧的 python shell。使用 python,您可以轻松地导入张量流模型并手动检查张量。我只是希望我能记得如何这样做,即使在做了数百次之后…
面向绝对初学者的 Tensorflow
按照本官方 Tensorflow 指南安装 Tensorflow
如果你在推特上关注我,你会知道我是开源社区的忠实粉丝。我一直很钦佩像安德烈·卡帕西这样的研究人员,他们花宝贵的时间写博客和写教程,这些年来对我帮助很大。所以,当谷歌中国主动向我提供一个写教程的志愿机会,帮助他们在中国的新在线教育项目时,我知道是我回报的时候了。这是教程的第一部分,将建立在使用谷歌张量流库的实际知识上。我假设您对 Python 编程语言有基本的了解,并且数学成熟度达到高中水平。如果你不熟悉 Python,但知道一般如何编码,你应该能够学会语法并跟上。或者,你可以进入 Codecademy 学习 Python。我将从构建和训练执行布尔逻辑的感知器开始,比如 and、OR、XOR,到本系列教程结束时,我们将对猫进行分类!或者狗!甚至 杨颖 !使用一种称为的技术,通过谷歌预先训练的深度神经网络进行转移学习。这篇博文稍后将被翻译成中文,以便中国学生更容易理解。
在学习 Tensorflow 之前,我们先来看看,什么是神经网络?为什么每个人都不停地谈论它?
人脑由数十亿个神经元组成,这些神经元通过突触相互连接。如果对神经元的“足够”突触输入触发,那么神经元也将触发。这个过程叫做*思维。*这里有一个问题, c 我们可以模拟这种现象,使用我们的笔记本电脑和一些数学知识,这样我们就可以制造我们的机器,”认为?绝对是! iso facto ,人工神经网络。( 天网 有人吗?)这些网络在最近几年开始表现得非常好——部分是因为这些天可用的数据数量惊人,部分是因为摩尔定律。出于建立直觉的目的,我喜欢将神经网络视为通用函数逼近器。如果你懂微积分,这个类比对你来说很容易理解。把它想象成通过把许多线段放在一起来逼近一个弯曲的函数。从 Google Translate 到 FB/微博的所有东西都使用这种技术。它们被用于癌症检测、药物发现甚至 自动驾驶汽车 !很有可能,你在生活中的每一天都会遇到某种形式的神经网络。Google 的 Tensorflow 库为实现 NN 提供了非常高层次的抽象。如果你真的想很好地理解神经网络——你应该知道像 反向传播 和各种 激活函数 这样的算法是如何工作的,最好用纯 Python/numpy 从头开始写一遍,以获得更好的直觉。我们总是可以使用像 Tensorflow 这样的开源库来快速构建原型,从而避免从头开始编写容易出错的算法。让我们开始建立一个非常基本的单层感知器。一种可以模拟逻辑与门的神经网络的基本形式,好吗?
别担心,我会解释下面的每一行代码。我建议你在两个窗口中打开这篇文章,这样你可以同时看到代码和解释。在此之前,让我们先谈谈张量流是如何工作的;为了使我们的代码执行得更快,并避免 Python 等语言的缺点,这些语言本质上以可读性换取速度,TensorFlow 中的一切都基于创建计算图。把计算图想象成一个节点网络,每个节点都是一个操作,运行一些函数,这些函数可以是简单的加法或减法,也可以是复杂的多变量方程。然后在 Tensorflow 会话中使用 fast C++后端执行该图。TensorFlow 中的变量由会话管理。
现在,我们已经知道了足够多的知识,可以一头扎进代码中,这是最快的学习方法。
第 1 行:它简单地导入了 Tensorflow 库,其中包含了所有的精彩内容。
第 2 行:我们简单地将 True 的值赋为 1,False 的值赋为-1,快速脑筋急转弯:我们可以将 False 的值赋为零吗?
第 3 行: Bias 是我们选择的常数(通常为 1 或-1),并让我们的神经网络决定常数项应该乘以的权重,以获得我们想要近似的期望函数。了解更多关于偏见的知识;参考这个T3【stack overflow 线程
第 4 行到第 9 行:这是我们用来训练神经网络的输入数据。真和假的所有四个可能值是 TT、TF、FT、FF,加上偏置项‘b’。
第 10 到 15 行:这分别是我们的训练集 T,F,F & F 的输出数据。我们的神经网络应该能够查看第 4–9 行的训练输入和第 10–15 行的训练输出,从而能够逼近期望的’*和’*函数
第 16 行:输入(x)和输出(y)训练数据将保持不变,因此我们的神经网络将通过逼近“权重”(w)来逼近函数,在这种情况下,3 * 1 由于 3 个输入对应于 1 个输出,NN 将在训练过程中不断调整权重以找到最佳值,因此它是一个变量对象。这些值被初始化为正态分布的随机数,因此我们使用了 tf.random_normal 模块。我希望神经网络常用的等式" y = Wx" 现在对你更有意义了。
第 18–22 行:现在我们可以定义我们的模型了。从阶跃函数开始,阶跃激活函数对于二元分类方案是有用的。换句话说,当我们想要将一个输入模式分类为两个组中的一个时,我们可以使用具有步进激活功能的二元分类器。注意,当使用深度神经网络时,阶跃函数将不会有用,我们将引入非线性激活函数,如 sigmoid 、 tanh 、 relu 和我最喜欢的 leakyrelu (恰好是我的 twitter 句柄)。这段代码只在函数的参数为> 1 时返回 1,否则返回-1
第 24–26 行:定义了阶跃函数后,我们可以简单地用三行定义输出、误差和均方误差。Error 主要计算我们的模型输出预测与训练集的真实“输出”有多“偏离”。然后我们将继续计算均方误差,为什么?嗯,它背后有一个非常美丽的数学,如果你在大学里上过概率 101 课,你就会知道,但是这里的是一个很好的简短教程来解释它。
第 28–29 行:对权重(w)等特定函数的评估将有助于调整我们预定义的变量的值,因此,在这段代码中,我们根据之前计算的误差计算了所需的调整(delta)。然后把它加到我们的重量里。
第 31–32 行:模型必须由 TensorFlow 会话评估,我们在将所有变量初始化为其指定值之前实例化该会话,还记得吗?我们必须使用 Tensorflow 的快速 C++后端来运行我们的模型。神奇的是后面的环节
第 34–40 行:我们现在可以通过训练时段运行我们的模型,每次通过评估训练来调整权重。由于我们使用的是二进制输出,我们可以期望达到一个完美的结果,均方误差为 0 。我们将很快到达那里。请注意, Session.run 将返回到那时为止评估的结果。在每个时期,我们评估 mse 以便跟踪进度,并且训练实际调整权重。
现在继续运行这段代码,由于这个网络的简单性,你将能够在很短的时间内很快找到解决方案。
我将把它作为一个练习留给读者:通过玩代码来实现一个’或’和’ XOR '门(提示:将 training_output 数据集更改为期望的输出结果)。
恭喜你!你刚刚编码并训练了你的第一个神经网络。下次见,再见。
用于制造质量控制的张量流
ByPriya DWI vedi,数据科学家@ SpringML
人工智能正在改变每个行业。在制造业,人工智能和机器学习正在自动化质量控制方面发挥巨大作用。目视检查和问题识别是一项挑战,通常需要大量人力。例如,正确的包装是一个重要的步骤,不仅用于品牌,也用于物流目的。包裹上印有代码,允许制造商跟踪包裹的时间、来源和路线。
SpringML 的标签检测应用程序使用机器学习来识别包装标签中的异常。这款应用可以实时观看视频或包装图片,并提取文本。如果文本不符合标准,它会实时发出警报。
这是一个具有挑战性的问题,原因有几个——视频镜头可能不稳定,因此盒子上序列号的位置会在帧之间发生变化,盒子的运动模糊了序列号,裁剪出的文本分辨率较低,这对于标准 OCR 包来说是一个具有挑战性的输入。
我们通过使用谷歌的 Tensorflow 对象检测框架解决了这个问题。
请看下面的结果。当预测的文本被完美地阅读时,一个绿色框形成。令人印象深刻的权利!!
OCR on moving objects
方法
解决这个问题有两个主要步骤:
- 检测盒子上序列号的位置
- 读取序列号
让我们详细讨论每一个问题
检测盒子上序列号的位置
如果摄像机位置固定,而传送带以恒定速度移动,那么您可以使用基于空间和时间的逻辑来识别并在传送带穿过框架时裁剪出序列号。然而,由于手持摄像机,这个问题更具挑战性,因此我使用 Tensorflow 对象检测框架来训练识别序列号的模型。要了解更多关于在这个框架上训练定制模型的信息,请查看我的这篇文章。
对象检测框架非常强大,您可以使用迁移学习在一组非常小的图像(本例中为 50-100 张图像)上训练您自己的模型。然后,您可以在剪辑上运行该模型,它会标记出序列号的位置。我们能够裁剪出这些图像,反转它们,增加它们的对比度,并保存它们以供下一步使用。请看下面的一些样本图片:
Sample output after step 1
读取序列号
正如你从上面的图片中看到的,由于模糊和细字体,即使经过一些预处理,裁剪出来的图像质量也非常低。即使是最好的 OCR 软件包之一——Google Vision API 也难以处理这种类型的输入。Vision API 提供了一个非常好的 web 界面,可以在样本图像上快速尝试 API。请看这个链接。
请参见下面的 Vision API OCR 对上面示例的输出:
经过一些实验后,最终采用的方法是训练第二个对象检测模型,该模型可以识别序列号中的每个数字和字母,如 1、7、3、N、H、4、2、C 等。第二个对象检测模型将检查图像并标出它可以识别的每个字母或数字,最后我们将得到的字符连接起来形成完整的字符串。
那么,这种方法为什么有效呢?
原因是模型是在这个特定数据上训练的。通过给它看许多“7”的模糊照片,我们可以训练它在这种情况下“7”是什么样子。
参见下面第二个对象检测模型的输出:
Letter/Number detection model
结论
这种自动化技术可以部署在制造工厂,以提高包装的准确性,减少物流和运输错误。TensorFlow 对象检测提供了在制造工厂内部署此类解决方案的灵活性,因此可以进行实时预测。
SpringML 是谷歌云平台的首要合作伙伴,专注于机器学习和大数据分析。我们已经在多家财富 500 强企业中实施了预测和分析解决方案。请联系了解更多:info@springml.com,www.springml.com
轻松安装 Tensorflow GPU:使用 conda 代替 pip [Update-2]
想在你的 GPU 机器上安装 Tensorflow,运行那些 GPU 吃深度学习算法?你来对地方了。我有一个配置不错的 GPU,以前玩 FIFA 都是用它。换成 AI,本来想用 GPU 做深度学习,而不是玩游戏。但是……我害怕 Tensorflow 安装不兼容的 CUDA 版本。在这篇文章中,我将解释传统的方法和新的优化方法,以及为什么我们应该放弃 pip 而使用 conda。
如果你是一个 UBUNTU 用户,想要一步一步的使用 LONG 方法,那么我已经在这里发表了一篇完整的文章:
[## Tensorflow GPU 安装变得简单:Ubuntu 版本
在 ubuntu 上安装 Tensorflow GPU 对于正确版本的 cuda 和 cudnn 来说是一个挑战。一年前,我写了一篇…
medium.com](https://medium.com/@harveenchadha/tensorflow-gpu-installation-made-easy-ubuntu-version-4260a52dd7b0)
传统方法
要安装 Tensorflow for GPU,我必须遵循以下步骤(这些步骤适用于 windows):
- 先弄清楚 GPU 是否兼容 Tensorflow GPU!(来自这里)
- 从这里下载并安装 Cuda 工具包。
- 在 Nvidia 开发者网站注册下载 cuDNN
- 通过将 cuDNN 的内容提取到步骤 2 中安装的工具包路径中来安装 cuDNN。CUDA Toolkit 目录中会有一些你必须替换的文件。
- 就这样吗?不,那么你需要检查你的路径变量是否存在 CUDA_HOME。如果没有,请手动添加。
- 然后检查路径变量,看工具箱路径是否可用。
- 然后最后安装 Anaconda 或 Miniconda
- 创建安装了 Python 和 Pip 包的环境。
- 然后最后’ pip 安装 tensorflow-gpu '。
- 测试您的安装。
你会说这很简单,对吗?为什么不试一试呢?请记住,我没有为上述任何步骤提供视觉效果,因为这些只是为了让您了解,并解释我们在此过程中遇到的问题。
这个过程有 1%的概率会对你有利!
为什么?
由于版本编号的原因
Figure 1. Source
Tensorflow 的不同版本支持不同的 cuDNN 和 CUDA 版本(在此表中,CUDA 有一个整数值,但当您下载时,它实际上是一个浮点数,这使得编号和兼容性更加困难)。cuDNN 和 conda 也不是 conda 的一部分。
获奖的新方法
安装 Miniconda 或 Anaconda,然后运行这个命令。
conda create --name tf_gpu tensorflow-gpu
嗯是这样吗?是的。
该命令将创建一个以“tf_gpu”命名的环境,并将安装 tensorflow-gpu 所需的所有软件包,包括cuda 和 cuDNN 兼容版本。
Figure 2. cuDNN and Cuda are a part of Conda installation now
此外,它也不会干扰您当前已经设置好的环境。
如果你很难想象这个命令,我会把它分成三个命令。
conda create --name tf_gpuactivate tf_gpuconda install tensorflow-gpu
注意:这也适用于 Ubuntu 用户。不再需要很长的脚本来让 DL 在 GPU 上运行。
测试 Tensorflow 安装
要测试 tensorflow 安装,请遵循以下步骤:
- 打开终端,使用*‘激活 TF _ GPU’激活环境。*
- 使用python进入 python 控制台
import tensorflow as tfsess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
Figure 3. Validating your Tensorflow Installation
阅读我在 Medium 上的其他文章:
关于我:我是一名自动驾驶汽车工程师,专注于使用深度学习为车辆提供智能。如果你遇到任何困难,请通过 LinkedIn 联系我。
此信息最初在此发布。这篇文章也谈到了张量流计算的一些改进,但我现在并不关心这些,因为那不是我的首要任务,😄
更新 1 :一些用户抱怨它不能在 Ubuntu 上工作,我发现你需要在 Ubuntu 上手动安装与卡兼容的驱动程序。此外,如果您已经设置了任何其他环境,那么它是一个烂摊子,这可能不会帮助你。
更新 2 :这篇文章已经被阅读了超过 50k 次,甚至 Aurélien Géron 也推荐使用这个技巧来安装 Tensorflow。
如果你是一个 UBUNTU 用户,想要一个使用 LONG 方法的逐步指南,那么我在这里发表了一篇完整的文章:
[## Tensorflow GPU 安装变得简单:Ubuntu 版本
在 ubuntu 上安装 Tensorflow GPU 对于正确版本的 cuda 和 cudnn 来说是一个挑战。一年前,我写了一篇…
medium.com](https://medium.com/@harveenchadha/tensorflow-gpu-installation-made-easy-ubuntu-version-4260a52dd7b0)
张量流图像:在 GPU 上增强
深度学习可以解决许多对人类来说似乎不可能的有趣问题,但这是有成本的,我们需要大量的数据和计算能力来训练深度神经网络。
为了解决数据问题,我们可以使用数据扩充。增强也可能需要大量的计算,因为我们可能需要增强数百万张图像,为了处理这一点,我们可以使用 tensorflow.image,它提供了一些基本的图像功能,所有的计算都在 GPU 上完成。
我正在使用 tensorflow eager_execution,这样我们就可以在不运行会话的情况下看到增强的结果,如果你想了解更多关于 eager_execution 的信息,请阅读此处。
让我们来看看一些增强功能:
1.加载图像
张量流图像函数期望传递的图像是张量。让我们加载一幅图像并将其转换为张量:
img = matplotlib . py plot . im read('/img _ path ')
TF _ img = TF . convert _ to _ tensor(img)
Image soure:https://cdn-images-1.medium.com/max/1000/1*ULBhR9EVavi-HhpdbrjEzQ.jpeg
2.应用增强功能
在这里,我们将看到不同类型的增强,可以适用于图像。
a.翻转图像
一个最基本的增强是将翻转应用于图像,这可以使数据翻倍(基于你如何应用)。
水平翻转:
brright _ img = TF . image . flip _ left _ right(TF _ img)
Horizontally Flipped Image
垂直翻转:
brright _ img = TF . image . flip _ up _ down(TF _ img)
Vertically flipped Image
**随机翻转:**您的图像有 1/2 的几率会水平或垂直翻转。
brright _ img = TF . image . random _ flip _ left _ right(TF _ img)
brright _ img = TF . image . random _ flip _ up _ down(TF _ img)
或者,您也可以使用 tf.reverse 进行同样的操作。tf.reverse 接受一个附加参数,即 axis,它定义了图像应该沿 x 轴或 y 轴翻转的位置。
brright _ img = TF . reverse(TF _ img,axis =[0])#垂直翻转
brright _ img = TF . reverse(TF _ img,axis =[1])#水平翻转
b.图像旋转
Tensorflow 提供*tensor flow . image . rot 90()*函数,将图像逆时针旋转 90 度。
brright _ img = TF . image . rot 90(TF _ img,k = 1)
Rotated Image
图像将逆时针旋转 90 度 k 次。
c.聪明
用下面的代码改变图像的亮度:
brright _ img = TF . image . adjust _ brightness(TF _ img,delta= 0.2)
Brightened Image
其中δ是要加到每个像素上的值的量。δ值越大,图像越亮。如果 delta 为负,那么图像将变暗。如果你想应用随机亮度,你可以使用下面的函数:
brght _ img = TF . image . random _ brightness(TF _ img,max_delta=0.5)
Random brightness
Delta 将介于-max_delta 和 max_delta 之间。
d.其他方法
除了上述方法之外,还有如下类似的方法可用于图像增强:
[tf.image.adjust_contrast](https://www.tensorflow.org/api_docs/python/tf/image/adjust_contrast)
[tf.image.random_contrast](https://www.tensorflow.org/api_docs/python/tf/image/random_contrast)
[tf.image.adjust_hue](https://www.tensorflow.org/api_docs/python/tf/image/adjust_hue)
[tf.image.random_hue](https://www.tensorflow.org/api_docs/python/tf/image/random_hue)
[tf.image.adjust_gamma](https://www.tensorflow.org/api_docs/python/tf/image/adjust_gamma)
[tf.image.adjust_saturation](https://www.tensorflow.org/api_docs/python/tf/image/adjust_saturation)
[tf.image.random_saturation](https://www.tensorflow.org/api_docs/python/tf/image/random_saturation)
3.其他图像处理任务
除了图像增强,tf.image 还提供了一些其他有用的图像处理功能。
农作物
Tensorflow 提供了以下用于裁剪图像的功能。
br right _ img = TF . image . central _ crop(TF _ img,0.5)
central_crop 使图像沿每个维度远离中心,并移除外部部分。
brght _ img = TF . image . crop _ to _ bounding _ box(TF _ img,offset_height = 100,offset_width = 100,target_height = 400,target_width = 800)
通过提供偏移和图像尺寸值,crop_to_bounding_box 可以帮助您裁剪图像的特定区域。
如你所见,Tensorflow 提供了一些基本类型的图像函数,可以帮助你增加图像数据。你可以在这里探索更多关于 he tensorflow.image class 。
TensorFlow 图像识别 Python API 教程
在带有 Inception-v3 的 CPU 上(以秒为单位)
这是在你的笔记本电脑或电脑上进行图像识别的最快和最简单的方法,不需要任何 GPU,因为它只是一个 API,而你的 CPU 足以胜任这一工作。
我知道,我对这个特定的 API 有点晚了,因为它是 tensorflow 早期版本附带的。API 使用在 1000 类 *上训练的 CNN 模型。*更多详情请参考本 张量流页面 。
在我开始向你们展示如何用任何图像实现这个 API 之前,这里有一个例子…
输入是航天火箭/航天飞机的图像,不管你怎么称呼它。
Fig: Rocketlaunch.jpg
命令行的输出是“航天飞机(得分= 89.639%)”。
Fig: Space shuttle (score 89.639%)
如果你有 linux 或者 Mac 也不用担心。我敢肯定,这将在任何 CPU 的每个系统上工作,假设你已经安装了 TensorFlow 1.4。
整个过程将分 4 步完成:
1.从 tensorflow 资源库下载模型。
转到 tensorflow 存储库链接并下载到您的计算机上,并将其解压缩到根文件夹中,因为我使用的是 Windows,所以我会将其解压缩到“C:”驱动器中。
现在将文件夹命名为“模型”。
2。命令行
打开命令提示符(以管理员身份)。
现在,我们需要运行"*models>tutorials>imagenet>classify _ image . py "*中的 classify_image.py 文件。
Fig: Running the classifier file
这将下载一个 200mb 的模型,这将有助于您识别您的图像。
如果一切正常,您将在命令提示符下看到:
giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.88493)
indri, indris, Indri indri, Indri brevicaudatus (score = 0.00878)
lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (score = 0.00317)
custard apple (score = 0.00149)
earthstar (score = 0.00127)
现在,为了确保我们理解如何正确使用它,我们将做两次。一次将图像文件保存在“模型>教程> imagenet > ”目录中,第二次将图像保存在不同的目录或驱动器中😏
3.下载目录中的图像
您可以随意使用互联网或其他任何地方的任何图像,并使用 classify_image.py 将其粘贴到“models>tutorials>imagenet【images.png】T42目录中,然后我们会将其粘贴到“D:\ images.png”或您想要的任何目录中,只是不要忘记在命令提示符中键入正确的地址。我使用的图像如下。
Fig: images.png
4.使用命令提示符执行识别
为此,您只需编辑“—图像文件*”参数,如下所示。*
a)与 classify_image.py 文件在同一目录下的图像。进入 imagenet 目录后,打开命令提示符并键入…
python classify_image.py --image_file images.png
Fig: images.png is the same directory
b)对于不同目录中的图像通过指向放置图像的目录进行键入。
python classify_image.py --image_file D:/images.png
Fig: images.png in different directory
结果
现在,显然两张图片的结果是相同的,如下所示。
Fig Result for images.png
如你所见,分数相当准确,即手机的分数为 98.028%。
注意:您可以随意使用任何您想要的图像,并将其保存在任何目录中。只要记住输入正确的图像路径。
下一步:转到 对您的自定义图像进行新类别的培训。
我已经尽力让文章尽可能准确易懂。有什么意见,建议或者有什么问题,写在评论里吧。
关注我中、脸书、推特、 LinkedIn 、 Google+ 、 Quora 看类似帖子。
鼓掌吧!分享一下!跟我来。
乐意帮忙。荣誉………
你会喜欢的以前的故事:
2.历元对批量对迭代
3.感知器是什么鬼?
TensorFlow.js 全栈入门套件
使用 TensorFlow-Stack-TS 启动您的人工智能项目
Kickstart Your AI Project with TensorFlow-Stack-TS
开始一个新的人工智能项目有许多事情要考虑,用你遇到的一堆工具进行概念验证可能是一条路。但是一旦项目的这一阶段结束,你将需要考虑工程!获得一个可以工作的测试平台,或者更好——一个可以开发应用程序的应用环境。最近,当我试图为一个基于 AI/TensoFlow 的项目建立应用程序堆栈时,我发现我过去使用的基于均值的模板远远落后,没有完全集成最新的技术。所以我决定把最新最棒的为我工作的库放在一起,作为一个新的全栈模板。在看到它对我的项目有多么有用之后,我现在开源了它。
有什么好处?
谷歌的 TensorFlow.js 运行在 NodeJS 环境的后端上——V8 单线程 Javascript 引擎,使用八进制 WebGL 或 CUDA 二进制文件进行硬件加速。在这种环境下,用大型数据集训练复杂模型似乎是行不通的。一个更合理的方向是(1)采用在别处构建的大型模型,转换它,并使用这个后端服务于客户的请求。在 cloud/K8S 上运行这样的应用程序并根据需要进行扩展是很容易的。使用它来(2)探索一个模型,可视化它并调整它的参数是一个很好的选择。不考虑这里的 AI 引擎,这是(3)一个很好的集成库和现代开发环境,可以快速启动任何 web/mobile/native 项目。
盒子里有什么?
集成良好的全栈工作样本:
- TensorFlow.js 后端引擎预装了一个简单的模型来查看它的运行情况。
- 集成到响应式 web/移动应用程序中的可视化库:一个用于运行上述模型并可视化其预测的仪表板。
- 一种跨堆栈的编码语言— TypeScript/Javascript 完全支持 ES6,所有代码都支持 async/await。
- 基于 GraphQL 模式的最新 API。
- 现代的开发工具,可以热重载变更、林挺、单元测试和代码覆盖报告。作为 IDE 和调试器很好地集成到 VSCode 中。
- 保持简单的哲学跨越!我已经通过而不是节省了大量的学习曲线时间,包括一堆我觉得过时或繁琐的库:REST、yarn、Babel、Redux、Apollo server/client、Enzym、Winston/Bunyan、Relay…
TensortFlow-Stack-TS running in development
堆栈中的主要集成库
后端
- TensorFlow.js 引擎
- 基于 GraphQL 的 API 来为— 节点提供信息。JS / 打字稿环境和工具与蒙迪蒙/热重装 TFJS 发动机
- KoaJS 网络服务器、中间件和健康检查
- typegql —基于 TypeScript 注释的简化 GraphQL 模式
- GraphQL用于探索 graph QL 模式的浏览器内集成开发环境
- Dotenv-扩展用于基于环境的配置(见
.env
文件) - Jest —具有良好覆盖率的单元测试
- VSCode 启动设置
客户端
- Vega-lite —用于制图和可视化
- Ant Design/TypescriptReact components—响应式仪表板
- 更少/LCSS —更好的造型
- ts-FSM—React 的简化状态管理
- graphql-请求 —简化的 graph QL 客户端
- Jest —基于 React 的单元测试
- 节点。JS/Typescript 工具,包括带有 babel 和热模块替换的 web pack(HMR)
- 客户端基于带有 antd-demo 脚本的 react-create-app,不会被弹出。
主要兴趣点
mono-repo 分为服务器端(后端)项目和客户端(前端)项目。后端运行 TensorFlow 模型和一个调用它的 API。客户端是一个单页面的响应式应用程序,它通过 API 调用模型,并显示结果的图表。
- TensorFlow 模型作为“模型提供者”在
src/tensorFlowProvider
文件夹中实现。它遵循一个简单的初始化> >训练> >编译> >预测的工作流程。如果需要一个不同的引擎,很容易实现一个基于其他 AI 引擎的类似提供者。 - 模型的客户端在
client/src/components/server-predict-card
中实现。在那里你可以找到一个输入输出表单,一个可视化面板和一个驱动它们的小模型。可视化面板规范可在VegaLiteSpec
文件中找到。你可以在织女星网站上找到一堆图表规格的例子。 - 后端 API 在
src/graphqlApi
中的 GraphQL 模式上实现,并由模式浏览器提供服务(仅限开发构建)。 - API 的客户端在
client/src/utils/graphqlQuery
中实现为通用的 GraphQL 客户端,在client/src/components/graphql-types
中实现为一堆接口。 - 性能:如上所述,TensorFlow.js 在后端与“标准的”基于 TF-Python 的环境有很大不同。我找不到好的基准。如果你在下面的评论里提到我,我会很高兴。
这个项目可以从我的 Github 中克隆出来— 这里
很高兴得到评论,加强该项目等援助。如果您的项目需要一些咨询,请联系我。欢迎你来星/拍手/点赞/分享给我看看你有多牛逼,帮助别人找到这个故事;-)
干杯!
eram at weblegions dot com
原载于 Github
TensorFlow + Jupyter 笔记本+ Nvidia DIY 设置
基于我的第一个故事,更详细的使用 Xbuntu / Ubuntu 17.04 的逐步设置。请注意,我们将使用拥有 sudo 权限的用户,而不是直接拥有 root 权限的用户。
Nvidia 驱动程序设置
安装 Nvidia 驱动程序库
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential cmake g++ gfortran git pkg-config python-dev software-properties-common wget
从 Nvidia 安装 CUDA 8.0,获得基础安装程序和补丁 2。CUDA 也将安装 nvidia 驱动程序,相应地专门针对 CUDA 版本
sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-*amd64.deb
sudo apt-get update
sudo apt-get install cuda
为本地用户设置 CUDA 环境
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
使用测试它
nvcc -V
最后安装 cuDNN,从 Nvidia 获取,这个是后面给 Tensorflow 的。为当前安装的 CUDA 获取正确的版本
cd ~/Downloads/
tar xvf cudnn*.tgz
cd cuda
sudo cp */*.h /usr/local/cuda/include/
sudo cp */libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
Anaconda 设置
使用 Python 3.6 从 Anaconda 获取安装程序,并遵循安装说明
cd ~/Downloads/
bash Anaconda3-4.4.0-Linux-x86_64.sh
通常我会将 Anaconda 安装在/opt 文件夹下。
如果安装在主文件夹下,我们需要在激活环境后找到环境文件夹
source activate tf-gpu
echo $PATH
这对以后设置 Jupyter 笔记本很重要。
TensorFlow 设置
一旦我们安装了 Anaconda,我们将为 Jupyter 设置创建一个环境,并安装 TensorFlow GPU
conda create --name tf-gpu python=3.6
source activate tf-gpu
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.3.0-cp36-cp36m-linux_x86_64.whl
Jupyter 设置
一旦我们安装了 TensorFlow,我们将安装 Jupyter,我们将使用 conda 来管理 Jupyter 笔记本和 shell 运行时的包
conda install jupyter notebook numpy pandas matplotlib
DDNS 设置
安装任何 ddns 客户端能够更新域,所以我们可以连接回我们的家庭服务器。我们可以为此使用 NoIP ,它有 linux 客户端来更新域。
NGINX 设置
确保我们在使用 letsencrypt 之前停止当前的 nginx,而不是购买 SSL 证书,因为我在节约成本
sudo systemctl stop nginx
一旦 NGINX 停止,我们可以运行初始的 letsencrypt 命令,该命令将使它自己的内部服务器脱离验证过程
使用命令克隆 letsencrypt,然后设置初始证书
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencryptsudo -H /opt/letsencrypt/letsencrypt-auto certonly --[email=me@chclab.net](mailto:email=me@chclab.net) -d deeplearning.chclab.net -d jupyter-cpu.chclab.net -d jupyter-nvidia.chclab.net -d monitor.chclab.net
设置 cron 作业以运行证书续订过程
0 0 * * * /opt/letsencrypt/letsencrypt-auto renew --quiet
在~/start-tf-jupyter-gpu.sh 创建一个 shell 脚本来启动 Jupyter Notebook,这将使用我们之前设置的名为 tf-gpu 的 conda 环境。
#!/bin/bash
export PATH=/home/chc/.conda/envs/tf-gpu/bin:$PATH
/home/chc/.conda/envs/tf-gpu/bin/jupyter notebook --no-browser --NotebookApp.allow_origin='*' --notebook-dir='/home/chc/project' --NotebookApp.port=9999
使用以下命令保护 Jupyter 笔记本,更多信息请点击此链接
jupyter notebook --generate-config
jupyter notebook password
在sudo VI/etc/systemd/system/jupyter-GPU . service创建一个 Systemctl 服务
[Unit]
Description=Service for jupyter cpu notebook
After=local-fs.target network.target[Service]
Type=simple
User=chc
Group=chc
ExecStart=/home/chc/start-tf-jupyter-gpu.sh
Restart=always
SyslogIdentifier=jupyter cpu notebook[Install]
WantedBy=multi-user.target
启用该服务并尝试运行它
sudo systemctl daemon-reload
sudo systemctl enable jupyter-gpu.service
sudo systemctl start jupyter-gpu.service
sudo systemctl status jupyter-gpu.service
安装 NGINX
sudo apt-get install nginx
设置以下 NGINX,对我来说是sudo VI/etc/NGINX/conf . d/jupyter-NVIDIA . chc lab . net . conf
upstream notebook-tensorflow {
server localhost:9999;
}
server {
server_name jupyter-nvidia.chclab.net;
listen 443 ssl;
access_log off;ssl_certificate /etc/letsencrypt/live/deeplearning.chclab.net-0001/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/deeplearning.chclab.net-0001/privkey.pem;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# disable HSTS header for now
#add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;ssl_dhparam /etc/ssl/certs/dhparam.pem;location / {
proxy_pass [http://notebook-tensorflow](http://notebook-tensorflow);
proxy_set_header Host $host;
}location ~ /api/kernels/ {
proxy_pass [http://notebook-tensorflow](http://notebook-tensorflow);
proxy_set_header Host $host;
# websocket support
proxy_http_version 1.1;
proxy_set_header Upgrade "websocket";
proxy_set_header Connection "Upgrade";
proxy_read_timeout 86400;
}
location ~ /terminals/ {
proxy_pass [http://notebook-tensorflow](http://notebook-tensorflow);
proxy_set_header Host $host;
# websocket support
proxy_http_version 1.1;
proxy_set_header Upgrade "websocket";
proxy_set_header Connection "Upgrade";
proxy_read_timeout 86400;
}
}
生成一个强 dhparam 文件
openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
重启 NGINX
sudo systemctl restart nginx
最后是使用 Jupyter 笔记本的样子
张量流:不知道从哪里开始?
TensorFlow 是一个库,可以应用于所有的机器学习算法,特别是神经网络深度学习。机器学习就是那些被编写来处理大型数据集以从中发现模式并提取信息的程序。它实际上从数据中学习,以做出准确或接近准确的预测,并更好地自我修正。就像我们希望有人做的那样。图像识别及其增强甚至识别是 ML 的一些应用。这只是问题的一个范畴,分类。回归在图形中现有数据之间画一条线,并根据这条线对图形中的新数据进行分类。聚类是根据数据的相似性和差异性来划分数据。规则提取是寻找如果“这个”那么“我会做那个”的模式。ML 算法查看已经被正确标记整批数据或预先存在的数据的语料库,并从该语料库中提取有意义的信息。利用这一点,分类器将找出新样本所属的类别。分类器的准确性主要取决于我们给算法的语料库。分类器是通过向分类算法提供语料库(正确标记的数据集)并训练自己输出分类器而制成的。与早期的基于规则的分类器相比,基于 ML 的分类器总是学习和动态的。特征向量是分类器的输入,标签是分类器的输出。表示基于 ML 的系统指出应该注意什么特征。这些是特征选择算法。
深度学习系统是一种表示系统
深度学习算法学习重要的特征,以便使预测变得重要。
神经网络是一类侧重于特征选择的深度学习算法。神经网络是由称为神经元的核心学习元素构成的。神经元是学习或理解其可用语料库中模式的最简单的元素。(深入:神经元看起来是什么样子,以及它如何与数据交互)。深度学习算法基于层,其中每层识别一个特征。每一层将它们的数据传递给下一层,下一层关注于寻找另一个特征,并继续下去。最后一层把所有东西放在一起,找到物体。我们向其提供输入或输出的那些层被称为可见层,而在它们之间的那些层被称为隐藏层。之所以这样称呼它们,是因为它们的输入和输出对我们来说是隐藏的。
世界上所有的问题都可以用图来建模。这些图形被称为计算图或数据流图,它在数据流经图形时转换数据,并实现非常复杂的数字计算。TensorFlow 可以在一个机器集群上运行。将问题建模为图形也可以进行大规模并行操作。TensorBoard 是浏览器中的一个可视化工具,用于在屏幕上查看图形模型,以了解数据如何流动以及如何被它转换。它还能够预测你建立的模型非常迅速和容易。TF 对于新的最大似然算法的 R&D 非常有用。可以在集群中的不同机器上计算图形的不同部分,从而允许我们处理巨大的数据集。
在 TensorFlow 中,一切都是图形。python 设置在图表中形成节点和边。TensorFlow 中的编程包括为您的解决方案构建一个名为 network 的图形模型。每个节点都是一次计算。数据是连接节点的边。这些边叫做张量。张量在图形中流动,并在途中转换。当输入可用时,计算每个节点。(解释一个张量流问题的模型)。
计算图是张量流表示现实世界中任何模型的方式。在这里,我们将对计算图中的节点、边和依赖关系进行建模,并用 TensorBoard 对其进行可视化。边是那些连接节点的线。这些计算图形中的数据称为张量(端维矩阵)。有向无环图是(无环)这样的图,其中每条边都有一个指向前方的箭头来给出结果。它可以向多个节点发送和接收数据。从其他节点接收数据节点被称为相关性。终端节点被称为间接节点,因为它们要么直接接受输入,要么直接给出输出。有圈的图永远不会完成计算。因此只有 tensorflow 只能计算有向无环图。
最大似然算法有反馈回路,这是一个行动的循环。为了解决这个问题,tensorflow 引入了一种不形成循环的工作方法。Tensorflow 通过在第一个图形的末尾创建一个图形副本,并将数据发送到该副本来实现这一点。原始图形将经历循环。它可以根据需要创建任意多副本。这个算法迭代多次。
现在我们要做一个张量流程序。第一步是建立一个图表。这里我们指定数据和操作。然后我们将执行图形来获得结果。
TensorFlow 库生成数千个节点来执行计算。确保在激活安装在您机器上的 TensorFlow 后,您正在终端中运行以下程序。
续上 TensorFlow 新手上手。
张量流物体探测,脸书出版物综述
在之前的故事中,我们在图像中检测到一些物体,然后我们做了一个扩展来分析一个视频,以一种非常基本但实用的方式,今天我们有了另一个挑战。我们能从任何可用的社交网络的共享图片中发现社交方法中的某些东西吗?。我们能做这个探索社交流的操作吗?
让我们假设我们不分析这种情况的真实背景,我们只关注共享出版物的图像。同样,这一方案将有助于启动对所提议的社会环境的分析。让我们使用脸书作为我们的示例实现。
操作总图:
要执行的操作:
- 社交用户连接。
- 阅读/扫描每份出版物。
- 图像的提取。
- 图像分析(使用 Tensorflow 对象检测 API)
- 对检测到的标签进行分组。
让我们看一下提议的实现。分析我自己的个人资料(40 篇文章)。
按照建议的操作注销:
在带有发布时间线的列上建模的信息:
注:我把水果、食物、汽车、人、零食这些概念进行了归类。从与每个帖子相关的图片中共享的内容行。
我们将使用日期为 06/19/2016 的出版物通过案例验证我们的信息。在这本书中,我们享受了一顿午后家庭小吃…
社会出版:
视觉图像分析:
检测到的概念及其信任值的数组:[{u’cup’: 99}、{u’cup’: 99}、{u’person’: 86}、{u’person’: 77}、{u’wine glass’: 76}、{u’dining table’: 69}、{u’chair’: 56}、{ u ’ potential plant ':53 }]
结论:
在这一领域有许多需要改进的地方,包括接收信息的上下文、个人/共享出版物中的过滤器、按更具代表性的元素分组以及更多的变化。但是,解决我们的挑战是一个很好的建议,我们有一个社会分析的概述(在这种情况下,脸书,但我们可以根据所需的社会信息量合并其他网络)
实施:
该例程接收要检查的用户 id、帖子数量和使用图形 API(脸书)的令牌。 这里的 实现了。
使用的技术:
- Tensorflow 1.2.1(对象检测 api)
- COCO 模式,更快 _ rcnn _ inception _ resnet _ v2 _ atrous _ COCO _ 11 _ 06 _ 2017
- 脸书 sdk
最后一个问题仍然悬而未决……了解人们的社会信息,我们能改善个人会议的环境和同理心吗?我们能利用社交图片做到这一点吗?
Tensorflow 对象检测 API —心电图分析
由于对象检测 API 是由 Tensorflow 团队发布的,因此训练一个具有相当高级架构的神经网络只需遵循几个简单的教程步骤。
但它毕竟是一种设计用来检测矩形框上带有颜色信息的对象的架构。我们究竟如何用它来分析 ECG 信号,这是一项与目标检测问题尽可能不同的任务?一种方法是将架构重新设计成某种序列到序列的观察器,它滑过信号,提取有趣的信息,关注,记住过去,预测未来,并充分探索机器学习彻底改变医疗过程的巨大可能性。
但由于这听起来真的很难,我会用 QRS 节拍将这些信号分割成小片段,并将其绘制到 2D 图像上。为了减少训练过程对网络的压力,我们将用一个漂亮的、平静的、7 像素宽的蓝绿色画笔在一个矩形画布上绘制它们,并使用低水平的红绿蓝噪声。
It’s not really turquoise.
这种方法可以自动生成一整套带有心电图搏动的图片数据集。事实证明,这些搏动有多种类型,如室性早搏或*房性早搏。*这些信号是通过连接到人体不同部位的电极获得的,事实证明,来自胸部的信号看起来与来自腿部的信号非常不同(心脏执行相同的动作)。对于不太著名的麻省理工学院-BIH 心律失常数据集,这种双重区分产生了 21 个类别,超过 700 次出现。你可以 在这里 购买一台免费的笔记本,在你自己的机器上完成所有那些花哨的处理。
因此,随着令人印象深刻的数据重组,我们现在有了一个定义良好的对象检测问题,有大量的标记数据。为了提出一个解决方案,我们将遵循来自官方 Tensorflow 资源库的牛津-IIIT 宠物 教程,该教程展示了如何通过重新训练的模型来识别不同品种的猫和狗。
Definitely a cat.
我们所需要做的就是调整脚本,该脚本将充满图像的目录转换成一对 tensorflow 记录,这是一种特殊的格式,可用于将数据输入预训练的模型。我们将使用 ssd_inception_v2_coco ,因为它拥有迄今为止最好的名字。
再多几个步骤,我们就可以从命令行消息开始监控进度了:
Make sure someone notices you intensively staring into those numbers popping up on your screen. You deserve to be recognized as a bona fide machine learning hacker.
如果你像我一样生活在第二世界国家,那里的计算能力和民主并不丰富,你可能需要在 2014 年的 4 个 CPU 内核的台式机上运行这个程序。几十个小时后,您可以运行评估脚本,并查看 Tensorboard 图像部分。
Normal beat on the V1 lead.
希望现在很明显我不是一个真正的医生(因为没有一个有博士学位的人是),现在仔细检查评估程序似乎太费力了,所以我真的不能从心脏病学的角度判断这些类别预测是否正确。因此,我直言不讳地提出另外两种节拍,它们似乎被归类为具有相当高的可信度。
Left: Normal beat on a V5 lead (allegedly). Right: Bundle branch block beat on a V4 lead (maybe).
所有用于生成这些突破性结果的代码都在这里。一旦训练程序完成加热我的电脑两千个纪元,我将添加一个更合适的分数评估。
TensorFlow 对象检测正在运行
本周,我和我的开发者伙伴兼全能达人 Sara Robinson 坐在一起,谈论她开发的应用程序,该应用程序与 T2 的 TensorFlow 对象检测 API T3 一起使用。
我们讨论了的博客文章和 GitHub 项目,她在该项目中编写了一个 iOS 应用程序,可以检测照片中的泰勒·斯威夫特。更值得注意的是,她开源了代码,所以你可以自己制作泰勒斯威夫特探测器!当然,你可以用你想检测的任何东西来训练这个模型。TensorFlow 团队最近更新了模型,不仅绘制了一个边界框,还填充了图像中发生检测的特定区域,绝对神奇!
请查看上面的完整采访视频,我们一步一步、一点一点地分解了 Sara 完成这个项目的过程。一定要坚持到最后的大失误:)
感谢阅读本集云 AI 奇遇。如果你喜欢这个系列,请为这篇文章鼓掌让我知道。如果你想要更多的机器学习动作,一定要关注 Medium 上的me或订阅 YouTube 频道来观看未来的剧集。更多剧集即将推出!
视频中的 TensorFlow 对象检测,避免披萨、甜甜圈和蛋糕
在之前的一篇文章中,我分享了一个挑战,我们分析了一个社交场景的图像,一次和朋友的晚餐。现在让我们来应对一个更大的挑战,让我们来分析视频。在这个挑战中,我们将只尝试检测视频中的违禁物品(披萨、甜甜圈、蛋糕)。让我们用一个简单的方法。
- 我们将阅读视频,并按帧将它们分开(作为图像处理)
- 我们将使用基于 Tensorflow 对象检测 API[版本 1.2.1]的对象检测例程来分析每张图像。
- 我们可以重新组合视频来可视化结果。[我们必须知道这是一个耗费资源的过程]
- 由于我们不想直观地看到结果,我将提出一些建议。由于我们只需要以高概率识别一个对象,因此我们将设置规则,以便在视频中检测到这些标签时生成警报。
检测和警报程序包括:当我们发现一个被禁止的对象标签的概率很高时,我们将发出警报并关闭分析(在许多情况下使分析更快)。
对于视频的操作,我们将使用 OpenCv ,如果我们想对视频执行其他操作,我们也可以使用 moviepy 。[Python 环境]
让我们只关注寻找概率大于 50% 60% 90%的标签[示例],如果我们发现这种情况,为了简化挑战,我们将关闭检测例程。
让我们看看提出的 3 种情况:
油炸圈饼盒
*让我们详细说明第一种情况
视频摘录与视觉检测相结合:
常规检测和警报动画:
*此建议方案分析视频,它也可以采用流式传输,并逐帧执行分析。
披萨盒
视频摘录与视觉检测相结合:
蛋糕盒
视频摘录与视觉检测相结合:
现在,如果你的伴侣禁止你摄入这些食物,你将不得不更加小心,或者至少避免有它的视频。这里是完整的例程。
从零开始使用 Docker 进行 TensorFlow 对象检测
在这篇文章中,我想告诉你如何用 TensorFlow 创建 docker 图像,并运行 对象检测示例 。
为什么是 Docker?
Docker 提供了一种在容器中运行安全隔离的应用程序的方法,该容器打包了所有的依赖项和库。安装很容易。我有一篇关于 Docker 的有趣文章: 使用 Docker 做正确的事情。
什么是张量流?
这是一个机器智能的开源软件库。
关于张量流
TensorFlow 是一个使用数据流图进行数值计算的开源软件库。图中的节点表示数学运算,而图边表示它们之间通信的多维数据数组(张量)。灵活的架构允许您使用单个 API 将计算部署到台式机、服务器或移动设备中的一个或多个 CPU 或 GPU。TensorFlow 最初是由谷歌机器智能研究组织内谷歌大脑团队的研究人员和工程师开发的,目的是进行机器学习和深度神经网络研究,但该系统足够通用,也适用于各种其他领域。
首先,我们需要创建目录和 Dockerfile 来构建我们的映像:
mkdir tensorflow
cd tensorflowtouch Dockerfile
我们将使用 ubuntu 镜像作为基础,因此我们应该从 Ubuntu 官方库扩展我们的新镜像。并在以下时间后更新软件包:
**FROM** "ubuntu:bionic"**RUN** apt-get update && yes | apt-get upgrade
然后我们需要创建工作目录:
**RUN** mkdir -p /tensorflow/models
并用 pip 安装git;
**RUN** apt-get install -y git python-pip
**RUN** pip install --upgrade pip
目前就这些。由于我们要运行 对象检测示例 我们需要安装所有的依赖项。所有步骤你可以在 安装页面 上找到。
Tensorflow 对象检测 API 依赖于以下库:
- Protobuf 2.6
- 枕头 1.0
- lxml
- tf Slim(包含在“tensorflow/models/research/”结帐中)
- Jupyter 笔记本
- Matplotlib
- 张量流
有关安装 Tensorflow 的详细步骤,请遵循 Tensorflow 安装说明。我们将使用命令安装 Tensorflow:
**RUN** pip install tensorflow
其余的库可以通过 apt-get 安装在 Ubuntu 上:
**RUN** apt-get install protobuf-compiler python-pil python-lxml
**RUN** pip install jupyter
**RUN** pip install matplotlib
接下来,我们需要将示例代码复制到我们的映像中:
**RUN** git clone [https://github.com/tensorflow/models.git](https://github.com/tensorflow/models.git) **/tensorflow/models**
让我们制作/tensorflow/models/research 我们的工作目录:
**WORKDIR** /tensorflow/models/research
Tensorflow 对象检测 API 使用 Protobufs 来配置模型和训练参数。在使用框架之前,必须编译 Protobuf 库。这应该通过运行以下命令来完成:
**RUN** protoc object_detection/protos/*.proto --python_out=.
在本地运行时,应该将/tensorflow/models/research/和 slim 目录附加到 PYTHONPATH 中。这可以通过运行以下命令来完成:
**RUN** export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
接下来我们需要配置 jupyter 笔记本:
**RUN** jupyter notebook --generate-config --allow-root
**RUN** echo "c.NotebookApp.password = u'sha1:6a3f528eec40:6e896b6e4828f525a6e20e5411cd1c8075d68619'" >> /root/.jupyter/jupyter_notebook_config.py
最后一行是为 web 界面设置 root 密码。
为了处理来自主机的请求,我们需要公开端口:
**EXPOSE** 8888
并运行主流程:
**CMD** ["jupyter", "notebook", "--allow-root", "--notebook-dir=/tensorflow/models/research/object_detection", "--ip=0.0.0.0", "--port=8888", "--no-browser"]
所以完整的 Dockerfile 文件:
**FROM** "ubuntu:bionic"**RUN** apt-get update && yes | apt-get upgrade**RUN** mkdir -p /tensorflow/models**RUN** apt-get install -y git python-pip
**RUN** pip install --upgrade pip**RUN** pip install tensorflow**RUN** apt-get install -y protobuf-compiler python-pil python-lxml**RUN** pip install jupyter
**RUN** pip install matplotlib**RUN** git clone [https://github.com/tensorflow/models.git](https://github.com/tensorflow/models.git) /tensorflow/models**WORKDIR** /tensorflow/models/research**RUN** protoc object_detection/protos/*.proto --python_out=.**RUN** export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim**RUN** jupyter notebook --generate-config --allow-root
**RUN** echo "c.NotebookApp.password = u'sha1:6a3f528eec40:6e896b6e4828f525a6e20e5411cd1c8075d68619'" >> /root/.jupyter/jupyter_notebook_config.py**EXPOSE** 8888**CMD** ["jupyter", "notebook", "--allow-root", "--notebook-dir=/tensorflow/models/research/object_detection", "--ip=0.0.0.0", "--port=8888", "--no-browser"]
要构建我们的形象营销:
docker build -t tensorflow .
你会看到这个过程:
要从映像运行容器,请使用命令:
docker run --name tensorflow -p 8888:8888 -d tensorflow
并打开 http://localhost:8888/ :
我们的密码是 root :
打开object _ detection _ tutorial . ipynb:
这是 Tensorflow 对象检测示例,我们的目标。
在运行之前,你需要做一个小的更新。将 TensorFlow 的版本从 1.4.0 更改为 1.4.1(目前为最新版本):
点击顶部菜单单元格->-运行全部即可运行:
之后你会发现我们的工作成果:
要停止它运行:
docker rm -f tensorflow
仅此而已。我们刚刚用 Google TensorFlow 创建了 docker 图像,并基于该图像运行了容器。多亏了 jupyter notebook,我们可以在浏览器中测试我们的例子。在下一篇文章中,我将展示如何使用不同的模型。
参考
- 使用 Docker 做正确的事情
- 张量流
- 张量流模型
- 用 Tensorflow 和 OpenCV 构建实时物体识别 App
- 如何用 TensorFlow 的物体检测器 API 训练自己的物体检测器
- Google tensor flow 物体检测 API 是实现图像识别最简单的方法吗?
- 用 Tensorflow 对象检测 API 构建玩具检测器
- 使用物体检测实现更智能的零售结账体验
- 张量流检测模型动物园
手机上的 tensor flow:tensor flow Lite
我们得到了什么?
TensorFlow Lite 是一款轻量级产品,是 TensorFlow Mobile 的下一步。你可以在 TensorFlow mobile 上做几乎所有的事情,但速度要快得多。
就像 TensorFlow Mobile 一样,它主要专注于移动和嵌入式设备开发人员,以便他们可以在 Android、iOS、Raspberry PI 等系统上开发下一级应用程序。
怎么更快?🚀
它支持一组核心操作符,包括量化操作符和浮点操作符,这些操作符已经针对移动平台进行了调整。
核心操作包括预融合激活和偏置,以进一步提高性能和量化精度。
TensorFlow Lite 支持在模型中使用自定义操作。
它是如何工作的?
让我们看看这个架构,了解它是如何工作的。
它从我们从训练数据生成的简单训练模型开始,然后执行测试。它将模型转换成 。tflite 模型文件格式,基于 FlatBuffer ,类似于协议缓冲区,但没那么多。Floatbuffer 的 codeprint 要小很多。
然后,根据操作系统,你想使用移动优化的解释器😎这使得应用程序更小更快。
解释器通过使用静态图排序和自定义内存分配器来确保最小负载、初始化和执行延迟。
Android 上的特殊:它提供了 Android 神经网络 API 库,用于设备之间更好的接口,以利用硬件加速。
我们得到了什么?
- 安卓神经网络 API 和 C++ API
- 新模型文件格式**。tflite👏**
3.速度:新的神经网络 API 使得计算速度更快。🏃
4.隐私:数据不会离开设备。🔐
5.可用性:离线工作。✈️
6.没有计算成本:所有的计算都在你的设备上进行。因此,不需要服务器。💵
7.**预测试模型:**所有模型开箱即用。📦
《盗梦空间》第三版
b) 移动网络
b)适用于所有第一和第三方应用程序😎Android Wear 上的智能回复。
权衡取舍😐
- 系统利用率:评估神经网络涉及大量计算,这可能会增加电池电量的使用。你应该考虑监控电池🔋健康,如果这是你的应用程序所关心的,特别是对于长时间运行的计算。
- 应用尺寸:注意你的模型尺寸。模型可能会占用数兆字节的空间。如果在 APK 中捆绑大型模型会过度影响用户,您可能需要考虑在应用程序安装后下载模型、使用较小的模型或在云中运行计算。NNAPI 不提供在云中运行模型的功能。☁️
️I 试图让这篇文章尽可能准确易懂。有任何意见、建议或者有任何问题,请在评论中写下。
有关如何在移动应用程序中使用 TensorFlow 的更多教程请关注我的Medium脸书TwitterLinkedInGoogle+Quora查看类似帖子。
鼓掌吧!分享一下!跟我来。
乐意帮忙。荣誉………
你会喜欢的以前的故事:
2.历元对批量对迭代