深度学习项目创意
Building Brains in Python
有许多很棒的教程可以帮助你开始深度学习生涯。然而,你会从尝试自己建造东西中学到最多。以下是一些常见的网络架构,以及它们如何应用于不同的项目:
深度前馈模式:
这是经典神经网络架构的最新版本。将输入通过一系列层传递到一个或多个输出节点。该模型非常适合处理 csv 数据集,如流行的 Pima-Indians 糖尿病数据集、iris flower 数据集等。这些模型基于两个基本的统计模型,即回归和分类器。在这些模型中,我们试图预测数字或分类输出。数字输出/回归映射到实数输出,如“82.4”,而分类输出/分类映射到包含在一组值中的离散数字输出,如“red”。如果你正在寻找更多数据集的灵感,请查看 kaggle 。
**卷积神经网络模型:**计算机视觉的尖端架构,有无数种方法可以应用这个模型。我建议从 MNIST 或 CIFAR-10 教程开始,然后进入二进制分类模型,因为它们更容易理解。你可以在 Jupyter 笔记本上即插即用这个代码并启动你的第一个二进制图像识别模型。这个例子很好,因为它向您展示了如何导入您自己的自定义数据集,这是从教程转移到您自己的项目时最大的挑战之一。
如果您没有立即获得想要的结果,请尝试增加历元的数量,改变您提供给模型的图像大小,添加更多的层,并且如果必要的话,(这将比其他任何事情都更好地提高性能),添加更多的数据!
如果你是一个更中级的水平,你应该看看物体检测算法,如 YOLO,SSD,甚至 R-CNN/快速 R-CNN/更快的 R-CNN。物体检测应用相当普遍,举个随机的例子:检测星球大战电影中的光剑,或者更常见的,网络摄像头中的人脸。
你也可以将这些模型用于自动驾驶应用。无论您是在与遥控汽车、麻省理工学院深度驾驶挑战赛还是马里奥赛车游戏交互,您都可能会应用卷积网络来应用图像反馈,然后将其传递给一系列输出决策,如左转/右转等。然而,一旦你越过了图像处理部分,它就变成了一个更高级的问题,因为你需要使用强化学习算法来处理自动驾驶需要做出的决定。
**递归神经网络模型:**序列模型有许多应用,例如聊天机器人、价格预测、文本挖掘、视频处理等等。我推荐从一个 char 级 RNN 开始,因为它将为理解 LSTM 之门提供一个良好的基础。加载股票价格数据集也是很好的练习。一旦你使用了文本挖掘 rnn,将这些概念扩展到聊天机器人就不会太难了。对于初学者来说,使用 RNNs 的视频分类算法有点困难,因为它需要首先将图像通过卷积层,然后将这种架构与 LSTM 门相结合。
**GANs/自动编码器:**GANs 的许多应用非常华丽和令人兴奋,但是,我建议最初使用它们来增加图像识别数据集的数据。GANs 应该能够在您的数据集中生成更多图像,您可以查看这些图像是否提高了分类器性能并发布您的结果。GANs 和自动编码器通常是更高级的主题,不幸的是超出了本文的范围。如果你真的想从 GANs 和深度学习的潜力中获得灵感,请查看神经风格转移项目:
大一的春季学期,我参加了斯坦福大学关于卷积神经网络的 CS 231n 课程。我的最终项目…
medium.com](https://medium.com/artists-and-machine-intelligence/neural-artistic-style-transfer-a-comprehensive-look-f54d8649c199)
杂念
我建议简单地从 Tensorflow 开始,这样你对后端过程有一个粗略的了解。当运行在高级 API 上的模型抛出错误时,这非常有用。之后,我更喜欢 TFLearn 或 Keras APIs,两者都不错。我认为 Python 是深度学习的最佳语言,尽管 R 由于其简单的语法和类似的笔记本风格也有一些吸引力。然而,如果您计划将结果导出到 Web 应用程序或 Raspberry Pi 控制器中,Python 更适合构建 API。
这里是文章中提到的应用程序的完整列表:
{聊天机器人,图像分类器,对象检测,自动驾驶,文本情感分析,语音情感分析,语音合成,价格预测,聊天机器人,视频分类器,动作识别}
感谢阅读,请留下掌声!
CShorten
Connor Shorten 是佛罗里达大西洋大学计算机科学专业的学生。对数据科学、深度学习和软件工程感兴趣。主要用 Python,JavaScript,C++编码。请关注更多关于这些主题的文章。
深度学习问题—带演示的答案模型
用数据做很酷的事情!
question-answer gif
如果一个模型可以通过从段落中提取最相关的单词来回答任何段落中的问题,那该有多神奇。深度学习让这一切成为可能!
下面看一个演示这样的问答超级模型。在这个演示中,你可以在任何语境中输入多达 300 个单词,并从中提出任何类型的问题。模型托管在 AWS 上,从那里返回结果。我很抱歉演示有点慢,因为我还没有机会优化这个模型的部署。
试玩链接:【http://www.deeplearninganalytics.org/demos
这个模型非常通用,可以有很多实际应用。例如,作为一个机器人,它可以链接到任何网页,所以用户可以问问题,它可以在页面上搜索答案。另一个我个人认为非常有用的想法是链接到大多数人不看就点击我同意的合同条款。如果用户可以问一些重要的问题,而不需要阅读一大堆法律术语,那会怎么样?请看下面的一个小例子:
背景:转换条款经常出现在军火合同中。该功能允许您在指定时间将 ARM 转换为固定利率抵押贷款。条款和条件因贷款人而异。不过,一般来说,你必须在转换前提前 30 天通知你的贷款人。你还必须支付一笔费用,通常是 250 到 500 美元。一些贷款人指定何时可以进行转换,而其他人则允许在贷款的前三至五年内的任何时间进行转换。
问:转换条款的相关费用是多少?
模型的答案:250 到 500 美元
看看这个模型是如何将最后一句关于费用的话与转换条款联系起来的,尽管确切的术语“转换条款”在开头只提到过一次。它可以进行共指解析,这意味着它可以将像它/他们这样的代词正确地关联到实体。
这个模型有几个惊人之处:
- 它已经接受了维基百科数据的训练,在它能理解的文本类型方面非常灵活。我已经尝试了各种各样的主题,从新闻,体育,合同条款,财产数据,它真的工作
- 研究不同类型的问题——谁、何时、做什么、如何等等
- 它返回的答案来自段落,因为它被编码为在段落中找到最相关的单词子集
但它并不完美。主要缺点是:
- 目前,即使问了一个完全随机的问题,它也会返回一个答案。一种可能的增强是训练它在与答案相关联的置信度低时不返回答案
- 模型准确性虽然相当好,但并不完美,随着深度学习研究产生最稳健的方法,模型将随着时间的推移而改进
你可以在我的 Github 上找到模型的代码。
如果你对这种模式的运作方式感到好奇,我已经在我的博客这里分享了它的细节。
一个简短的总结是:
资料组
这个模型建立在StanfordQuestionAnsweringDataset(SQuAD1.1)数据集上,该数据集由一组维基百科文章上的众包工作者提出的问题组成,其中每个问题的答案都是相应阅读文章中的一段文字,或 span 。SQuAD 拥有 500+篇文章上的 100,000+问答对,比以前的阅读理解数据集大得多。
I)它是一个封闭的数据集,意味着问题的答案总是上下文的一部分,也是上下文的连续跨度
ii)因此找到答案的问题可以简化为找到对应于答案的上下文的开始索引和结束索引
iii) 75%的答案长度小于等于 4 个单词
模型
这个模型的实现使用了 BiDAF 注意模块,并做了一些改进。模型中的主要层是:
- 输入上下文和问题被预处理,转换成原始单词,并且这些单词使用预先训练的手套模型被转换成单词嵌入
- 双向 LSTM 层对上下文和问题分别进行编码,创建隐藏的表示,查看给定单词前后的单词,以创建对文本的理解
- 现在我们有了上下文和问题的表示,我们需要一起看它们来找到答案。这是通过注意力来完成的。该模型使用 BiDAF 注意力,允许注意力从上下文到问题和从问题到上下文的双向流动。并且这两个注意被连接以创建最终向量。见下面截图
BiDAF attention
4.我们还从 BiDAF 借鉴了建模层的思想,使用双向 LSTM 来学习来自关注层的查询感知
上下文单词表示之间的交互
5.模型的最后一层是 softmax 输出层,帮助我们决定答案范围的开始和结束索引。我们结合上下文隐藏状态和来自前一层的注意力向量来创建混合代表。这些混合代表成为全连接层的输入,该全连接层使用 softmax 来预测开始和结束索引的概率
如果你喜欢这个帖子,请给我一个掌声:)希望你自己拉代码试试。另外,请试玩一下演示,并分享您的任何反馈。
我有自己的深度学习咨询公司,喜欢研究有趣的问题。我已经帮助许多初创公司部署了基于人工智能的创新解决方案。请前往 http://deeplearninganalytics.org/的酒店查看我们的酒店。
你也可以在https://medium.com/@priya.dwivedi看到我的其他作品
如果你有一个我们可以合作的项目,请通过我的网站或 info@deeplearninganalytics.org 联系我
参考文献:
吴恩达深度学习专业化— 21 个经验教训
Photo by Charles Deluvio on Unsplash
我最近完成了吴恩达在 Coursera 上的新深度学习课程的所有可用材料(截至 2017 年 10 月 25 日)。该专业目前有 3 门课程可供选择:
- 神经网络和深度学习
- 改进深度神经网络:超参数调整、正则化和优化
- 构建机器学习项目
我发现这 3 门课都非常有用,并从吴恩达老师那里学到了大量的实用知识。Ng 出色地过滤了流行词汇,并以清晰简洁的方式解释了概念。例如,Ng 明确表示,受监督的深度学习只不过是一个多维曲线拟合过程,任何其他代表性的理解,如对人类生物神经系统的共同参考,充其量是松散的。
专门化只需要基本的线性代数知识和 Python 中的基本编程知识。然而,在我看来,你也应该了解向量微积分,以理解最优化过程的内部工作原理。如果你不关心内部工作,只关心获得高水平的理解,你可以跳过微积分视频。
第一课:为什么深度学习正在兴起?
90%的数据是在过去 2 年中收集的。深度神经网络(DNN 的)能够利用大量的数据。因此,DNN 氏症可以主宰较小的网络和传统的学习算法。
Shows how scale drives performance in DNN’s
此外,有许多算法上的创新使得 DNN 的训练速度大大提高。例如,从 sigmoid 激活函数切换到 RELU 激活函数对诸如梯度下降的优化过程具有巨大的影响。这些算法上的改进让研究人员可以更快地迭代整个想法->实验->代码周期,从而带来更多的创新。
Deep Learning Development Cycle
第 2 课:深度学习中的矢量化
在学习本课程之前,我并不知道可以在没有任何显式 for 循环的情况下实现神经网络(除了在层上)。Ng 在传达 Python 中矢量化代码设计的重要性方面做得非常好。家庭作业为你提供了一个样板矢量化代码设计,你可以很容易地将它转移到你自己的应用程序中。
第三课:深刻理解 DNN 的
第一个课程实际上让您从头开始实现 numpy 中的向前和向后传播步骤。通过这样做,我对 TensorFlow 和 Keras 等更高级框架的内部工作有了更深入的理解。Ng 解释了计算图背后的想法,这使我能够理解 TensorFlow 似乎如何执行“神奇的优化”。
第四课:为什么是深层表现?
Ng 对 DNN 作品的层次感有着直观的理解。例如,在面部检测中,他解释说早期的层用于将面部的边缘组合在一起,然后后期的层使用这些边缘来形成面部的部分(例如,鼻子、眼睛、嘴等)。)然后使用进一步的层将各部分放在一起并识别人。他还解释了电路理论的思想,电路理论基本上认为,存在需要指数数量的隐藏单元来适应浅层网络中的数据的函数。指数问题可以简单地通过增加有限数量的附加层来缓解。
第 5 课:解决偏差和差异的工具
Ng 解释了研究人员识别和解决偏差和方差问题的步骤。他描绘的画面给出了解决这些问题的系统方法。
Cookbook for addressing bias and variance problems
他还提出了普遍引用的偏差和方差之间的“权衡”。他解释说,在现代深度学习时代,我们有工具来分别解决每个问题,因此权衡不再存在。
第六课:正规化的直觉
为什么在成本函数中加入惩罚项会减少方差效应?在参加这个课程之前,我的直觉是,它迫使权重矩阵更接近于零,从而产生一个更“线性”的函数。Ng 给出了涉及 tanh 激活功能的另一种解释。其思想是较小的权重矩阵产生较小的输出,这将输出集中在双曲正切函数的线性部分周围。
tanh activation function
他还对辍学给出了一个有趣的直观解释。在参加这个课程之前,我认为辍学基本上是在每次迭代中杀死随机的神经元,所以这就好像我们在用一个更小的网络工作,这是更线性的。他的直觉是从单个神经元的角度看待生命。
Perspective from a single neuron
由于辍学是随机杀死连接,神经元被激励在它的父母之间更均匀地分配它的重量。通过展开权重,它往往具有缩小权重的平方范数的效果。他还解释说,辍学只不过是 L2 正则化的一种适应性形式,两种方法具有相似的效果。
第 7 课:为什么规范化有效?
Ng 演示了为什么归一化往往通过绘制等值线图来提高优化过程的速度。他明确地给出了一个在标准化和非标准化等高线图上迭代梯度下降的例子。
第 8 课:初始化的重要性
Ng 表明,参数的不良初始化会导致渐变消失或爆炸。他演示了几种解决这些问题的方法。基本思想是确保每层的权重矩阵的方差约为 1。他还讨论了 Xavier 初始化 tanh 激活函数。
第 9 课:为什么使用小批量梯度下降?
利用等高线图,ng 解释了小批量和大批量之间的权衡。基本的想法是,较大的规模会使每次迭代变得缓慢,而较小的规模允许您更快地取得进展,但是不能保证收敛。最好的方法是在两者之间做一些事情,这样可以比一次处理整个数据集的速度更快,同时还可以利用矢量化技术。
第十课:对高级优化技术的直观理解
Ng 解释了 momentum 和 RMSprop 等技术如何允许梯度下降来抑制其向最小值的路径。他还用一个球滚下山坡的过程给出了一个极好的物理解释。他将这些方法联系在一起,解释了著名的亚当优化过程。
第 11 课:基本的后端张量流理解
Ng 解释了如何使用 TensorFlow 实现神经网络,还解释了优化过程中使用的一些后端过程。其中一个家庭作业练习鼓励你使用张量流实现辍学和 L2 正则化。这进一步加强了我对后端流程的理解。
第 12 课:正交化
Ng 讨论了正交化在机器学习策略中的重要性。基本思想是,您希望实现一次只影响算法性能的单个组件的控件。例如,要解决偏差问题,您可以使用更大的网络或更强大的优化技术。您希望这些控件只影响偏差,而不影响其他问题,如泛化能力差。缺乏正交化的控制的一个例子是提前停止优化过程(提前停止)。这是因为它同时影响模型的偏差和方差。
第 13 课:单一数字评估指标的重要性
Ng 强调了选择一个单一数字评估指标来评估您的算法的重要性。如果您的目标发生了变化,那么您应该只在稍后的模型开发过程中更改评估指标。Ng 举了一个在猫分类应用中识别色情照片的例子!
第 14 课:测试/开发发行版
始终确保开发和测试集具有相同的分布。这确保了您的团队在迭代过程中瞄准了正确的目标。这也意味着,如果您决定纠正测试集中的标签错误的数据,那么您也必须纠正开发集中的标签错误的数据。
第 15 课:处理不同的培训和测试/开发发行版
Ng 给出了为什么一个团队对训练集和测试/开发集没有相同的分布感兴趣的原因。这个想法是,您希望评估度量是基于您真正关心的例子来计算的。例如,您可能希望使用与您的问题不相关的示例进行训练,但是您不希望根据这些示例来评估您的算法。这使得你的算法可以用更多的数据来训练。经验表明,这种方法在许多情况下会给你带来更好的性能。缺点是您的培训和测试/开发集有不同的发行版。解决方案是省去一小部分训练集,只确定训练集的泛化能力。然后,您可以将这个错误率与实际的开发错误进行比较,并计算一个“数据不匹配”度量。然后,Ng 解释了解决这种数据不匹配问题的方法,如人工数据合成。
第 16 课:培训/开发/测试规模
在深度学习时代,设置训练/开发/测试分离的指导方针发生了巨大的变化。在参加课程之前,我知道通常的 60/20/20 比例。Ng 强调,对于非常大的数据集,应该使用大约 98/1/1 甚至 99/0.5/0.5 的分割。这是因为开发和测试集只需要足够大,以确保团队提供的置信区间。如果您正在处理 10,000,000 个训练样本,那么 100,000 个样本(或 1%的数据)就足以保证您的开发和/或测试集有一定的置信度。
第 17 课:近似贝叶斯最优误差
Ng 解释了在某些应用中,如何将人的水平表现作为贝叶斯误差的代理。例如,对于视觉和音频识别等任务,人类水平的误差将非常接近贝叶斯误差。这允许你的团队量化你的模型中可避免的偏差的数量。如果没有贝叶斯误差这样的基准,就很难理解网络中的方差和可避免的偏差问题。
第十八课:错误分析
Ng 展示了一种显而易见的技术,通过使用误差分析来显著提高算法性能的有效性。基本思想是手动标记你的错误分类的例子,并把你的努力集中在对你的错误分类数据贡献最大的错误上。
Cat Recognition App Error Analysis
例如,在 cat 识别中,Ng 确定模糊图像是导致错误的最主要原因。这种敏感性分析可以让你看到在减少总误差上你的努力值多少钱。可能的情况是,修复模糊的图像是一项非常艰巨的任务,而其他错误是显而易见的,很容易修复。敏感性和近似工作量都将被纳入决策过程。
第 19 课:何时使用迁移学习?
转移学习允许您将知识从一个模型转移到另一个模型。例如,您可以将图像识别知识从猫识别应用程序转移到放射诊断。实施迁移学习包括用更多的数据重新训练用于类似应用领域的网络的最后几层。这个想法是,网络中早期的隐藏单元有更广泛的应用,它通常不特定于你使用网络的确切任务。总的来说,当两个任务有相同的输入特征,并且你试图学习的任务比你试图训练的任务有更多的数据时,迁移学习就起作用了。
第二十课:何时使用多任务学习?
多任务学习迫使单个神经网络同时学习多个任务(而不是每个任务都有一个单独的神经网络)。Ng 解释说,当一组任务可以从共享低级功能中受益,并且每个任务的数据量在数量上相似时,这种方法很有效。
第 21 课:何时使用端到端深度学习?
端到端深度学习需要多个阶段的处理,并将它们合并到单个神经网络中。这允许数据自己说话,而没有在优化过程中人工工程步骤中显示的偏差。相反,这种方法需要更多的数据,可能会排除潜在的手工设计的组件。
结论
Ng 的深度学习课程让我对深度学习模型开发流程有了一个基础的直观认识。我上面解释的课程仅仅代表了本课程中材料的一个子集。完成课程后,你不会成为深度学习的专家。我对这门课唯一的不满是家庭作业太简单了。我写这篇文章没有得到 deeplearning.ai 的背书。
—
这就是所有人——如果你已经做到了这一步,请在下面评论并在 LinkedIn 上加我。
我的 Github 是这里的。
对具有实体嵌入的结构化数据使用深度学习
说明深度学习可以处理结构化数据,以及如何处理。
The idea of embeddings comes from learning them on words in NLP (word2vec), image taken from Aylien
在这篇博客中,我们将触及机器学习中两个反复出现的问题:第一个问题围绕着深度学习如何在图像和文本上表现良好,但我们如何在我们的表格数据上使用它?其次,在建立机器学习模型时,你必须经常问自己一个问题:我如何处理这个数据集中的分类变量?令人惊讶的是,我们可以用同一个答案来回答这两个问题:实体嵌入。
最近,深度学习在许多方面都超过了其他机器学习方法:图像识别、音频分类和自然语言处理只是许多例子中的一部分。这些研究领域都使用所谓的“非结构化数据”,即没有预定义结构的数据。一般来说,这些数据也可以被组织成一个序列(像素、用户行为、文本)。深度学习已经成为处理非结构化数据的标准。最近出现了深度学习是否也能在结构化数据上表现最好的问题。结构化数据是以表格格式组织的数据,其中列代表不同的要素,行代表不同的数据样本。这类似于数据在 Excel 表中的表示方式。目前,结构化数据集的黄金标准是梯度增强树模型(Chen & Guestrin,2016)。他们总是在 Kaggle 竞赛中表现最佳,在学术文献中也是如此。最近,深度学习已经表明,它可以在结构化数据上匹配这些增强的树模型的性能。实体嵌入在其中扮演着重要的角色。
Structured vs. unstructured data
实体嵌入
当在结构化数据上拟合神经网络时,实体嵌入已经被证明是成功的。例如,Kaggle 竞赛中预测出租车乘坐距离的获胜解决方案使用实体嵌入来处理每次乘坐的分类元数据(de Brébisson 等人,2015 年)。类似地,预测 Rossmann 药店销售额任务的第三名解决方案使用了比第一名和第二名解决方案简单得多的方法。该团队能够通过使用简单的前馈神经网络实现这一成功,该网络具有分类变量的实体嵌入。这包括超过 1000 个类别的变量,如商店 id (Guo & Berkahn,2016)。
如果这是你第一次阅读关于嵌入的文章,我建议你先阅读这篇文章。简而言之,嵌入指的是用向量来表示类别。让我们在一个短句上展示一下这是如何工作的:
深度学习是深刻的
我们可以用一个向量来表示每个单词,所以“deep”这个词就变成了类似于[0.20,0.82,0.45,0.67]的东西。在实践中,人们可以用 1 2 3 1 这样的整数来代替单词,并使用查找表来找到与每个整数相关联的向量。这种做法在自然语言处理中非常常见,也用于由行为序列组成的数据,如在线用户的旅程。实体嵌入指的是在分类变量上使用这个原则,其中分类变量的每个类别都由一个向量表示。让我们快速回顾一下机器学习中处理分类变量的两种常用方法。
- 一键编码:创建二进制子特征,如 word_deep、word_learning、word_is。属于该数据点的类别为 1,其他类别为 0。因此,对于单词“deep ”,特征单词 _deep 将是 1,单词 _learning,单词 _is 等。将为 0。
- 标签编码:像我们在前面的例子中那样分配整数,所以深度变成 1,学习变成 2,等等。这种方法适用于基于树的方法,但不适用于线性模型,因为它暗示了赋值的顺序。
实体嵌入基本上将标签编码方法提升到了一个新的层次,不仅仅是将一个整数分配给一个类别,而是分配给整个向量。这个向量可以是任何大小,并且必须由研究者指定。您可能想知道这些实体嵌入的优点是什么。
- 实体嵌入解决了一次性编码的缺点。用许多类别对变量进行一次性编码会导致非常稀疏的向量,这在计算上是低效的,并且使得更难达到优化。标签编码也解决了这个问题,但是只能被基于树的模型使用。
- 嵌入提供了关于不同类别之间距离的信息。使用嵌入的好处在于,分配给每个类别的向量也在神经网络的训练过程中得到训练。因此,在训练过程的最后,我们得到一个代表每个类别的向量。然后,这些经过训练的嵌入可以被可视化,以提供对每个类别的洞察。在 Rossmann 销售预测任务中,德国各州的可视化嵌入显示了与各州地理位置相似的聚类。即使这些地理信息对模型都不可用。
- 经过训练的嵌入可以被保存并在非深度学习模型中使用。例如,可以每个月训练分类特征的嵌入,并保存嵌入。然后,通过加载分类特征的学习嵌入,这些嵌入可用于训练随机森林或梯度增强树模型。
选择嵌入大小
嵌入大小指的是表示每个类别的向量的长度,并且可以为每个分类特征设置。类似于神经网络中超参数的调整过程,没有选择嵌入大小的硬性规则。在出租车距离预测任务中,研究人员对每个特征使用了 10 的嵌入大小。这些特性具有非常不同的维度,从 7(星期几)到 57106(客户端 id)不等。为每个类别选择相同的嵌入大小是一种简单且透明的方法,但可能不是最佳方法。
对于 Rossmann 商店销售预测任务,研究人员选择了一个介于 1 和 M(类别数量)-1 之间的值,最大嵌入大小为 10。例如,星期几(7 个值)的嵌入大小为 6,而商店 id (1115 个值)的嵌入大小为 10。然而,作者没有在 1 和 M-1 之间选择大小的明确规则。
杰瑞米·霍华德重建了罗斯曼竞赛的解决方案,并提出了以下选择嵌入尺寸的解决方案:
# c is the amount of categories per featureembedding_size = (c+1) // 2if embedding_size > 50:
embedding_size = 50
可视化嵌入
嵌入的一个优点是,所学习的嵌入可以被可视化以显示哪些类别彼此相似。最流行的方法是 t-SNE,这是一种降维技术,特别适用于可视化高维数据集。让我们用两个可视化嵌入的快速例子来结束这篇文章。以下是家得宝产品的可视化嵌入及其所属的类别。类似的产品如烤箱、冰箱和微波炉彼此非常接近。充电器、电池和电钻等产品也是如此。
Learned embeddings of home depot products.
另一个例子是本文前面提到的 Rossmann 销售预测任务中德国各州的学习状态嵌入。嵌入中各州之间的接近程度类似于它们的地理位置。
Example of the learned state embeddings for Germany
我希望我能够让你对嵌入和深度学习感兴趣。如果你喜欢这篇文章,一定要推荐给别人看。你也可以关注这个简介,跟上我在深度学习方面的进程。那里见!
我目前是一名微型公司的数据科学家。我们正在努力寻找数据工程师和软件工程师。我们也在为自己和我们的合作伙伴招募数据科学家,这些合作伙伴包括荷兰、以色列的一些最大的组织和一些大型全球公司!
通过 LinkedIn 联系我,加入我们在阿姆斯特丹或特拉维夫的团队,或者让我帮助您加入我们遍布全球的合作伙伴组织!
一定要看看我深度学习系列的其余部分:
参考
陈,t .,& Guestrin,C. (2016 年 8 月)。Xgboost:一个可扩展的树提升系统。第 22 届 acm sigkdd 知识发现和数据挖掘国际会议论文集*(第 785–794 页)。ACM。*
德布雷比松,西蒙,埃。a .奥沃拉特、p .文森特和 y .本吉奥(2015 年)。人工神经网络在出租车终点预测中的应用。 arXiv 预印本 arXiv:1508.00021 。
郭,c .,,伯克哈恩,F. (2016)。分类变量的实体嵌入。 arXiv 预印本 arXiv:1604.06737 。
深度学习技巧和诀窍
以下是我与同龄人和学生就如何优化深度模型进行的对话、信息和辩论的精华集合。如果你有有效的方法,请分享出来!!
首先,为什么要调整模型?
像卷积神经网络(CNN)这样的深度学习模型有大量的参数;我们实际上可以称之为超参数,因为它们在模型中没有被优化。你可以搜索这些超参数的最佳值,但是你需要大量的硬件和时间。那么,一个真正的数据科学家会满足于猜测这些基本参数吗?
改进您的模型的最好方法之一是建立在对您的领域进行了深入研究的专家的设计和架构之上,这些专家通常拥有强大的硬件。优雅地,他们经常开源最终的建模架构和基本原理。
深度学习技术
这里有一些方法可以帮助你通过预先训练的模型来提高你的健身时间和准确性:
- 研究理想的预训架构: 了解迁移学习的好处,或者浏览一些强大的 CNN 架构。考虑那些看起来不明显的领域,但是共享潜在的潜在特征。
- 使用较小的学习率: 由于预训练的权重通常比随机初始化的权重好,所以修改要更细腻!你在这里的选择取决于学习环境和预训练的进展情况,但是检查跨时代的错误,以了解你离收敛有多近。
- 使用退出: 与回归模型的脊和套索正则化一样,所有模型都没有优化的 alpha 或退出。这是一个超参数,取决于您的具体问题,必须进行测试。从更大的变化开始——像
np.logspace()
可以提供的数量级的更宽的网格搜索跨度——然后像上面的学习率一样下降。 - 限制权重大小: 我们可以限制某些层的权重的最大范数(绝对值),以便推广我们的模型
- 不要碰第一层: 神经网络的第一个隐藏层往往会捕捉通用的和可解释的特征,如形状、曲线或跨领域的相互作用。我们应该经常不去管这些,而把重点放在优化更远的元潜在水平上。这可能意味着添加隐藏层,这样我们就不会匆忙的过程!
- 修改输出层: 用一个新的激活函数和适合你的域的输出大小替换模型默认值。但是,不要把自己局限在最明显的解决方案上。虽然 MNIST 可能看起来想要 10 个输出类,但一些数字有常见的变化,允许 12-16 个类可以更好地解决这些变化并提高模型性能!正如上面的提示一样,随着我们接近输出,深度学习模型应该越来越多地修改和定制。
喀拉斯的技术
以下是如何在 MNIST 的 Keras 中修改辍学和限制体重的方法:
# dropout in input and hidden layers
# weight constraint imposed on hidden layers
# ensures the max norm of the weights does not exceed 5model = Sequential()model.add(Dropout(0.2, input_shape=(784,))) # dropout on the inputs
# this helps mimic noise or missing datamodel.add(Dense(128, input_dim=784, kernel_initializer='normal', activation='relu', kernel_constraint=maxnorm(5)))model.add(Dropout(0.5))model.add(Dense(128, kernel_initializer='normal', activation='tanh', kernel_constraint=maxnorm(5)))model.add(Dropout(0.5))model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))
辍学最佳实践:
- 使用 20–50%的小压降,建议输入为 20%。太低,你的影响可以忽略不计;太高,你吃不饱。
- 在输入图层和隐藏图层上使用 dropout。这已经被证明可以提高深度学习的性能。
- 使用具有衰减和大动量的大学习率。
- 约束你的体重!大的学习率会导致爆炸梯度。对网络权重施加约束条件(例如大小为 5 的最大范数正则化)已被证明可以改善结果。
- 使用更大的网络。当在更大的网络上使用 dropout 时,您可能会获得更好的性能,从而为模型提供更多学习独立表示的机会。
以下是一个在 Keras 中对 MNIST 的 14 个类进行最终图层修改的示例:
**from** keras.layers.core **import** Activation, Densemodel**.**layers**.**pop() # defaults to last
model**.**outputs **=** [model**.**layers[**-**1]**.**output]
model**.**layers[**-**1]**.**outbound_nodes **=** []
model**.**add(Dense(14, activation**=**'softmax'))
以及如何在前五层冻结权重的示例:
**for** layer **in** model**.**layers[:5]:
layer**.**trainable **=** False
或者,我们可以将该层的学习速率设置为零,或者使用每个参数的自适应学习算法,如 Adadelta 或 Adam 。这有点复杂,最好在其他平台上实现,比如 Caffe。
预训练网络的图库:
Keras
张量流
火炬
咖啡馆
在 Jupyter 中查看你的张量图
获得模型外观的视觉概念通常是很重要的。如果你在 Keras 中工作,抽象是很好的,但是不允许你深入模型的各个部分进行更深入的分析。幸运的是,下面的代码让我们可以直接用 Python 可视化我们的模型:
# From: [http://nbviewer.jupyter.org/github/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/deepdream/deepdream.ipynb](http://nbviewer.jupyter.org/github/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/deepdream/deepdream.ipynb)
# Helper functions for TF Graph visualization
from IPython.display import clear_output, Image, display, HTML
def strip_consts(graph_def, max_const_size=32):
"""Strip large constant values from graph_def."""
strip_def = tf.GraphDef()
for n0 in graph_def.node:
n = strip_def.node.add()
n.MergeFrom(n0)
if n.op == 'Const':
tensor = n.attr['value'].tensor
size = len(tensor.tensor_content)
if size > max_const_size:
tensor.tensor_content = bytes("<stripped %d bytes>"%size, 'utf-8')
return strip_def
def rename_nodes(graph_def, rename_func):
res_def = tf.GraphDef()
for n0 in graph_def.node:
n = res_def.node.add()
n.MergeFrom(n0)
n.name = rename_func(n.name)
for i, s in enumerate(n.input):
n.input[i] = rename_func(s) if s[0]!='^' else '^'+rename_func(s[1:])
return res_def
def show_graph(graph_def, max_const_size=32):
"""Visualize TensorFlow graph."""
if hasattr(graph_def, 'as_graph_def'):
graph_def = graph_def.as_graph_def()
strip_def = strip_consts(graph_def, max_const_size=max_const_size)
code = """
<script>
function load() {{
document.getElementById("{id}").pbtxt = {data};
}}
</script>
<link rel="import" href="https://tensorboard.appspot.com/tf-graph-basic.build.html" onload=load()>
<div style="height:600px">
<tf-graph-basic id="{id}"></tf-graph-basic>
</div>
""".format(data=repr(str(strip_def)), id='graph'+str(np.random.rand()))
iframe = """
<iframe seamless style="width:800px;height:620px;border:0" srcdoc="{}"></iframe>
""".format(code.replace('"', '"'))
display(HTML(iframe))# Visualizing the network graph. Be sure expand the "mixed" nodes to see their
# internal structure. We are going to visualize "Conv2D" nodes.
graph_def = tf.get_default_graph().as_graph_def()
tmp_def = rename_nodes(graph_def, lambda s:"/".join(s.split('_',1)))
show_graph(tmp_def)
用 Keras 可视化你的模型
这将绘制出模型的图形,并将其保存为 png 文件:
**from** keras.utils **import** plot_model
plot_model(model, to_file='model.png')
plot
采用两个可选参数:
show_shapes
(默认为假)控制是否在图形中显示输出形状。show_layer_names
(默认为真)控制图层名称是否显示在图形中。
您也可以直接获得pydot.Graph
对象并自己渲染它,例如在 ipython 笔记本中显示它:
**from** IPython.display **import** SVG
**from** keras.utils.visualize_util **import** model_to_dotSVG(model_to_dot(model).create(prog='dot', format='svg'))
希望这个合集对你的机器学习项目有所帮助!请在下面的评论中告诉我你是如何优化你的深度学习模型的,并在 Twitter 和 LinkedIn 上与我联系!
深度学习不平衡训练数据?这样解决。
当我们处理任何机器学习问题时,我们面临的最大问题之一是不平衡的训练数据问题。不平衡数据的问题是这样的,学术界对其定义、含义和可能的解决方案存在分歧。我们将在这里尝试使用图像分类问题来揭开训练数据中不平衡类的秘密。
阶层不平衡的问题是什么?
在分类问题中,当在您想要预测的所有类别中,如果一个或多个类别的样本数量极低,您可能会面临数据中类别不平衡的问题。
例句
- 欺诈预测(欺诈数量将远低于真实交易)
- 自然灾害预测(坏事件会比好事件低很多)
- 在图像分类中识别恶性肿瘤(在训练样本中具有肿瘤的图像将比没有肿瘤的图像少得多)
为什么这是个问题?
由于两个主要原因,不平衡的类产生了一个问题:
- 对于实时不平衡的类,我们得不到优化的结果,因为模型/算法从未充分观察到底层的类
- 这就产生了一个制作验证或测试样本的问题,因为在少数类别的观察数量非常少的情况下,很难获得跨类别的表示
有哪些不同的方法可以解决这个问题?
提出了三种主要方法,各有利弊:
- 欠采样 -随机删除具有足够观察值的类别,以便两个类别的比较比率在我们的数据中是显著的。虽然这种方法非常简单,但是我们删除的数据很有可能包含关于预测类的重要信息。
- 过采样- 对于不平衡类,随机增加现有样本副本的观察值数量。理想情况下,这为我们提供了足够数量的样本。过采样可能导致过拟合训练数据
- **综合采样(SMOTE)——**该技术要求综合制造不平衡类的观测值,这类似于使用最近邻分类的现有观测值。问题是当的观测数是一个极其稀少的类时该怎么办。例如,我们可能只有一张稀有物种的图片,我们想使用图像分类算法对其进行识别
尽管每种方法都有自己的优点,但是对于何时使用哪种技术并没有特别的启发。我们现在将使用一个深度学习特定图像分类问题来详细研究这个问题。
图像分类中的不平衡类
在这一节中,我们将提出一个图像分类的问题,它有一个不平衡的分类问题,然后我们将使用一个简单有效的技术来解决它。
问题-我们在 kaggle 上发现了**“座头鲸识别挑战”**,我们预计这将是一个解决不平衡类别的挑战(因为理想情况下,分类的鲸鱼数量将少于未分类的鲸鱼数量,也将有一些稀有的鲸鱼物种,我们将有更少的图像数量)
来自 kaggle: “在这场比赛中,你面临的挑战是构建一个算法来识别图像中的鲸鱼种类。您将分析 Happy Whale 的超过 25,000 张图片的数据库,这些图片是从研究机构和公共贡献者那里收集的。通过做出贡献,你将有助于打开对全球海洋哺乳动物种群动态的丰富理解领域。”
让我们开始看数据
由于这是一个多标签图像分类问题,我首先想检查数据是如何跨类分布的。
上图表明,在 4251 幅训练图像中,超过 2000 幅的每类只有一幅图像。也有包含大约 2–5 个图像的类。现在,这是一个严重的阶级不平衡问题。我们不能期望 DL 模型只使用每类一个图像来训练(虽然有算法可以做到这一点,例如一个镜头分类,但我们现在忽略了这一点)。这也产生了如何在训练样本和验证样本之间创建分割的问题。理想情况下,您会希望每个类都在训练和验证样本中出现。
我们现在应该做什么?
我们特别考虑了两个选项:
选项 1-对训练样本进行严格的数据扩充(我们可以做到这一点,但由于我们只需要特定类别的数据扩充,这可能无法完全解决我们的目的)。因此我选择了选项 2,它看起来很简单,值得一试。
选项 2- 类似于我上面提到的过采样选项。我只是使用不同的图像增强技术将不平衡类的图像复制回训练数据中 15 次。这是受杰瑞米·霍华德的启发,我猜他在 part-1 fast.ai 课程 的一个深度学习讲座中提到过。
在我们开始选项-2 之前,让我们先来看看训练样本中的一些图像。
这些图像是鲸鱼的福禄克所特有的。因此,识别可能会非常具体的方式,图像将被定向。
我还注意到数据中有许多图像是 B&W 特有的或者只是 R/B/G 频道的。
基于这些观察,我决定编写以下代码,对来自训练样本中不平衡类的图像进行小的更改,然后保存它们:
import os
from PIL import Imagefrom PIL import ImageFilterfilelist = train['Image'].loc[(train['cnt_freq']<10)].tolist()for count in range(0,2):
for imagefile in filelist:
os.chdir('/home/paperspace/fastai/courses/dl1/data/humpback/train')
im=Image.open(imagefile)
im=im.convert("RGB")
r,g,b=im.split()
r=r.convert("RGB")
g=g.convert("RGB")
b=b.convert("RGB")
im_blur=im.filter(ImageFilter.GaussianBlur)
im_unsharp=im.filter(ImageFilter.UnsharpMask)
os.chdir('/home/paperspace/fastai/courses/dl1/data/humpback/copy')
r.save(str(count)+'r_'+imagefile)
g.save(str(count)+'g_'+imagefile)
b.save(str(count)+'b_'+imagefile)
im_blur.save(str(count)+'bl_'+imagefile)
im_unsharp.save(str(count)+'un_'+imagefile)
上述代码块对不平衡类(频率小于 10)中的每个图像执行以下操作:
- 将每个图像的增强副本保存为 R/B& G
- 保存每个模糊图像的增强副本
- 保存每个图像的放大副本
我们在这个练习中严格使用 pillow(一个 python 图像库),如上面的代码所示
现在我们有了所有不平衡类的至少 10 个样本。我们继续训练。
图像增强- 我们保持简单。我们只是想确保我们的模型能够获得鲸爪的详细视图。为此,我们将变焦纳入图像放大。
学习率查找器- 我们决定学习率为 0.01,标识为 lr find。
我们使用 Resnet50(首先冻结和解冻)进行了几次迭代。事实证明,冷冻模型也非常适合这个问题陈述,因为 imagenet 中有鲸豚的图像。
epoch trn_loss val_loss accuracy
0 1.827677 0.492113 0.895976
1 0.93804 0.188566 0.964128
2 0.844708 0.175866 0.967555
3 0.571255 0.126632 0.977614
4 0.458565 0.116253 0.979991
5 0.410907 0.113607 0.980544
6 0.42319 0.109893 0.981097
这在测试数据上看起来如何?
终于到了卡格尔排行榜的关键时刻了。提出的解决方案在本次竞赛中排名第 34 位,平均精度为 0.41928:)
结论
有时,最符合逻辑的简单方法(如果没有更多数据,只需稍微修改一下现有数据,假装大部分课堂观察在模型的同一行上)是最有效的方法,可以更容易、更直观地完成工作。
使用设计思维的深度学习
太多人认为人工智能是我们今天面临的许多问题的商业解决方案。
对于足够大的数据集,可能有一个神经网络可以帮助我们对问题做出决定,并影响用户。但是,为了有效地利用这些数据来创造产品,我们需要了解问题是否真的存在。我们需要理解人们,因为归根结底,消费产品驱动的公司会解决人们面临的问题。
首先,我们需要问自己,这个问题是一个真正的问题,还是只是创造性地应用人工智能的一个理由。在更广泛的范围内,我们需要问一问,将以人为中心的方法应用于数据科学是否是解决人工智能问题的一种方式。
许多行业领袖正成为这一想法的坚定支持者,
“我担心对人工智能的热情会阻止我们考虑它对社会的潜在影响,”李在文章中说。尽管它的名字,这项技术没有任何“人工”的成分——它是由人类制造的,旨在表现得像人类一样,并影响人类。因此,如果我们希望它在未来的世界中发挥积极作用,它必须以人类的关切为指导。”斯坦福大学的费·李非说
“一场人工智能革命正在进行中,但我认为它需要一场设计革命来补充,”德勤咨询 LLP 公司首席数据科学家 Jim Guszcza 说。
在感同身受和进行用户研究后,我们可以知道一个问题是否足够可行,可以使用人工智能来解决。在理解问题并研究其用例后,我们需要提出进一步的问题,以了解与常规预测算法相比,深度学习算法是否是一种方法。了解这一点的一些方法有:
- 如果这是一个神经网络超越传统算法的问题
- 如果很明显有足够的数据来训练。
- 如果问题足够复杂。
- 如果你有合适的神经网络来解决这个问题。
一旦我们确定人工智能是一个可行的解决方案,那么创建神经网络管道的步骤是:
- 找出并定义最适合所需问题的神经网络架构
- 将数据分成批次
- 使用图像处理对数据进行预处理
- 扩充数据以增加大小
- 将批次输入神经网络进行训练
- 测试您的模型,并保存它以供将来使用
可以认为这个管道使用了大卫·m·凯利提出的非常创新的 5 步设计思维方法。设计思维的过程,一种提供基于解决方案的方法来解决问题的设计方法。这些是使用设计思维进行深度学习可以遵循的步骤。
利用设计思维的深度学习
Source: https://infocus.dellemc.com/william_schmarzo/design-thinking-future-proof-yourself-from-ai/
第一步:同情和分析
设计思维过程的第一步是获得对你试图解决的问题和你的用户的移情理解。
设计思维:通过与人/用户交谈,咨询相关专家,或者深入问题以更好地理解问题,从而更好地理解你希望解决的问题。
深度学习:理解现实世界的消费者问题,其中神经网络的应用将对问题产生重大影响。神经网络并不能解决所有问题。我们需要从用户那里了解现实世界的问题,以便利用人工智能创造一些有意义的东西。我们可以从理解用户的关键决策开始,并捕捉能够更好地预测这些决策的变量和指标。
步骤 2:定义和综合
定义将移情步骤中获得的所有信息整合在一起,并分析数据以创建有意义的挑战陈述的方法。
设计思维:以人为中心,将问题定义为问题陈述。
深度学习:
- 根据正在解决的问题查找或综合数据集。
- 将数据加载到合适的位置。
- 准备数据—随机化、可视化以查看不平衡或关系、预处理、分割和扩充要发送用于训练的数据。
- 将数据分为训练、评估和测试。
第三步:构思
构思阶段是你设计过程中的一个阶段,在这个阶段你的目标是产生激进的设计方案。针对上一步中想到的问题,想出尽可能多的解决方案。
**设计思维:**利用前几个阶段的信息产生想法,集思广益,找出尽可能多的潜在解决方案。
**深度学习:**这一步为你的具体问题选择一个模型。已经为图像、诸如文本或音乐的序列、数字数据或基于文本的数据创建了许多模型。如果没有,您甚至可以通过一次添加一层来定义您自己的模型架构,直到您对您的网络满意为止。
步骤 4:原型和调整
原型制作生产出许多廉价的、按比例缩小的产品版本或产品中的特定功能。该团队将致力于创造一些具有特定功能的廉价产品。这允许设计思考者调查在设计思考过程的早期阶段识别的问题的可能解决方案。
**设计思维:**设计模型是基于前一阶段产生的所有想法而创建的。这些是实现构思概念的低保真度或高保真度线框。
深度学习:在这一步,我们使用训练数据来训练模型,然后我们开始操纵数据,并根据训练的结果来调整超参数。
步骤 5:测试和验证
测试是获得对你的解决方案的反馈,改进解决方案使之更好,并继续迭代概念的机会。
**设计思维:**我们使用用户测试技术测试我们的原型,看看它们在多大程度上解决了我们在前面阶段最初分析的问题。
**深度学习:**我们使用测试数据集测试模型,该数据集提供了用于评估模型的黄金标准。基于测试和验证的结果,我们迭代超参数调整的过程,以提高模型的准确性。
这可以总结为 3 个主要步骤:
- 研究和原型制作
- 为实际终端用户生产模型
- 现实世界中系统的改进
使用深度学习的设计思维为一些事情提供了一个框架和一个过程,否则会有许多步骤,并且是一个具有许多阶段的复杂过程。设计思维观有助于整合人工智能中以人为中心的解决问题的方式,并强调建立神经网络的迭代方式,就像设计师如何创造设计一样。
深度学习 vs 经典机器学习
想获得灵感?快来加入我的 超级行情快讯 。😎
在过去的几年里,深度学习已经成为大多数人工智能类型问题的首选技术,使经典机器学习黯然失色。原因很明显,深度学习已经在包括语音、自然语言、视觉和玩游戏在内的各种任务上反复展示了其优越的性能。然而,尽管深度学习具有如此高的性能,但使用经典机器学习仍然有一些优势,而且在许多特定情况下,使用线性回归或决策树比使用大型深度网络更好。
在这篇文章中,我们将比较和对比深度学习和经典机器学习技术。在此过程中,我们将确定这两种技术的优缺点,以及它们的最佳使用位置和方式。
深度学习>经典机器学习
- **同类最佳性能:**深度网络已经在包括语音、自然语言、视觉和玩游戏在内的许多领域实现了远超经典 ML 方法的准确性。在很多任务中,经典 ML 甚至无法抗衡。例如,下图显示了 ImageNet 数据集上不同方法的影像分类精度;蓝色表示经典的 ML 方法,红色表示深度卷积神经网络(CNN)方法。深度学习在这里把经典 ML 打得落花流水。
- **有效地利用数据扩展:**深度网络在利用更多数据时比经典的 ML 算法扩展得更好。下图简单而有效地说明了这一点。通常,提高深度网络准确性的最佳建议就是使用更多的数据!对于经典的最大似然算法,这种快速而简单的修复甚至不能很好地工作,并且通常需要更复杂的方法来提高精度。
- **不需要特征工程:**经典的 ML 算法往往需要复杂的特征工程。通常,首先对数据集进行深入的探索性数据分析。为了更容易处理,可以进行维数缩减。最后,必须仔细选择最佳特征以传递给 ML 算法。当使用深层网络时,没有必要这样做,因为人们可以直接将数据传递到网络,通常可以立即获得良好的性能。这完全消除了整个过程中庞大且具有挑战性的特征工程阶段。
- **适应性和可移植性:**深度学习技术可以适应不同的领域和应用,远比经典的 ML 算法更容易。首先,迁移学习使得将预先训练的深度网络用于同一领域内的不同应用变得有效。例如,在计算机视觉中,预训练的图像分类网络经常被用作对象检测和分割网络的特征提取前端。使用这些预训练的网络作为前端简化了整个模型的训练,并且通常有助于在更短的时间内实现更高的性能。此外,不同领域中使用的深度学习的相同基本思想和技术通常是非常可移植的。例如,一旦理解了语音识别领域的底层深度学习理论,那么学习如何将深度网络应用于自然语言处理就不会太具挑战性,因为基线知识非常相似。对于经典的 ML,情况完全不同,因为构建高性能的 ML 模型需要特定领域和特定应用的 ML 技术和特征工程。不同领域和应用的经典 ML 的知识库是非常不同的,并且通常需要在每个单独的领域内进行广泛的专门研究。
经典机器学习>深度学习
- **更适用于小数据:**为了实现高性能,深度网络需要非常大的数据集。前面提到的预训练网络是在120 万张图像上训练的。对于许多应用程序来说,这样的大型数据集并不容易获得,而且获取起来既昂贵又耗时。对于较小的数据集,经典的 ML 算法通常优于深度网络。
- **财务和计算成本低廉:**深度网络需要高端 GPU 在合理的时间内用大数据进行训练。这些 GPU 非常昂贵,但没有它们,将深度网络训练到高性能实际上是不可行的。为了有效地使用这样的高端 GPU,还需要快速的 CPU、SSD 存储以及快速和大容量的 RAM。经典的最大似然算法只需要一个像样的 CPU 就可以很好地训练,不需要最好的硬件。因为它们在计算上不那么昂贵,所以人们也可以更快地迭代,并在更短的时间内尝试许多不同的技术。
- **更容易解释:**由于经典 ML 中直接涉及的特征工程,这些算法相当容易解释和理解。此外,调整超参数和改变模型设计更加简单,因为我们对数据和底层算法有了更透彻的理解。另一方面,深层网络是非常“黑箱”的,因为即使现在研究人员也没有完全理解深层网络的“内部”。由于缺乏理论基础,超参数和网络设计也是一个相当大的挑战。
喜欢学习?
在推特上关注我,我会在那里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上和我联系吧!
深度学习周刊:测试自动驾驶(虚拟)
本周我将重点讨论深度学习如何用于自动驾驶汽车。在这个领域有很多机器学习应用,但我将聚焦于一项非常酷的技术:虚拟测试。
让我切入正题:下面是我的全自动驾驶汽车在虚拟测试环境中行驶的视频。诚然,虽然它看起来像一个 20 世纪 90 年代的复古(相当无聊)驾驶游戏,但这辆车是由深度卷积神经网络(CNN)控制的,该网络基于由 Nvidia 制作的深度学习算法的修改。
让我们深入了解一下这里发生了什么。我知道有些读者比其他人更熟悉自动驾驶技术的某些部分,所以我把它分成几个部分,这样你就可以跳到你感兴趣的部分。
自动驾驶汽车是如何工作的?
当我们开车时,我们会处理和解释周围成千上万的事情,因此自动驾驶汽车(SDC)软件也必须这样做。为了训练该软件,SDC 必须在路上行驶数千小时和数百万英里,以积累足够的信息来学习如何处理通常的道路情况,以及不寻常的情况(例如当一名坐在电动轮椅上的妇女在道路中间用扫帚追赶一只鸭子)。
为了节省令人难以置信的昂贵培训(这需要数千小时的安全驾驶员加上在公共道路上拥有训练车辆的安全风险),SDC 的开发者转向虚拟环境来训练他们的汽车。
SDC 通过车上的传感器(如摄像头、激光雷达、雷达、超声波、GPS 等)有效地“观察”其环境。)并将其转换为发送到汽车执行器的指令。最重要的命令是:
- 加速(油门 ) /减速(刹车)
- 向左/向右转动 X 度(转向)
虽然这种“转换”软件的细节和方法对于每个 SDC 开发者来说都是不同的,但它通常由一些本地化 ( 车在哪里?)、方位 ( 汽车面向哪个方向?),检测 ( 车周围有什么?)、感知 ( 检测到的东西是交通信号还是行人或者其他车辆?)、 预测 ( 被检测到的东西接下来会做什么?)、 运动规划 *(汽车下一步应该移动到哪里?)、*和车辆命令 ( *向汽车的发动机、制动和转向发送信号)。*这些大多以机器和深度学习为核心。
在电子游戏中训练自动驾驶汽车
为真实道路驾驶进行上述转换的相同软件也可以用于虚拟测试环境。为了训练深度学习算法,我将驾驶一辆装有传感器的汽车在模拟器中的赛道上行驶几次(想象一下:任何赛车视频游戏),并记录传感器(在这种情况下,是摄像头)在模拟器中“看到”的图像。
例如,如果这是我在玩赛车游戏时看到的:
然后,我的虚拟汽车左、前、右的摄像头看到这个:
然后,我的代码会将这些图像转换成驾驶命令,这些命令会反馈到汽车的控制装置中(在模拟器中)。简而言之:
- 虚拟传感器在视频游戏中“看到”他们周围的虚拟世界。
- 在训练期间(当我驾驶汽车在赛道上行驶 ): 算法被教导将它看到的图像与我手动(即非自主)驾驶汽车在赛道上行驶的方式(油门和速度)相关联。这是标记的训练数据,它教授深度学习算法。
- 例如,代码被教导将上述三个图像与“将方向盘转到 0.22 度,并将速度设置为 8.99 英里/小时”相关联。
- 在推理过程中(当汽车在没有我控制的情况下自动驾驶 ): 代码看到它的环境- >将其输入训练好的算法- >算法输出速度和油门- >汽车更新它的速度和油门- >重复。
有很多模拟器可以用于这个训练(我用的是 Udacity 的开源模拟器)。
请注意,如果你玩的是侠盗猎车手,你的 Playstation/Xbox 会将你手持设备上的控制器转换成游戏中的信号。所以不难想象,它也可以像上面算法的“输出”一样,被不同的控制器控制。
Screenshot of Grand Theft Auto V.
那么算法是如何工作的呢?
这是基于一个深度卷积神经网络(CNN:见另一篇每周文章这里)的,它接收模拟器中摄像头捕捉的图像,并返回转向角度(我暂时将油门控制放在一边)。
我使用的神经网络架构类似于英伟达开创性的“自动驾驶汽车的端到端深度学习”神经网络,在这里和在这个架构中描述:
我的代码是使用 Tensorflow(与 Keras)和工作方式:
- 裁剪图像,只关注前方的道路(而不是天空)
- 标准化图像
- 应用四个卷积层
- 应用四个完全连接的层
- 在我手动驾驶汽车在赛道上行驶四圈时收集的大约 40,000 张图像上进行训练
- 应用随机优化(Adam 优化器)来减少转向角的均方误差。
它非常高效——它使用 GPU 支持(一个 g2.2xlarge AWS 实例),仅用两次迭代(称为纪元 ) 10 秒就训练了网络。对于那些感兴趣的人,这里是我的代码。
深度学习周刊:人工智能、人工智能和人工智能之间的差异
我想后退一步,把一些我们经常听到的术语放在上下文中,即“人工智能”(AI)、“机器学习”(ML)和“深度学习”(DL)。他们之间有什么区别?
免责声明:为了保持这个非常高的水平和简短,我不打算对每一个给出全面的解释。重点是对每一个以及它们之间的差异进行温和的介绍。
Source: Nvidia
1 .艾伦·图灵- >人工智能(AI)
艾伦·图灵(Alan Turing)是一名数学家、密码学家,他在二战中破译了英格玛机,他还是逻辑学家、哲学家、剑桥院士(22 岁)和超长距离赛跑运动员。他还为现代计算机和人工智能奠定了基础。
Alan Turing, photo taken before WW2. Source: turing.org.uk
他的作品在 20 世纪 50 年代渗透到了更广泛的公众知识中。这就产生了“通用人工智能”的概念:计算机能拥有和人类一样的智能特征吗,包括推理、互动和思考?答案是响亮的“不”(至少还没有)。
因此,我们不得不专注于“窄人工智能”——能够完成特定任务的技术,比如下棋、推荐你的下一个网飞电视节目,以及识别垃圾邮件。所有这些都展示了人类智慧的部分。但是它们是如何工作的呢?那是机器学习。
2 .人工智能- >机器学习(ML)
在高层次上,ML 通常意味着
- *数据:*获取大量(清理过的)数据,带有人为定义的特征(如“年龄”、“身高”、“FICO 评分”、“这是垃圾邮件吗?”等等。)
- 训练:利用数据“调优”各特征的相对重要性
- *推断:*根据新数据预测某事
这方面的一个例子是预测垃圾邮件:谷歌邮箱收集了大量关于什么是垃圾邮件和什么不是垃圾邮件的数据(这被称为“标记数据”)。然后,该算法识别垃圾邮件与非垃圾邮件的共同特征。然后,该算法对未标记数据(即新邮件)运行,以预测它们是否是垃圾邮件。
When you select spam messages, you are training Gmail’s ML algorithms to better predict future spam messages
ML 需要大量的人工干预,例如手动告诉垃圾邮件过滤器在垃圾邮件与非垃圾邮件中要查找什么(例如,查找“Western Union”/查找指向可疑网站的链接等)。).在图像上也不太准确。
3 .机器学习- >深度学习
DL 是 ML 的子集。它基于神经网络,这是一种自 20 世纪 50 年代以来就存在的大脑概念模型,但直到最近才被广泛忽视。这是因为它们的计算成本非常高,而且只是在最近,1)通过 GPU 和 FPGAs,处理变得足够便宜和强大,2)有足够的数据来感受 DL 算法。
DL 是以前帖子的重点,所以我不会重复太多细节,除了在高层次上,“深度”一词来自于 DL 算法是在深度神经网络上训练/运行的。这些只是(通常)有三层或更多“隐藏”层的神经网络。例如,每一层可以起到识别奥迪 A7 图片的不同特征的作用。
Abstraction of a DL algorithm (hence trained/run on a deep neural network) to recognize an image of an Audi A7. Source: ACM 2011, Lee et. al
深度学习周刊:什么是神经网络?
对于本周的文章,我想通过我收集的一个简单的例子来阐明什么是神经网络。我还对它进行了编码,因为我想向大家展示代码输出的各个部分——这是理解神经网络功能的重要部分。
例子:一个困惑的投资者的问题
假设你是一名风险投资家,想知道你应该投资哪些初创企业。你看了数百家初创企业,对每一家都写下:
- 他们已经筹集了多少钱
- 他们的员工中有百分之多少是工程师
- 他们最终是否成功,从 1(最成功)到 4(整个集群)
然后,您决定将这些信息放在一个图表中,在 x 轴上绘制(1)金钱,在 y 轴上绘制(2) %工程师。每个标记的颜色代表他们有多成功。你会发现:
x-axis = money raised (as a percentile of all companies you’ve seen), and y-axis = % of start up that are engineers, also normalized. DISCLAIMER: THIS IS ENTIRELY MADE UP DATA FOR ILLUSTRATIVE PURPOSES.
好吧…😕但是你从中学到了什么呢?不多。数据显示成功的初创企业总是筹集到更多的资金吗?不,不总是…成功的初创企业有更多的工程师吗?不,不总是…
因此,接下来你可以试着画线来区分成功创业和不成功创业的“区域”。你试着去做,但结果发现*真的很难。*这是你徒劳的尝试之一:
虽然你的数据显示,一般来说,拥有最多资金和工程师的公司更成功,但你应该把界限划在哪里?线下面有一堆绿色/蓝色的点,所以很明显这不是一条非常准确的线。
所以你有点卡住了…
“进来”神经网络
(请原谅投资者的双关语……)
上述问题被称为*分类:*给定一家初创公司的数据,你如何系统地对其成功进行分类。
神经网络只是模型,它接受关于“事物”的各种属性,然后对“事物”进行分类。例如,“事物”可以是一个初创企业(属性是筹集的资金和%的工程师),并对其成功程度进行分类。或者“东西”可以是美国选民(属性是她居住的城市和家庭收入),分类是她将投票给民主党还是共和党。
我不会深入讨论它们如何工作的血淋淋的细节,因为我想把重点放在这里的结果上,但是在一个高层次上,这就是你的启动分类示例的神经网络的样子:
The investor’s neural network, to predict the start ups’ success from 1 (very successful) to 4 (a total cluster). Only the first 6 rows are shown, but you’ll generally have thousands of rows / start ups.
这是一个全连接神经网络的例子,因为每个输入都连接到每个输出。输入中的每一行(即启动)都有两个值:筹集的资金和工程师百分比。输出是模型对创业成功的预测**。**
你可以在你的原始图表上想象这个神经网络,来显示你成功的“区域”:
Here we’ve centered both axes on zero, to compare to average.
这当然比你第一次尝试画的直线要好。但还是不太好,因为红色区域有一堆黄色点,蓝色区域有一堆绿色点,等等。
这就是“T2”隐藏层“T3”概念的由来。这意味着在输入和输出层之间附加一层节点(数学函数)。这些改进了模型,也允许非线性,这意味着这些区域不一定会被直线分割。下面是你的神经网络和一个单独的隐藏层的样子:
Your neural network with one hidden layer. The output is the model’s prediction about the start ups’ success level
同样,你可以在你的原始图表上看到这一点:
这是方式更好!你看到隐藏层是如何添加一些非线性的了吗?这个模型现在是一个更好的初创企业分类器。但是…它仍然不是完美的,因为一些蓝色的点延伸到绿色区域(在右边),一些红色的点进入橙色区域。因此,你可以通过在你的神经网络中添加第二个隐藏层来进一步改进这个,这意味着它看起来会像:
Your neural network with two hidden layers. Please don’t make me draw any more lines…
同样,我们可以在图表上直观地看到这一点,看看我们的模型对数据的分类有多好:
如你所见,这几乎是对你的初创企业的完美分类!一旦你验证并测试了这个模型(见下面的警告),你就可以使用这个神经网络来预测一家初创公司是否会成功,只需测量他们已经筹集了多少资金,以及初创公司的下属中有多少是工程师。
(如果你感兴趣,这里的是我上面的代码。)
重要警告
这篇文章的目的是向你展示神经网络是如何创建和工作的。我故意没有深入两个非常重要的概念:培训和验证。如果你想确保你的神经网络不是只对你给它的数据进行和操作,这些是绝对重要的。
换句话说,你的神经网络只在你已经见过的初创企业中训练过。只有在你验证了它之后,你才能相信它在新公司(你还没见过的)上的结果。
*如果你对神经网络的工作方式感兴趣,这里有一个很棒的概述
深度学习:应该使用哪些损失和激活函数?
这篇文章的目的是根据商业目标,为神经网络中最终层激活函数和损失函数的组合提供指导。
这篇文章假设读者了解激活函数。关于这些的概述可以在之前的帖子中看到:深度学习:神经元和激活功能概述
你想解决什么?
像所有机器学习问题一样,业务目标决定了你应该如何评估它的成功。
你是想预测一个数值吗?
例子:预测产品的合适价格,或者预测每天的销售数量
如果是这样,参见回归:预测数值一节
你想预测一个明确的结果吗?
例子:预测图像中看到的物体,或者预测对话的主题
如果是这样,接下来您需要考虑有多少个类以及您希望找到多少个标签。
如果您的数据是二进制的,它是或不是一个类(例如,欺诈、诊断、可能购买),请参见分类:预测二进制结果一节
如果你有多个类别(例如图像中的对象、电子邮件中的主题、适合做广告的产品)并且它们是排他性的——每个项目只有一个标签——参见分类:从多个类别中预测单个标签。如果您的数据中有多个标签,那么您应该查看章节分类:从多个类中预测多个标签。
回归:预测数值
例如,预测产品价格
神经网络的最后一层将有一个神经元,它返回的值是一个连续的数值。
为了了解预测的准确性,将其与真实值进行比较,真实值也是一个连续的数字。
最终激活函数
线性 —这产生了我们需要的数值
或者
ReLU —这导致一个大于 0 的数值
损失函数
均方误差(MSE) —这是预测值和真实值之间的均方差
分类:预测二元结果
例如,预测交易是否属于欺诈
神经网络的最后一层将有一个神经元,并将返回一个介于 0 和 1 之间的值,可以推断为一个大概值。
为了了解预测的准确性,将其与真实值进行比较。如果数据是该类,则真值为 1,否则为 0。
最终激活函数
Sigmoid —这导致一个介于 0 和 1 之间的值,我们可以推断该模型对该类中的示例有多确信
损失函数
二元交叉熵 —交叉熵量化两个概率分布之间的差异。我们的模型预测{p,1-p}的模型分布,因为我们有一个二元分布。我们使用二进制交叉熵将其与真实分布{y,1-y}进行比较
分类:从多个类别中预测单个标签
例如预测文档的主题
神经网络的最后一层将为每个类别提供一个神经元,它们将返回一个介于 0 和 1 之间的值,可以推断为一个可能值。输出结果是一个概率分布,其总和为 1。
为了了解预测的准确性,将每个输出与其对应的真实值进行比较。真值已经过一次热编码,意味着 1 出现在对应于正确类别的列中,否则出现 0
最终激活函数
Softmax —这导致每个输出的值在 0 和 1 之间,总和为 1。因此,这可以推断为一个概率分布
损失函数
交叉熵 —交叉熵量化两个概率分布之间的差异。我们的模型预测了{p1,p2,p3}的模型分布(其中 p1+p2+p3 = 1)。我们使用交叉熵将其与真实分布{y1,y2,y3}进行比较
分类:从多个类别预测多个标签
例如,预测图像中动物的存在
神经网络的最后一层将为每个类别提供一个神经元,它们将返回一个介于 0 和 1 之间的值,可以推断为一个可能值。
为了了解预测的准确性,将每个输出与其对应的真实值进行比较。如果“真值”列中出现 1,则它对应的类别存在于数据中,否则出现 0。
最终激活函数
Sigmoid —这导致一个介于 0 和 1 之间的值,我们可以推断出它在该类中的置信度
损失函数
二元交叉熵 —交叉熵量化两个概率分布之间的差异。我们的模型预测每个类别的{p,1-p}(二元分布)的模型分布。我们使用二进制交叉熵将它们与每个类别的真实分布{y,1-y}进行比较,并总结它们的结果
一览表
下表总结了上述信息,以便您快速找到适合您的使用案例的最终层激活函数和损失函数
我希望这篇文章是有价值的!关于神经网络和最终激活函数的更多信息,请参见之前的帖子:
在朋友的帮助下进行深度学习
当你开始一个新的领域时,最好是从能回答你问题的好公司、朋友或好社区开始。深度认知的社区是一个学习和谈论深度学习的好地方,在这里我就和大家说说。
如果你在这里,很可能你正在开始学习深度学习或相关领域,或者你只是好奇。他们两个都很好。好了,我们的主题是在社区中学习,特别是深度学习。
深度学习是一个令人惊叹的领域,几乎渗透到我们周围的一切。谷歌正在使用它,脸书正在使用它,如果你使用智能手机、Instagram 或 Snapchat,你就是这个伟大领域的用户之一。
学习深度学习
现在学习一些东西可能是令人生畏的;这就是为什么我们相信我们的学校系统或大学系统能够帮助我们应对这一挑战。但是,如果你想学一些普通教室里没有的东西,会发生什么呢?
如果你停留在“常规”的学习方式中,那就没那么容易了。从这篇文章中你将学到的最重要的事情之一是,这是可能的,如果你遵循我将要告诉你的,它可能会更有趣或更容易。
深度学习是使用不同种类的神经网络和优化网络的超参数的表示学习,以获得(学习)我们数据的最佳表示。如果你觉得这听起来很奇怪,请阅读这些介绍:
在这篇文章中,我将分享我如何研究深度学习并使用它来解决数据科学问题。这是一个…
towardsdatascience.com](/my-journey-into-deep-learning-c66e6ef2a317) [## 深度学习的“怪异”介绍
有关于深度学习的惊人介绍、课程和博文。但这是一种不同的介绍。
towardsdatascience.com](/a-weird-introduction-to-deep-learning-7828803693b0)
在朋友的帮助下学习
互联网给了我们与世界各地的人们一起学习的工具。我们有像 StackOverflow 、 Quora 、 LinkedIn 等许多很棒的平台,让我们可以和其他人见面、交谈、提问、获得答案,以及获得对几乎任何主题的观点。
我们也有 MOOCs,在那里我们可以与成千上万的人一起注册不同的课程,分享我们的学习经验和问题。
而学习深度学习的社区呢?
嗯,这就是 Deep Cognition 的人不久前创建的东西:一个结合了 StackOverflow、Quora 等最佳技术的平台,但其中的一切都是针对机器和深度学习的。
你现在要做的第一件事就是去那里注册:
一个活跃的社区,共同努力通过人工智能推动增长和创新。
community.deepcognition.ai](https://community.deepcognition.ai/)
好的,如果你现在在那里,你会在一个论坛中看到不同的主题。这些是像你我这样的人问的问题,整个社区都在努力帮助你。
深度认知社区
在社区内,你会发现不同的类别,在那里你可以看到关于计算机视觉、自然语言处理、数据准备,甚至如何在深度学习或机器学习中做 x 或 y 的线程。
这是一个非常酷的地方来分享你的想法,并找到那些让你夜不能寐的问题的答案。
您还可以找到针对深度学习工作室(DLS)用户的几个不同主题的讨论。如果你不知道 DLS 是什么,看看我不久前制作的视频:
大家好!在本文中,我将与您分享几个视频,带您浏览深度认知的平台…
towardsdatascience.com](/a-video-walkthrough-of-deep-cognition-fd0ca59d2f76)
它基本上是一个 web IDE,在这里您可以使用非常棒的工具来创建深度学习模型、读取数据、调整参数以及部署模型。你也有深度学习笔记本,里面安装了所有的东西,所以你可以很快开始工作。
你还可以找到关于该公司正在创造的过去和新挑战的帖子,如令人敬畏的汽水瓶识别挑战。你可以在这里看到这条线索:
这个挑战的目标是识别图像中出现的是哪一个汽水瓶。我们为您提供预先标记的…
community.deepcognition.ai](https://community.deepcognition.ai/t/soda-bottle-identification-challenge/267)
TL;速度三角形定位法(dead reckoning)
如果你没有时间在一个简单的帖子中阅读 100 个答案,有一个快速的方法来完成它。在社区中,他们有一个很酷的功能,叫做“总结这个话题”。
点击该按钮后,您将只能看到社区评为最有趣的帖子。你还想要什么?
所以不要再浪费时间了,去那里吧,开始和你的新朋友一起学习,玩得开心点:)。
感谢你阅读这篇文章。希望你在这里发现了一些有趣的东西:)
如果您有任何问题,请在 twitter 上添加我:
Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…
twitter.com](https://twitter.com/FavioVaz)
和 LinkedIn:
[## Favio Vázquez —首席数据科学家— OXXO | LinkedIn
查看 Favio Vázquez 在世界上最大的职业社区 LinkedIn 上的个人资料。Favio 有 15 个工作职位列在…
linkedin.com](http://linkedin.com/in/faviovazquez/)
那里见:)
使用 Apache Spark 进行深度学习—第 1 部分
第一部分全面讨论了如何使用 Apache Spark 进行分布式深度学习。这部分:什么是 Spark,关于 Spark+DL 的基础知识以及更多。你可以在这里阅读第二部分:用 Apache Spark 进行深度学习——第二部分。
第二部分可以在这里找到:用 Apache Spark 进行深度学习——第二部分。
Apache Spark 入门
如果您在数据领域工作,您很可能知道 Apache Spark 是什么。如果你没有,那也没关系!我来告诉你是什么。
Apache Spark TM.
Spark,被它的创造者定义为一个用于大规模数据处理的快速和通用引擎。
快速部分意味着它比以前处理大数据的方法(如经典的 MapReduce)更快。更快的秘密是 Spark 在内存(RAM)上运行,这使得处理速度比在磁盘上快得多。
通用部分意味着它可以用于多种用途,比如运行分布式 SQL、创建数据管道、将数据接收到数据库中、运行机器学习算法、处理图形、数据流等等。
RDD
From PySpark-Pictures by Jeffrey Thompson.
Apache Spark 的主要抽象和开端是弹性分布式数据集(RDD)。
RDD 是可以并行操作的容错元素集合。您可以在驱动程序中并行化现有集合,或者引用外部存储系统中的数据集来创建它们,例如共享文件系统、HDFS、HBase 或任何提供 Hadoop InputFormat 的数据源。
关于 Spark,需要知道的非常重要的一点是,所有的转换(我们将很快定义它)都是懒惰的,这意味着它们不会立即计算出结果。相反,他们只记得应用于某个基本数据集(如文件)的转换。仅当动作需要将结果返回给驱动程序时,才会计算转换。
默认情况下,每次对变换后的 RDD 执行操作时,都会对其进行重新计算。然而,您也可以使用持久化(或缓存)方法在内存中持久化一个 RDD,在这种情况下,Spark 会将元素保留在集群上,以便下次查询时可以更快地访问。还支持在磁盘上持久化 rdd,或者跨多个节点复制 rdd。
如果您想了解 Spark 中 rdd 的转换和操作的更多信息,请查看官方文档:
Java、Scala 和 Python 中的 Spark 2.3.0 编程指南
spark.apache.org](https://spark.apache.org/docs/latest/rdd-programming-guide.html#transformations)
数据框架
From PySpark-Pictures by Jeffrey Thompson.
从 Spark 2.0.0 a 开始,数据帧就是一个组织成指定列的数据集。它在概念上相当于关系数据库中的一个表或 R/Python 中的一个数据框,但是在底层有更丰富的优化。
我们不会在这里讨论数据集,但是它们被定义为一个分布式的数据集合,可以从 JVM 对象中构造,然后使用函数转换进行操作。它们只在 Scala 和 Java 中可用(因为它们是类型化的)。
数据帧可以由各种各样的源构建,例如:结构化数据文件、Hive 中的表、外部数据库或现有的 rdd。
https://aspgems.com/blog/big-data/migrando-de-pandas-spark-dataframes
简而言之,Dataframes API 是 Spark 创造者简化框架中数据处理的方式。它们非常类似于 Pandas 数据帧或 R 数据帧,但有几个优点。首先,它们可以分布在一个集群中,因此可以处理大量数据;其次,它们经过了优化。
这是社区迈出的非常重要的一步。到 2014 年,将 Spark 与 Scala 或 Java 一起使用要快得多,因为性能的原因,整个 Spark 世界都变成了 Scala(顺便说一句,这是一种非常棒的语言)。但是有了 DF API,这不再是一个问题,现在您可以在 R、Python、Scala 或 Java 中使用它获得相同的性能。
负责这种优化的是催化剂。你可以把它想象成一个向导,他会接受你的询问(哦,是的!,您可以在 Spark 中运行类似 SQL 的查询,在 DF 上运行它们,它们也会被并行化)和您的操作,并创建一个优化的计划来分配计算。
过程没那么简单,但是作为程序员的你根本不会注意到。现在它一直在那里帮助你。
深度学习和 Apache Spark
如果你想了解更多关于深度学习的知识,请在继续之前阅读这些帖子:
有关于深度学习的惊人介绍、课程和博文。但这是一种不同的介绍。
towardsdatascience.com](/a-weird-introduction-to-deep-learning-7828803693b0) [## 我的深度学习之旅
在这篇文章中,我将分享我如何研究深度学习并使用它来解决数据科学问题。这是一个…
towardsdatascience.com](/my-journey-into-deep-learning-c66e6ef2a317)
为什么要在 Apache Spark 上做深度学习?
这是我在开始研究这个课题之前问自己的问题。对我来说,答案分为两部分:
- Apache Spark 是一个惊人的框架,它以一种简单的声明式方式在集群中分布计算。正在成为各行各业的标准,因此将深度学习的惊人进步加入其中将是一件好事。
- 深度学习有些部分计算量很大,非常大!分发这些进程可能是解决这个和其他问题的方法,Apache Spark 是我能想到的分发它们的最简单的方法。
使用 Apache Spark 进行深度学习有几种方法,我之前讨论过,我在这里再次列出(不详尽):
1.大象:分布式 DL 带 Keras & PySpark:
elephas——使用 Keras & Spark 的分布式深度学习
github.com](https://github.com/maxpumperla/elephas)
2**。雅虎!Inc.** : TensorFlowOnSpark:
TensorFlowOnSpark 将 TensorFlow 程序引入 Apache Spark 集群
github.com](https://github.com/yahoo/TensorFlowOnSpark)
3。CERN 分布式 Keras (Keras + Spark):
dist-keras——分布式深度学习,侧重于分布式培训,使用 Keras 和 Apache Spark。
github.com](https://github.com/cerndb/dist-keras)
4。Qubole (教程 Keras + Spark):
[## 基于 Apache Spark | Qubole 的 Keras 分布式深度学习
深度学习已经被证明可以在不同的领域产生高效的机器学习模型。一些…
www.qubole.com](https://www.qubole.com/blog/distributed-deep-learning-keras-apache-spark/)
5。英特尔公司:BigDL(Apache Spark 分布式深度学习库)
BigDL:Apache Spark 的分布式深度学习库
github.com](https://github.com/intel-analytics/BigDL)
深度学习管道
Databricks
但是我将在这些文章中重点关注的是深度学习管道。
Spark-深度学习 Apache Spark 的深度学习管道
github.com](https://github.com/databricks/spark-deep-learning)
深度学习管道(Deep Learning Pipelines)是一个由 Databricks 创建的开源库,它使用 Apache Spark 为 Python 中的可扩展深度学习提供了高级 API。
这是一个令人敬畏的努力,它不会很久,直到被合并到官方的 API,所以值得一看。
与我之前列出的相比,这个库的一些优点是:
- 本着 Spark 和 Spark MLlib 的精神,它提供了易于使用的 API,可以在很少的几行代码中实现深度学习。
- 它侧重于易用性和集成,而不牺牲性能。
- 它是由 Apache Spark 的创建者(也是主要贡献者)构建的,因此它比其他 API 更有可能被合并为一个官方 API。
- 它是用 Python 编写的,所以它将与所有著名的库集成,现在它使用 TensorFlow 和 Keras 这两个目前主要的库来做 DL。
在下一篇文章中,我将完全关注 DL pipelines 库以及如何从头开始使用它。您将看到的一件事情是在简单的管道上转移学习,如何使用预先训练的模型处理“少量”数据并能够预测事情,如何通过在 SQL 中提供您创建的深度学习模型来增强公司中每个人的能力,等等。
此外,我将创建一个环境,在深度认知平台中使用这个库在笔记本上工作,这样您就可以测试一切。如果您还没有帐户,请创建一个免费帐户:
无需编码即可设计、训练和部署深度学习模型。深度学习工作室简化并加速了…
deepcognition.ai](http://deepcognition.ai)
哦!!顺便说一句,如果你想了解更多关于 Python 数据科学中的管道的知识,可以看看 Matthew Mayo 写的这些好文章:
[## 用 Scikit-learn 管道管理机器学习工作流第 1 部分:简介
你熟悉 Scikit-learn 管道吗?它们是管理机器的一个非常简单但非常有用的工具…
www.kdnuggets.com](https://www.kdnuggets.com/2017/12/managing-machine-learning-workflows-scikit-learn-pipelines-part-1.html) [## 使用 Scikit-learn 管道管理机器学习工作流第 2 部分:集成网格搜索
在我们的上一篇文章中,我们将 Scikit-learn 管道视为简化机器学习工作流程的一种方法。
www.kdnuggets.com](https://www.kdnuggets.com/2018/01/managing-machine-learning-workflows-scikit-learn-pipelines-part-2.html) [## 使用 Scikit 管理机器学习工作流-学习管道第 3 部分:多模型,管道…
首先,我知道我承诺过我们会在上一篇文章中讨论玩具数据集,但是为了便于比较,我们会…
www.kdnuggets.com](https://www.kdnuggets.com/2018/01/managing-machine-learning-workflows-scikit-learn-pipelines-part-3.html)
关于 Spark 管道的简介,请查看:
估计器抽象了学习算法或任何适合或训练数据的算法的概念。技术上…
spark.apache.org](https://spark.apache.org/docs/latest/ml-pipeline.html)
一会儿见:)
如果您想联系我,请务必在 twitter 上关注我:
Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…
twitter.com](https://twitter.com/faviovaz)
和 LinkedIn:
[## Favio Vázquez -数据科学家/工具经理 MX - BBVA 数据&分析| LinkedIn
查看 Favio Vázquez 在世界上最大的职业社区 LinkedIn 上的个人资料。Favio 有 13 个工作职位列在…
www.linkedin.com](https://www.linkedin.com/in/faviovazquez/)
使用 Apache Spark 进行深度学习—第 2 部分
第二部分全面讨论了如何使用 Apache Spark 进行分布式深度学习。我将完全专注于 DL pipelines 库以及如何从头开始使用它。你将看到的事情之一是在一个简单的管道上转移学习,如何使用预先训练的模型来处理“少量”数据,以及能够预测事情等等。
By my sister https://www.instagram.com/heizelvazquez/
大家好,欢迎回来学习:)。在本文中,我将继续讨论 Apache Spark 的深度学习。这里可以看到第一部。
在这一部分中,我将完全专注于 DL pipelines 库以及如何从头开始使用它。
Apache Spark 时间表
Apache Spark 的不断改进让我们开始讨论如何利用它进行深度学习。我创建了一个详细的 Apache Spark 开发时间表,看看我们是如何走到这一步的。
很快我会写一篇文章来描述这个时间线,但是如果你觉得有什么遗漏,请告诉我:)
深度学习管道
Databricks
深度学习管道(Deep Learning Pipelines)是一个由 Databricks 创建的开源库,它使用 Apache Spark 为 Python 中的可扩展深度学习提供了高级 API。
Spark-深度学习 Apache Spark 的深度学习管道
github.com](https://github.com/databricks/spark-deep-learning)
这是一个令人敬畏的努力,它不会很久,直到被合并到官方的 API,所以值得一看。
与结合 Spark 和 DL 的库相比,这个库的一些优点是:
- 本着 Spark 和 Spark MLlib 的精神,它提供了易于使用的 API,可以在很少的几行代码中实现深度学习。
- 它侧重于易用性和集成,而不牺牲性能。
- 它是由 Apache Spark 的创建者(也是主要贡献者)构建的,因此它比其他 API 更有可能被合并为一个官方 API。
- 它是用 Python 编写的,所以它将与所有著名的库集成,现在它使用 TensorFlow 和 Keras 这两个目前主要的库来做 DL。
深度学习管道建立在 Apache Spark 的 ML 管道之上,用于训练,并使用 Spark 数据帧和 SQL 来部署模型。它包括深度学习常见方面的高级 API,因此可以在几行代码中高效地完成:
- 图像加载
- 在 Spark ML 管道中应用预训练模型作为变压器
- 迁移学习
- 大规模应用深度学习模型
- 分布式超参数调整**(下一部分)**
- 在数据框架和 SQL 中部署模型
我将通过例子详细描述这些特性。这些例子来自 Databricks 的官方笔记本。
深度认知的阿帕奇火花
要运行和测试本文中的代码,你需要在深度认知中创建一个账户。
非常简单,然后您就可以访问它们的所有功能。当您登录时,您应该会看到以下内容:
现在只需点击左边部分,笔记本按钮:
你将会在 Jupyter 笔记本上安装所有的软件包:)。哦!这里有一个说明:火花笔记本(DLS 火花)是一个即将到来的功能,将于下个月的某个时候向公众发布,并告知它仍处于私人测试阶段(仅为本文)。
您可以在这里下载完整的笔记本来查看所有代码:
https://github.com/FavioVazquez/deep-learning-pyspark
图像加载
对图像应用深度学习的第一步是加载图像的能力。深度学习管道包括实用功能,可以将数百万张图像加载到数据帧中,并以分布式方式自动解码,从而实现大规模操作。spark 的新版本(2.3.0)也有这个能力,但是我们将使用 sparkdl 库。
我们将使用 TensorFlow 策划的知识共享许可花卉照片档案来测试这一点。要获得花卉照片集,请从笔记本中运行以下命令(我们还将创建一个示例文件夹):
https://gist.github.com/FavioVazquez/33350294e31213ff761bf2ff51e25c4a
让我们从郁金香和雏菊文件夹中复制一些照片,创建一个小的照片样本。
https://gist.github.com/FavioVazquez/8ce726807f6074c05a779ee4e5e3a4d0
要在笔记本上查看这些图像,您可以运行以下命令:
https://gist.github.com/FavioVazquez/efaa901f85b51c77d520595136a2cb52
你应该看看这个
现在让我们使用 Spark 将这些图像作为数据帧加载。方法spark.readImage
可以让你读取普通格式的图像(jpg,png 等)。)从 HDFS 存储器转换成数据帧。每个图像都以 imageSchema 格式存储为一行。递归选项允许您从子文件夹中读取图像,例如阳性和阴性标签样本。sampleRatio 参数允许您在使用完整数据训练模型之前使用较小的图像样本进行实验。
https://gist.github.com/FavioVazquez/85266329b7ef31411600f33c3b9eee1e
如果我们看一下这个数据帧,我们会看到它创建了一个列,称为“image”。
image_df.show()+--------------------+
| image|
+--------------------+
|[file:/Users/favi...|
|[file:/Users/favi...|
|[file:/Users/favi...|
+--------------------+
image 列包含一个字符串列,该列包含一个 image 结构,schema == ImageSchema。
迁移学习
Databricks
深度学习管道提供了在图像上执行转移学习的实用程序,这是开始使用深度学习的最快(代码和运行时)方式之一。使用深度学习管道,只需几行代码就可以完成。
深度学习管道通过特征的概念实现快速迁移学习。下面的例子结合了 InceptionV3 模型和 Spark 中的逻辑回归,使 InceptionV3 适应我们的特定领域。deepimagefeaturezer 自动剥离预训练神经网络的最后一层,并使用所有先前层的输出作为逻辑回归算法的特征。由于逻辑回归是一种简单而快速的算法,这种迁移学习训练可以使用比从头开始训练深度学习模型通常所需的图像少得多的图像来快速收敛。
首先,我们需要为迁移学习创建训练和测试数据框架。
https://gist.github.com/FavioVazquez/84b0201f2ec0cbfc64fa3736bc7a76b5
现在我们来训练这个模型
https://gist.github.com/FavioVazquez/96e13301b6286eb7b52f34faedce4c24
让我们看看这个模型有多好:
https://gist.github.com/FavioVazquez/27fa7de28011d41b192d723a185a9b87
Test set accuracy = 0.9753086419753086
对于一个例子来说还不算太坏,而且根本没有调整!
我们可以看看我们在哪里犯了错误:
https://gist.github.com/FavioVazquez/dcd72fe4f0f4204736d46ba57112cb97
大规模应用深度学习模型
深度学习管道支持使用 Spark 以分布式方式运行预训练的模型,可用于批处理和流数据处理。
它包含一些最受欢迎的模型,使用户能够开始使用深度学习,而无需训练模型的昂贵步骤。当然,该模型的预测是与 Spark 带来的所有好处并行完成的。
除了使用内置模型,用户还可以在火花预测管道中插入 Keras 模型和张量流图。这将单节点工具上的任何单节点模型转变为可以在大量数据上以分布式方式应用的模型。
下面的代码使用 InceptionV3 创建了一个火花预测管道,这是一个用于图像分类的最先进的卷积神经网络(CNN)模型,并预测我们刚刚加载的图像中有哪些对象。
https://gist.github.com/FavioVazquez/b6e4ab8787f4bd4a7186d858a86c3521
让我们来看看预测数据框:
predictions_df.select("predicted_labels").show(truncate=False,n=3)+----------------+
|predicted_labels| | |
+----------------+
|[[n03930313, picket_fence, 0.1424783], **[n11939491, daisy, 0.10951301]**, [n03991062, pot, 0.04505], [n02206856, bee, 0.03734662], [n02280649, cabbage_butterfly, 0.019011213], [n13133613, ear, 0.017185668], [n02219486, ant, 0.014198389], [n02281406, sulphur_butterfly, 0.013113698], [n12620546, hip, 0.012272579], [n03457902, greenhouse, 0.011370744]] ||**[[n11939491, daisy, 0.9532104]**, [n02219486, ant, 6.175268E-4], [n02206856, bee, 5.1203516E-4], [n02190166, fly, 4.0093894E-4], [n02165456, ladybug, 3.70687E-4], [n02281406, sulphur_butterfly, 3.0587992E-4], [n02112018, Pomeranian, 2.9011074E-4], [n01795545, black_grouse, 2.5667972E-4], [n02177972, weevil, 2.4875381E-4], [n07745940, strawberry, 2.3729511E-4]]||**[[n11939491, daisy, 0.89181453]**, [n02219486, ant, 0.0012404523], [n02206856, bee, 8.13047E-4], [n02190166, fly, 6.03804E-4], [n02165456, ladybug, 6.005444E-4], [n02281406, sulphur_butterfly, 5.32096E-4], [n04599235, wool, 4.6653638E-4], [n02112018, Pomeranian, 4.625338E-4], [n07930864, cup, 4.400617E-4], [n02177972, weevil, 4.2434104E-4]] |
+----------------+
only showing top 3 rows
请注意,predicted_labels
列显示“雏菊”是使用此基础模型的所有样本花的高概率类别,由于某种原因,郁金香更接近于栅栏而不是花(可能是因为照片的背景)。
然而,从概率值的差异可以看出,神经网络具有辨别两种花类型的信息。因此,我们上面的迁移学习示例能够从基础模型开始正确地学习雏菊和郁金香之间的差异。
让我们看看我们的模型如何辨别花的类型:
https://gist.github.com/FavioVazquez/271c069453b5917d85aeec0001d54624
对于 Keras 用户
为了使用 Spark 以分布式方式应用 Keras 模型,[KerasImageFileTransformer](https://databricks-prod-cloudfront.cloud.databricks.com/public/4027ec902e239c93eaaa8714f173bcfc/6026450283250196/3874201704285756/7409402632610251/link_here)
在 TensorFlow 支持的 Keras 模型上工作。它
- 通过将用户指定的图像加载和处理功能应用于包含一列图像 URIs 的输入数据帧,在内部创建包含一列图像的数据帧
- 从给定的模型文件路径加载 Keras 模型
- 将模型应用于图像数据帧
要使用 transformer,我们首先需要将 Keras 模型存储为一个文件。对于这款笔记本,我们将只保存 Keras 内置的 InceptionV3 模型,而不是训练模型。
https://gist.github.com/FavioVazquez/bc7d280cd98a7112cb96f13cded20259
现在我们将创建一个 Keras 转换器,但首先我们将预处理图像来使用它
https://gist.github.com/FavioVazquez/b1a43d8611e1fd2db9a3c61742156e97
我们现在将读取图像并将它们加载到 Spark 数据帧中,然后使用我们的转换器将模型应用到图像中:
https://gist.github.com/FavioVazquez/531c2852f936e4a2cbbe2f4afbad47d5
如果我们看一下这个带有预测的数据框架,我们会看到很多信息,这只是概念 3 模型中每一类的概率。
使用一般张量
深度学习管道还提供了应用具有张量输入(高达 2 维)的模型的方法,这些模型是在流行的深度学习库中编写的:
- 张量流图
- Keras 模型
在本文中,我们将只关注 Keras 模型。KerasTransformer
将 TensorFlow 支持的 Keras 模型应用于高达 2 维的张量输入。它从给定的模型文件路径加载一个 Keras 模型,并将该模型应用于一列数组(其中一个数组对应一个张量),输出一列数组。
https://gist.github.com/FavioVazquez/bab4fbf9c39aade9b92dbbea95127cec
final_df.show()+-------------+--------------------+
| predictions| features|
+-------------+--------------------+
| [0.86104786]|[-0.76344526, 0.2...|
| [0.21693115]|[0.41084298, 0.93...|
|[0.057743043]|[0.062970825, 0.3...|
| [0.43409333]|[-0.43408343, -1....|
| [0.43690935]|[-0.89413625, 0.8...|
| [0.49984664]|[-0.82052463, -0....|
| [0.6204273]|[-0.5075533, 0.54...|
| [0.2285336]|[0.016106872, -0....|
| [0.37478408]|[-1.6756374, 0.84...|
| [0.2997861]|[-0.34952268, 1.2...|
| [0.3885377]|[0.1639214, -0.22...|
| [0.5006814]|[0.91551965, -0.3...|
| [0.20518135]|[-1.2620118, -0.4...|
| [0.18882117]|[-0.14812712, 0.8...|
| [0.49993372]|[1.4617485, -0.33...|
| [0.42390883]|[-0.877813, 0.603...|
| [0.5232896]|[-0.031451378, -1...|
| [0.45858437]|[0.9310042, -1.77...|
| [0.49794272]|[-0.37061003, -1....|
| [0.2543479]|[0.41954428, 1.88...|
+-------------+--------------------+
only showing top 20 rows
在 SQL 中部署模型
将模型生产化的一种方法是将其部署为 Spark SQL 用户定义函数,这允许任何懂 SQL 的人使用它。深度学习管道提供了采用深度学习模型和注册Spark SQL 用户定义函数(UDF)的机制。特别是,深度学习管道 0.2.0 增加了对从处理图像数据的 Keras 模型创建 SQL UDFs 的支持。
得到的 UDF 接受一个列(格式化为图像结构“SpImage”)并产生给定 Keras 模型的输出;例如,对于 Inception V3,它在 ImageNet 对象类别上产生实值分数向量。
https://gist.github.com/FavioVazquez/3a36edf25a289f4ee31cff1bf3857467
在处理图像的 Keras 工作流中,在将模型应用于图像之前,通常会有预处理步骤。如果我们的工作流需要预处理,我们可以选择为 UDF 注册提供预处理功能。预处理器应该接收一个文件路径并返回一个图像数组;下面是一个简单的例子。
https://gist.github.com/FavioVazquez/a02094a5848ab1f7e42ce52820a09fbe
注册 UDF 后,可以在 SQL 查询中使用它:
https://gist.github.com/FavioVazquez/af566a98d19952eb0b61938c4752f7dc
这个很厉害。一旦数据科学家构建了所需的模型,深度学习管道就可以轻松地将其作为 SQL 中的函数公开,因此他们组织中的任何人都可以使用它-数据工程师、数据科学家、业务分析师,任何人。
sparkdl.registerKerasUDF("awesome_dl_model", "/mymodels/businessmodel.h5")
接下来,组织中的任何用户都可以在 SQL 中应用预测:
SELECT image, awesome_dl_model(image) label FROM images
WHERE contains(label, “Product”)
在下一部分中,我将讨论使用 Spark 进行分布式超参数调优,并将尝试新的模型和示例:)。
如果您想联系我,请务必在 twitter 上关注我:
Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…
twitter.com](https://twitter.com/faviovaz)
和 LinkedIn:
用数字海洋进行深度学习:Redux
这篇文章会和我平时的商务类文章有点不一样。在最近的一篇文章中,我给人的印象是数字海洋不是部署深度学习系统的好地方。然而,有一些部署到 DigitalOcean 的良好用例可以节省成本和复杂性。
最近,一个客户让我们在云中部署一个回归模型。训练是在 K20 GPU 上进行的。
This is what the 1-click install button looks like in DigitalOcean
我们尝试在一个 2GB 内存的新 droplet 上使用 DigitalOcean 的“机器学习和人工智能”一键安装。结果相当惊人。
首先,我们用这个升级了 tensorflow:
**pip install --upgrade tensorflow** #to resolve *ImportError: 'load_weights' requires h5py.*
pip3 install --upgrade h5py
要升级 keras(可选),请使用以下命令:
**pip install keras --upgrade**
让代码在 Keras 2 上工作的现成问题。阅读文档的正确版本:【https://faroit.github.io/keras-docs/2.0.8/,用这个检查你的版本:
import keras
print(keras.__version__)
数字海洋的执行时间结果
一个DNN(MLP**)**在 11.4 秒内训练 7 层(针对 10000 个样本,20 个输入,10 个输出类)。对 1000 个样本的测试花费了 968 毫秒。真快。代码如下:
要计算 1000 个模型预测的时间,只需像这样:
一个**【LSTM】(**用于序列预测 ) 走得也真快。我们用这种模型来预测股票价格之类的东西。LSTMs 的另一个有趣的用途是回归,但让我们坚持这个例子。该示例对于 144 个数据点花费了 33.5 秒。**但是,**模型预测(不包括训练)只用了 16 毫秒!
The prediction output looks as expected for the LSTM. The real data (ground truth) is in blue, while the training result is in orange, and testing result is in green.
一个CNN(vgg 19**)**2GB 的内存不足以运行模型,所以我在 8GB 的实例上这样做。对于其他一些 2GB 的 CNN,我同样得到了 ResourceExhaustedError 和其他垃圾。没什么大不了的。在 8GB 内存的情况下,它的工作非常出色。加载模型并获得一个结果需要 8.6 秒,但模型预测本身要快得多。
处理 100 张图像并对每张图像进行模型预测需要 4 分 23 秒。所以,以秒计,就是 240+23 = 263 秒。除以图像的数量,就是 2.63 秒。不太好。下面是时间代码:
我的下一步是在 word2vec (Google news)中嵌入一个单词模型,但是,唉,我必须回到真正的工作中去了。嵌入模型有一个类似 CNN 的内存大小问题。
数字海洋的成本结果
在 AWS 上,在 2 个 20 美元/月的实例上运行 DNN 和 LSTM 要比 1 千美元/月的 p2 或 p3 实例便宜得多。对于这些较小的模型来说,这很有意义。对于更大的 CNN 和 word2vec 模型,没有足够的计算(没有 GPU)或 RAM(对于大型嵌入模型)来使 DigitalOcean 具有吸引力。这可能会改变,例如,如果有一种方法可以从 SSD 而不是 RAM 加载 word2vec 模型。我是说,为什么不呢?它基本上只是一个大的记忆垫。这就解决了单词嵌入的问题,但是 CNN 呢?那是一个更难的问题。我认为对于图像处理来说,GPU 在未来很长一段时间内仍将是顶级产品。
如果你喜欢这篇关于云中深度学习的文章,那么请尝试一下 clap 工具。轻点那个。跟着我们走。分享这篇文章的链接。去吧。我也很高兴在评论中听到你的反馈。你怎么想呢?
如果你喜欢这篇文章,可以看看我过去读过最多的文章,比如“如何给人工智能项目定价”和“如何聘请人工智能顾问”除了与业务相关的文章,我还准备了一些关于寻求采用深度机器学习的公司所面临的其他问题的文章,如“没有云和 API 的机器学习”
编码快乐!
-丹尼尔
丹尼尔@lemay.ai ←打个招呼。
LEMAY . AI
1(855)LEMAY-AI
您可能喜欢的其他文章:
利用合成数据的深度学习将使人工智能能够为大众所用
在人工智能的世界里,数据为王。它为深度学习机器提供了动力,这些机器已经成为解决许多具有挑战性的现实世界人工智能问题的首选方法。我们拥有的高质量数据越多,我们的深度学习模型的表现就越好。
科技五巨头:谷歌、亚马逊、微软、苹果和脸书都在利用这一点上处于有利位置。他们可以比其他任何人更高效、更大规模地收集数据,这仅仅是因为他们拥有丰富的资源和强大的基础设施。这些科技巨头正在使用从你和大多数你认识的使用他们服务的人那里收集的数据来训练他们的人工智能。富人越来越富!
Amazon.com Inc. employees shop at the Amazon Go store in Seattle
这些公司积累的大量图像和视频数据集已经成为一种强大的竞争优势,是阻止较小企业闯入其市场的护城河。对于资源少得多的初创公司或个人来说,即使他们的产品很棒,也很难获得足够的数据来竞争。获取高质量的数据在时间和金钱上都是昂贵的,这两种资源是较小的组织无法承担的。
这种优势将被合成数据的出现所颠覆。它正在被任何人创建和利用合成数据来训练计算机的能力所破坏,包括零售、机器人、自动驾驶汽车、商业等等。
合成数据是模拟真实数据的计算机生成的数据;换句话说,数据是由计算机而不是人类创造的。可以设计软件算法来创建真实的模拟数据或“合成”数据。你可能以前见过 Unity 或虚幻引擎,这些游戏引擎使得创建视频游戏和虚拟模拟变得容易。这些游戏引擎可以用来创建大型合成数据集。然后,合成数据可以用来训练我们的人工智能模型,就像我们通常处理真实世界数据一样。
Nvidia 最近的一篇论文展示了如何做到这一点。他们的一般程序如下图所示,他们通过随机化每个可能的变量生成合成图像,包括图像场景、物体、照明位置和强度、纹理、形状和比例。
Illustration of how to generate high quality and realistic synthetic data in a game engine, from the research paper: Training Deep Networks with Synthetic Data: Bridging the Reality Gap by Domain Randomization
能够如此快速、轻松地创建高质量的数据,让这些小家伙又回到了游戏中。许多早期创业公司现在可以通过创建数据模拟器来生成带有质量标签的上下文相关数据,以训练他们的算法,从而解决他们的冷启动问题(即在很少或没有数据的情况下启动)。
模拟的灵活性和多功能性使其在这些高度可变的条件下训练和测试自动驾驶汽车变得特别有价值和更加安全。模拟数据也更容易标记,因为它是由计算机创建的,因此节省了大量时间。它便宜、廉价,甚至允许人们探索通常难以获取数据的利基应用,例如健康或卫星成像领域。
初创公司与拥有固有数据优势的现有公司竞争的挑战和机遇是,利用带有正确标签的最佳视觉数据,为不同的用例准确训练计算机。模拟数据将在大型科技公司和创业公司之间建立公平的竞争环境。随着时间的推移,大公司也可能会创建合成数据来增加他们的真实数据,有一天这可能会再次倾斜竞技场。无论是哪种情况,技术都比以前进步得更快,人工智能的未来是光明的。
喜欢学习?
在 twitter 上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上和我联系吧!
推荐阅读
想了解更多关于深度学习的知识?用 Python 进行 深度学习 本书将教你如何用有史以来最简单的 Python 库:Keras 进行真正的深度学习!
提醒一句,我支持这个博客,因为分享好书对每个人都有帮助。作为一名亚马逊员工,我从合格购买中获得收入。
Tensorflow 深度学习:第 1 部分—理论和设置
how does a deep learning network work?
大家好,欢迎来到这个关于 Tensorflow 的博客系列。在第 1 部分中,我会给你一些关于框架的基本信息,我会向你展示如何在 Windows 10 上设置你的编码环境。让我们深入研究一下。
Tensorflow 是最受欢迎的,显然也是最好的深度学习框架。这是为什么呢?
TensorFlow 是 Google 为创建深度学习模型而创建的框架。深度学习是一种使用多层神经网络的机器学习模型(=算法)。
机器学习使我们能够非常准确地构建复杂的应用程序。无论是与图像、视频、文本甚至音频有关,机器学习都可以从广泛的范围解决问题。Tensorflow 可以用来实现所有这些应用。
它受欢迎的原因是开发人员可以轻松地构建和部署应用程序。由于接下来的部分,我们将更仔细地研究 GitHub 项目,这些项目非常强大,但也很容易使用。此外,Tensorflow 是在考虑处理能力限制的情况下创建的。该图书馆可以在各种电脑上运行,甚至可以在智能手机上运行(是的,甚至可以在那种上面有半个苹果的高价电脑上运行)。我可以向你保证,使用 8 GB 内存的英特尔酷睿 i3 处理器,你不会遇到性能问题。
Deep learning concept of Tensorflow
但是在学习 Tensorflow 之前,我们要了解一个基本原理。如何才能让我们的机器“思考”?
人脑由数十亿个神经元组成,这些神经元通过突触相互连接。如果对神经元的“足够”突触输入触发,那么神经元也将触发。这个过程叫做思考。为了在计算机上复制这一过程,我们需要机器学习和神经网络。如果你对这些条款不满意,我会解释给你听。
机器学习:
很简单,机器学习让计算机‘学习’。传统上,我们总是通过提供一组严格的指令来让计算机做事情。机器学习使用一种非常不同的方法。我们不是给计算机一套如何做某事的指令,而是给它如何学习做某事的指令。例如:想象一个系统,它可以将动物的图片分类为“猫”、“狗”或“老鼠”。机器学习不是从这些动物的图像中手动找到独特的特征,然后将其编码,而是接受这些动物的图像,并自己找到特征和差异。这个教计算机的过程被称为训练。
深度学习:
深度学习是一种实现机器学习的技术。它使用神经网络进行学习,有时,使用决策树也可以称为深度学习,但在大多数情况下,深度学习涉及到神经网络的使用。
神经网络:
那么,什么是神经网络?这里有一个类比:把神经网络想象成一系列一个接一个的门,把你自己想象成神经网络的“输入”。每次你打开一扇门,你就变成了不同的人。当你打开最后一扇门的时候,你已经变成了一个完全不同的人。当你从最后一扇门出去时,你就成了神经网络的“输出”。在这种情况下,每扇门代表一层。因此,神经网络是以某种方式转换输入以产生输出的层的集合。
如果想了解更多,可以试试下面这篇文章:
https://medium . com/forward-data-science/tensor flow-for-absolute-初学者-28c1544fb0d6
足够的理论,让我们做设置和安装
本手册适用于使用 Python 3.6 的 Tensorflow 1.2.1。在跟随它之前,你可能也想看一看官方安装指南。
计算机编程语言
Tensorflow 程序是用 Python 写的,你可以在https://www.python.org/downloads/下载
您可以在 Python 3 和 Python 2 之间进行选择,但是我强烈建议您安装一个比 3.5 更新的版本,因为这些版本已经附带了一个集成的 PIP-Package。否则,您也必须安装它。
张量流
下一步是安装 Python。以管理员身份打开命令行。),并写下下面一行:
pip3 install --upgrade tensorflow
如果您想测试安装,请这样写:
python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, Tensorflow')
>>> sess = tf.Session()
>>> print(sess.run(hello))
您现在应该会看到一个“Hello,Tensorflow”输出。
结论
恭喜你!您刚刚学习了 Tensorflow 的理论基础,并设置了一切来更深入地研究这个问题。下一部分将是关于盗梦空间的图像处理和识别。敬请关注,直到下次!
__
张量流深度学习:第二部分——图像分类
image classification
大家好,欢迎回到我的紧张流系列,这是第二部分。
我已经在第一部分描述了神经网络和 Tenserflow 的逻辑和功能,也向你展示了如何建立你的编码环境。如果你还没有检查过,在这里找到它。
图像识别和分类是这一部分的主题。使用 Inception-v3 模型,我们将开始使用 Google 预先训练的 ImageNet 数据集对图像进行分类,然后继续构建我们自己的分类器。我们开始吧。
什么是 inception-v3 模型?
Inception v3 模型是一个深度卷积神经网络,它已经使用 2012 年的数据为 ImageNet 大型视觉识别挑战进行了预训练,它可以区分 1000 个不同的类别,像“猫”、“洗碗机”或“飞机”。
TensorFlow 团队已经准备了关于如何在你的机器上执行图像分类的教程。不过,我还是会给你看的。
基于预训练 ImageNet 数据集的图像分类
因为我们不是从零开始,所以从克隆 GitHub 的 Tensorflow 模型 repo sitory 开始。运行以下命令:
git clone https://github.com/tensorflow/models.git
cd models/tutorials/image/imagenet
python classify_image.py
如果你还没有安装 Git,在这里下载。
当程序第一次运行时,从谷歌的后端下载训练好的模型。您的硬盘上需要大约 200 MB 的可用空间。
上述命令将对提供的熊猫图像进行分类。
如果模型正确运行,脚本将产生以下输出:
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)
如果您希望提供其他图像,您可以通过编辑--image_file
参数来实现:
python classify_image.py --iAmAdifferentImage.jpg
这并不难,是吗?但是不要担心,它会变得更有挑战性。上面的脚本允许我们在 Google 团队预先训练的课程上对图像进行分类。但是如果你想为我们自己的课程重新培训盗梦空间呢?
针对特定类别重新培训 Inception 的最终层
Inception’s layer model
设置
我们将向初始模型添加四个新的类,称为“圆形”、“正方形”、“加号”和“三角形”。
首先从 GitHub 克隆我的存储库,键入:
git clone [https://github.com/koflerm/tensorflow-image-classifier.git](https://github.com/koflerm/tensorflow-image-classifier.git)
在您克隆了提到的存储库之后,我们必须以某种方式告诉 Inception 每个图像的正确标签是什么。
因为我们要对一个对象是三角形、正方形、加号还是圆形进行分类,所以我们需要添加一个“training_dataset”目录,并用四个子文件夹填充它,并以“class”标签命名。这些文件夹将包含要进行分类的受试者的数据集(图像)。
/
--- /training_dataset
| |
| --- /circle
| | circle1.jpg
| | circle_small_red.png
| | ...
| |
| --- /square
| square.jpg
| square3.jpg
| ...
接下来,我们必须实际获取用于训练过程的数据集。由于手动下载每张图片非常耗时,我们使用了一个名为“ Fatkun 批量下载图片”的 Chrome 扩展。它允许我们从谷歌图片搜索中自动下载前 50 张图片。只需将它们复制到文件夹中(图像格式并不重要!)
exemplary training images for class “plus”
执行
设置好所有目录和数据集后,开始训练吧!双击执行train.sh
脚本。该脚本安装初始模型(如果还没有安装的话),并为指定的图像数据集启动重新训练过程。
re-training process
一旦这个过程完成,它将返回大约 90%的训练准确率。
重新培训的标签、图表和培训总结将保存在名为tf_files
的文件夹中,以备您查看。
在重新训练模型之后,现在是在我们自己的图像上测试模型的时候了。下载或绘制另一个图像,并将其复制到根目录。我下载了另一张“三角形”图片。通过键入以下命令执行测试:
python classify.py downloadedImage.jpg
left: downloadedImage.jpg | right: score for each class
太好了,我的三角形居然被归为三角形!
(可选):如果您已经为新类添加了一些图像或子文件夹,但是您不想调用train.sh
和classify.sh
,您可以通过键入以下命令来合并输入:
python retrain.py — bottleneck_dir=tf_files/bottlenecks — how_many_training_steps=500 — model_dir=inception — summaries_dir=tf_files/training_summaries/basic — output_graph=tf_files/retrained_graph.pb — output_labels=tf_files/retrained_labels.txt — image_dir=training_dataset — eval_step_interval=100 & python classify.py image.jpg
注意:image.jpg 是您想要测试的图像
分类问题
尽管分类在大多数情况下确实有效,但还是有一些问题:
Gets recognized as a plus
Again, not recognized as a circle
Inception 是为单标签图像分类而训练的,这意味着多标签分类是不可能的。如果我仍然想将上面的图像归类为圆形,我只需为该类使用更准确的训练集。这实际上有点费时,单靠 Chrome 扩展无法为你提供所有最好的结果。
好了,我们已经看到程序做了它应该做的事情(至少大部分时间)。但是再培训过程是如何进行的呢?
基本上,该脚本加载预训练的 Inception v3 模型,移除旧的顶层,并在您想要添加的几何形状类上训练新的顶层。这就是所谓的迁移学习。再培训分为两个阶段——瓶颈和培训:
第一阶段分析磁盘上的所有映像,并计算每个映像的瓶颈值。“瓶颈”是一个非正式的术语,指的是实际进行分类的最终输出层之前的层。它将图像处理成有意义且简洁的图像摘要。
第二阶段是网络顶层的实际训练。您可以看到一系列的步骤输出,每个输出都显示了训练精度、验证精度和交叉熵。训练准确度显示了在训练中使用的图像的百分比被标记为正确的类别。验证准确度是从不同组中随机选择的一组图像的精确度。交叉熵是一个损失函数,它给出了学习过程进展如何的一瞥。
如果你想深入了解,请往这边走
结论
恭喜,你现在能够使用 Tensorflow 对图像进行分类。在第三部分,我将向您展示 Tensorflow 的一些其他用例。所以请继续关注,直到下一篇文章!
__
使用 Tensorflow 进行深度学习:第 3 部分—音乐和文本生成
text summarization: one example of generating text using Tensorflow
大家好,欢迎回到我的紧张流系列,这是第三部分。
我已经在的第一部分中描述了神经网络和 Tenserflow 的逻辑和功能,并在的第二部分向你展示了如何进行图像分类。在这一部分,我将向您概述 Tensorflow 应用程序,并向您展示如何生成音乐和文本。
Tensorflow 允许我们构建复杂的应用程序。在处理多个输入源时,几乎所有事情都可以用 Tensorflow 来实现,甚至特斯拉的自动驾驶仪也可以用它来制作。为了更好地了解 Tensorflow 的可能性,我收集了人们已经用它制作的例子的简短摘要:
Predicting college basketball results through the use of Deep Learning
接下来,我将更详细地解释音乐生成和文本生成。我们将开始研究音乐生成,今天生成音乐的可能性,我们将编写自己的流行音乐生成器。稍后,我们将看看文本生成,一个具体的例子,并建立我们自己的诗歌生成器。让我们开始吧。
🎵音乐一代
介绍
亲爱的歌曲作者,
我很抱歉地告诉你,但在未来几年内,你将被机器学习算法取代。为什么?因为现在音乐可以由电脑生成。想象一下这种工具的威力。与创作一首歌所需的数百个小时相比,在一个程序中点击“开始”根本不算什么。
我想这对一些人来说可能听起来有点奇怪,考虑到音乐通常被称为“情感”和“感觉”的东西,而不是“事实”或“数学”的东西,但机器学习使这成为可能。但是它是如何工作的呢?
所以,假设你想做一首特别的歌,一首“快乐”和“有趣”的歌。第一步是获得一组带有情感标签的歌曲数据。这个程序会把语音转换成文本。对于每个单词,程序会创建向量并训练模型。完成训练后,程序会找到你输入的相关向量(“快乐”和“有趣”),并将它们与之前创建的向量进行比较。输出将是一组代表你想要的情感的和弦。
生成音乐的可能性
Example song, generated with Magenta
Magenta 是目前最先进的机器学习音乐生成技术,但你自己听听。这是一个来自谷歌大脑团队的项目,它问:我们可以使用机器学习来创作引人注目的艺术和音乐吗?Magenta 建立在 TensorFlow 之上,使用 CNN 系统。
建造我们自己的音乐发电机
虽然 Magenta 非常强大,但我们将使用受限玻尔兹曼机器(RBM) 构建我们自己的简单音乐生成器来生成短序列的流行音乐。
我们将收到多个文件,如果您将它们链接在一起,听起来会像这样:
Transistions between the files aren’t smooth, that’s not because of the generated music itself!
我们的训练数据将在一百个流行歌曲的 MIDI 文件左右( MIDI 是一种直接编码音符的格式)。为了简单起见,我们不会像介绍中描述的那样给它们贴上情绪的标签,我们的输出将是另一种流行旋律,就像我们的训练文件一样。
RBM 是一个有两层的神经网络,可见层和隐藏层。每个可见节点都连接到每个隐藏节点(反之亦然),但没有可见-可见或隐藏-隐藏连接(节点只是进行计算的地方)。这就是限制。每个可见节点取一个弦。每个和弦乘以一个权重,然后是隐藏层节点的输出。与大多数神经网络不同,RBM 是直接对数据的概率分布建模的生成模型。为了从 RBM 采样,我们执行一种称为 吉布斯采样 的算法。如果你想了解更多关于 RBM 氏症的知识,请走这条路。
理论谈得够多了,让我们从从 GitHub 克隆我的 repo 开始构建吧。打开终端并键入:
git clone [https://github.com/koflerm/tensorflow-music-generator.git](https://github.com/koflerm/tensorflow-music-generator.git)
接下来,我们必须安装几个库:
pip3 install pandas
pip3 install msgpack-python
pip3 install glob2
pip3 install tqdm
pip3 install py-midi
我们将按如下方式使用它们:
- 熊猫是我们的数据分析库
- Midi 作为我们音乐文件的辅助库
- TQDM,用于在进程中打印进度条。
set of pop song sequences
歌曲存储在Pop_Music_Midi
文件夹中。你也可以使用你自己的训练数据,但是歌曲必须是 MIDI 格式的。).在这里找到一些。
基本上,这就是准备工作,你现在可以执行程序了。要运行该脚本,只需编写:
python rbm_chords.py
Training process
培训将需要 5-10 分钟。输出将是out
文件夹中 MIDI 文件的集合,每个文件大约 10 秒长。如果你只想听“一首歌”,你也可以写一个脚本把它们连接起来。
output
就是这样,你成功创作了音乐。如果你没有理解我写的所有内容(对不起…),我强烈推荐你分别阅读和聆听这两个帖子:
- https://www.youtube.com/watch?v=ZE7qWXX05T0&feature = youtu . be
- http://danshiebler . com/2016-08-10-musical-tensor flow-part-one-the-RBM/
✍ 文字生成
介绍
如前所述,在不久的将来,算法可能会取代歌曲作者。嗯,这也适用于诗人。我们将编写一个程序,根据威廉·莎士比亚的戏剧生成一首诗。训练数据(诗歌)存储为文本文件,文件名也是标签。首先,我将向您展示另一个使用 Tensorflow 生成文本的示例。
谷歌收件箱中的智能回复
Smart Reply System, integrated in the Inbox app on Android
用手机回复电子邮件是一件非常痛苦的事情,即使是简短的回复。这就是谷歌在其收件箱应用中实现智能回复的原因。他们希望建立一个系统,可以自动确定电子邮件是否可以用简短的回复来回答(文本识别),并为其撰写一些合适的回复(文本生成)。
他们需要建立一个机器学习系统,因为想象一下使用一个依赖于手工制作的常见回复场景规则的系统。任何工程师发明“规则”的能力都会很快被大量不同的写作风格超越。相比之下,机器学习系统可以自己捕捉不同的情况。它比基于规则的系统更好地概括和处理新输入。
谷歌选择在一对循环神经网络 (RNN)的基础上建立智能回复系统,一个用于编码收到的电子邮件,一个用于预测可能的回复。编码网络一次提取一个新邮件的单词,并生成一个向量。这种所谓的“思维向量”抓住了所说内容的核心,而不会纠结于它是如何说的(例如,向量“你明天有空吗?”应该与“明天你方便吗?”的向量相同).第二个网络从这个思维向量开始,一次一个单词地做出语法正确的回复,就像在打字一样。每个网络的详细操作完全是通过训练模型来预测可能的反应而学习的。
对智能回复系统感兴趣?在这里阅读更详细的解释。
建造我们自己的诗歌生成器
是时候在威廉·莎士比亚的作品上建立我们的文本生成器了。我们将使用递归神经网络来训练我们的模型。在对它进行训练之后,我们的脚本将会生成一首诗,它既可以在终端中查看,也可以在文本文件中查看。
首先,我知道诗歌一点也不有趣。但是不用担心,你可以很容易地改变数据集;).让我们深入研究一下。
从从 GitHub 克隆我的库开始:
git clone [https://github.com/koflerm/tensorflow-shakespeare-poem-generator.git](https://github.com/koflerm/tensorflow-shakespeare-poem-generator.git)
data set consisting of multiple poems
你可以看到,有一个Shakespeare
文件夹,里面有多首诗。简单地把你自己的 TXT 文件放在那里,如果你想改变话题。
现在是时候训练我们的语言模型了。
> python3 rnn_train.py
这需要几个小时,所以要小心!如果你没有那么多时间,你可以下载检查点文件(最终模型)。不用先训练模型!只需将文件解压到checkpoints
文件夹中。
一切都设置好了,是时候生成一些文本了。键入以下行:
> python3 rnn_play.py
脚本 rnn_play.py 使用我们训练好的检查点生成一个新的“莎士比亚”剧本。你可以在终端和文件output_generated.txt
中看到输出
这就是你自己的诗,用莎士比亚的方式写的。
结论
恭喜你,你现在可以创作你自己的音乐,也可以创作你自己版本的莎士比亚戏剧了。在下一部分,我可能会更深入地研究图像分类和物体检测。所以请继续关注,直到下一篇文章!
Tensorflow 深度学习:第 4 部分—人脸分类和视频输入
Can we classify different people?
大家好,欢迎回到我的紧张流系列,这是第 4 部分。这可能是这个系列的最后一部分,因为我们已经学到了很多:
- 第 1 部分全是理论,我们看了神经网络和张量流的逻辑和功能。
- 在第二部分,我们用几何形状进行图像分类。
- 在 part 3 中,我们成功生成了自己的音乐和文字。
由于图像分类是神经网络最有趣的部分(至少在我看来),我们将在这一部分再次进行。但是,在我们继续重建分类器以接收视频输入之前,我们将对人的图像进行分类,而不是几何形状。让我们去争取吧。
回顾我们在第 2 部分中构建的分类器
how did our classifier work?
你可能不记得第二部分是关于什么的,所以这里有一个简短的总结:
我们构建了一个程序,它加载了来自 Google 的预训练的 Inception v3 模型,移除了旧的顶层,并在我们想要添加的几何形状类上训练了一个新的顶层。再培训分为两个阶段——瓶颈阶段和培训阶段。瓶颈将我们的图像处理成一个有意义的和紧凑的摘要,训练实际上训练了我们神经网络的顶层。如果还是不清楚,请阅读第二部分;)
给人分类
上次,我们在初始模型中添加了四类几何形状。这一次,我们将对三个不同的人进行分类:“史蒂夫·乔布斯”、“比尔·盖茨”和“马克·扎克伯格”。让我们看看《盗梦空间》是否足以区分这些人的面孔:
首先从 GitHub 克隆我的存储库,键入:
git clone [https://github.com/koflerm/tensorflow-image-classifier.git](https://github.com/koflerm/tensorflow-image-classifier.git)
接下来,我们需要添加我们的训练图像并给它们贴上标签。建立一个这样的结构:
/
--- /training_dataset
| |
| --- /billgates
| | billy.jpg
| | bill_gates.png
| | ...
| |
| --- /stevejobs
| stevejobs.jpg
| jobs.jpg
| ...
| |
| --- /markzuckerberg
| zuckerberg46.jpg
| zuckerberg2020.jpg
| ...
为了下载图片,我使用了一个名为“批量下载图片”的 Chrome 扩展。这个扩展允许你自动下载谷歌图片到你的电脑上。图像格式不重要!
how images for the Steve-Jobs-class could look like
是时候训练我们的模型了
设置好数据后,让训练开始!双击执行train.sh
脚本。该脚本安装初始模型,并为指定的图像数据集启动重新训练过程。
re-training process
一旦这个过程完成,我们的训练准确率应该在 90%左右。
在重新训练模型之后,现在是用其他图像测试模型的时候了。下载并复制到根目录,然后键入:
python classify.py downloadedBillGates.jpg
好吧,很好。但是我们的模型表现如何呢?
model works!
比尔·盖茨直视镜头,光线还不错,所以没问题。
success!
令人惊讶的是,合适的人又得到了认可。图像分辨率很差(300x300),扎克伯格甚至不在图像的中心。干得好,盗梦空间!
Both are recognized, but both can’t get a high score
这是一个棘手的问题!Inception 是为单标签图像分类而训练的,这意味着它的总得分为 1。多标签分类是不可能的,而且由于我们的两个类都显示在图像中,所以都不可能得到高分。如果我想让这张图片更像“史蒂夫·乔布斯”,我必须为他的班级使用更准确、更大的训练集。
Again, Gates over Jobs
这张图片再次被归类为盖茨胜于乔布斯,这一次是以巨大的优势。我猜,在准确的照明条件下,更准确的训练集和更多的训练数据可能会让史蒂夫·乔布斯赢得这场决斗。
All about Steve Jobs this time
最后,这个人被认出来了!但这对我们的模特来说并不难,不是吗(很棒的灯光,他直视镜头,…)
Testing on images with other, unknown people
盖茨被认出来了,马克·扎克伯格也是(尽管他不在照片上)。我猜《盗梦空间》把桑德罗·罗塞尔(左边)当成了马克·扎克伯格,但没错,肯定是不匹配!
(可选):如果您现在想要添加新的类,可以通过键入以下命令将培训和测试结合起来:
python retrain.py — bottleneck_dir=tf_files/bottlenecks — how_many_training_steps=500 — model_dir=inception — summaries_dir=tf_files/training_summaries/basic — output_graph=tf_files/retrained_graph.pb — output_labels=tf_files/retrained_labels.txt — image_dir=training_dataset — eval_step_interval=100 & python classify.py image.jpg
注意:image.jpg 是你想用来测试你的模型的图像
现在你知道了,我们可以用盗梦空间对人脸进行分类。但是现在,让我们继续为视频输入重建分类器。
重建我们的视频输入分类器
image classification using a video as input stream and analyzing it frame-by-frame
到目前为止,我们一张一张地下载了我们的测试数据,但是这很费力,不是吗?用视频输入来测试我们的模型会容易得多。我们只需要插入一个视频一次,但是分类是一帧一帧完成的。简单多了。因此,让我们建立这样一个系统:
我们的代码如何变化
基本上没什么变化。我们只需要触摸classify.py
脚本。我将一步一步地引导你完成这些改变:
pip install opencv-py
首先,打开一个终端并安装 OpenCV,一个用于视频处理和图像分析的库。
import cv2
import math
然后我们需要加载和处理我们的视频。我们通过导入 OpenCV 模块来做到这一点。数学包的导入实际上是可选的,只有当你不想处理每一帧时才需要它。
rewritten part of the code
这是代码的重要部分。如果你想更深入一点,请阅读评论,我认为他们自己说了算。原理很简单:当我们得到一个视频帧时,我们存储它并立即再次读取它用于分类目的,然后在一个单独的窗口中输出分数和帧本身。
现在,让我们用比尔·盖茨和史蒂夫·乔布斯的对话视频来测试我们的模型。
但首先,我认为你必须同时…执行train.sh
并等待直到进程完成:)
然后,有趣的部分开始了。我将在下面的视频中测试我的模型:
Video does not contain Mark Zuckerberg
接下来,我们要等很长时间,直到比尔·盖茨第一次被拍摄。分类器有什么反应?
Gates gets recognized more or less
正如我们所看到的,模型实际上对他进行了正确的分类,尽管比尔·盖茨的头被切掉了一点。我们当然知道我们的模型现在确实适用于视频,但它也能识别史蒂夫·乔布斯吗?
Perfect recognition
是的。用乔布斯的话其实更好,分数大概是 0.9。但是有一个问题仍然悬而未决:如果两个人都在同一个框架里会发生什么?
Jobs over Gates here
这个框架被归类为“工作”。前面解释过,分数加起来一个,两个人都拿不到高分。
现在是时候接受新的挑战了:手绘。我们的模型能识别手绘物体吗?
我们将再次添加四个几何类“圆”、“三角形”、“正方形”和“加号”来完成:
让我们用手绘视频作为输入来测试我们的模型
因此,首先我们必须再次将我们的类添加到模型中,以防您在第 2 部分中删除了它们。最终,培训文件夹中应该会有这样的结构。
/
--- /training_dataset
| |
| --- /billgates
| --- /stevejobs
| --- /markzuckerberg
| --- /circle
| --- /square
| --- /plus
| --- /triangle
用训练图像填充所有这些文件夹。我将用谷歌搜索的图像填充它们,尽管这些图像不会是手绘!看事情如何发展会很有趣。
接下来,训练。在拍摄你自己的几何图形定制视频之前,运行train.sh
脚本来添加新的类到模型中。你也可以用我的,在 GitHub 上我的回购里找到的math_own_old.mp4
。
那么,我们来对一些框架进行分类。在命令行输入python classify.py math_own_old.mp4
,看看你的模型是否能够识别正确的形状。
Square gets classified correctly
多好的开始啊!正方形是成功的,但是其他的物体呢?
Our model mistakes triangle
好了,你知道了。我们的模型不识别手绘的三角形,它认为它是正方形。也许下一个…
Again, triangle not recognized
这值得一试,但它再次认为它是一个正方形。奇怪的是,加号似乎对模型也是不可见的。秘社是我们最后的希望!
Success!
是的,圆得到正确分类!但正如所见,对于一个由计算机生成的图像训练的模型来说,识别分辨率很差的手绘图片是非常困难的。
结论
所以,现在你知道了,用盗梦空间和张量流对人进行分类是可能的。此外,您还学习了如何重写一些代码来使用视频作为输入源。这是这个系列的最后一部分,我希望你喜欢这个旅程。我自己肯定学到了很多。如果你有任何类型的反馈给我,我会很感激的 ✌
深爱:现代爱情文章生成器
NYT 有一个名为“现代爱情”的每周专栏这是一系列关于各种形式的爱情的强烈个人化的文章,选自公众提交的作品。有一个故事是关于一个女人对当地面包师的迷恋,在故事中,她吃了很多烘焙食品,然后鼓起勇气约他出去。另一个描述了一个母亲的强烈的保护本能,当她把球直接扔向她年幼的儿子同样年幼的欺负者的头时,这种本能就表现出来了。这是一个迷人的、幽默的、真实的窗口,它向我们展示了一个激情战胜理智、尴尬和悔恨占据主导地位的世界。情感被暴露出来,然后通过后见之明的棱镜来审视,从而对人类的本质有所了解。
但是如果一个计算机程序可以生成这些文章呢?
LSTMs(长短期记忆)是一种用于预测序列的递归神经网络结构。他们擅长学习数据,如文本,具有长期依赖性,在预测时“记住”以前看到的信息。使用 Tensorflow 的 seq2seq 库,我在现代爱情文章的整个语料库上训练了一个单层 LSTM 和一个单词嵌入层。我用“我”这个词作为预测的引子,这样神经网络也可以讲述它关于爱和失去的故事。以下是生成文本的示例:
我又开始约会,一次又一次,不知道是否有人被我吸引:“你曾经想要他们孩子的注意力吗?”
对我来说是充实的一周,我设法让自己的沮丧一瘸一拐,然后我听到了对财务安全的不同理解?
在这个夜晚,他再次回到了摇摇欲坠的边缘,严厉的人们在激烈地进行着他们的比赛。我丈夫和虽然我们约会对方,并希望在犹豫不决的情况下,我的丈夫也是德鲁的,生母总是坚持要一份登记表。他的前额沐浴着。白人说,他可能经常振翅高飞。然后穿上它们,从未有过性的闪光是千变万化的,脆弱的和爱,我无法找到它,我甚至没有褪色,但我没有真正的朋友,我想知道发生了什么事的人,他现在用蹩脚的英语和后期。他们像那样重新体验自己的悲伤。
我们在公寓间接吻了。
可以说,NYT 专栏的人类作者目前是安全的。机器生成的文本可以捕捉句子的结构和一些主题。乍看之下,这看起来似乎有道理,但它基本上是无稽之谈。
在 Andrej Karpathy 的优秀博客中,他对保罗·格拉厄姆的论文、莎士比亚、维基百科、代数几何论文、Linux 源代码和婴儿名字进行了人物级的 RNN,得到了类似的无意义结果。