计算机与AI

计算机与AI 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑

数据科学科班出身,专注分享计算机和人工智能相关知识。
微信公众号/bi站/知乎:计算机与AI

个人动态

计算机与AI 发布了文章 · 2020-11-30

如果不想你被称做掉包侠,那么请有效地学习机器学习算法知识

机器学习远远超出了sklearn中简单的fit和predict方法。

背景:

现在大家都习惯说掉包侠这个词,尤其是人工智能领域。我的一个朋友就嘲笑我,说:“你这么久学会了什么?只是几个模型,我一周就学会了。” 那是他的原话。我只是对他微笑,并询问他学到了什么。他告诉了几种机器学习算法的名称。我问他确切地学到了什么,然后得出了使用Sklearn的拟合(fit)和预测(predict)方法的明显答复,并简要概述了该算法的工作原理。

我脸上露出邪恶的笑容,我问他要如何获得最佳参数?模型如何学习最佳权重?当我们有低延迟要求时我们该怎么办?尽管这些问题并不复杂,但他坐在那里静静地看着我的脸,我笑到了最后。

从故事中得出的结论是,机器学习远远超出了简单的拟合和预测方法。

我们大多数人只是在bi站上观看了一些视频,并声称我们了解机器学习,只是很快就意识到了我们的错误。对于所有自学的人来说, 请记住,有成千上万的人像您和我一样学习机器学习/数据科学。请记住,我们将与拥有硕士/博士学位的人竞争。在与数据科学相关的领域。因此,要与他们竞争,我们必须在基础方面真正扎实。

围绕机器学习的话题很多,新的课程每天都在涌现,目前有比实际工作更多的课程。拥有如此庞大的资源,就出现了选择正确路线的难题。

坦白地说,这些课程大多数都是平庸的(比如某些营销号中的广告),因此不会深入探讨。嗯,那里没有好课程,但是每门课程都提供不同的课程。很少涉及数学部分,很少擅长于写代码部分等等。因此,今天我不会特别提及任何课程。我将分享我在故事中向同一个朋友提出并建议的方法。我相信它也可以帮助您进行数据科学之旅。


在我们进入算法部分之前,让我告诉您在机器学习项目中确切地在哪里使用它们。完成机器学习项目涉及多个阶段,每个阶段都同样重要。

建模 是我们的机器学习算法进入的阶段,它只是机器学习生命周期中的重要阶段之一。

好吧,让我们深入研究机器学习算法的主要主题。

对于每种算法,我们需要注意一些重要的事情。

1.算法的背后的思想(或者说内涵)是什么?

最初,我曾经学习过一种算法,并且过了一段时间就忘记了,每当我回来修改它时,我都会发现很难理解当时我已经学到的算法。随着时间的流逝,我意识到,如果人类太过理论化,我们将无法真正记住它们;如果通过可视化来学习它,我们很可能会长时间记住它。这就是几何帮助我们以最简单的方式可视化算法核心的地方。如果我们对这些算法有一些很酷的现实生活例子,那么我们更倾向于更深入地理解它。

一旦从任意选择的课程中学习了算法,就打开一个新选项卡,然后开始搜索该算法的相关内容。相信我,互联网上有很多很酷的解释。对于初学者来说,CSDN和知乎是最好的起点。

2.算法如何工作?

一旦了解了它的直觉,请尝试一下并尝试观察算法的实际工作原理。您需要检查的另一件事是该算法如何处理各种形式的数据,例如文本/类别/数字。

在此阶段中,尝试多种因素并查看算法的工作原理,您可以参考Scikit-Learn提供的现有算法。检查算法的参数,然后尝试使用它们,看看它们如何影响模型的性能。

3.在哪里可以使用/在哪里不能使用?

这是大多数人经常错过的最重要因素,而他们更多地关注其作用和工作方式。深入了解该算法非常重要,它为何有效或为何无效。

尝试实验并了解它如何处理大型数据集和高维数据。如果容易出现异常值或数据集不平衡。

在面试中,最棘手的问题不是什么(what)和如何(who),而是为什么(why)。 假设明天您在学习算法后创建了一个个人项目,并且使用了特定的X算法来解决它,那么面试官最有可能问:为什么你要用X算法为什么不用Y算法?换句话说, 为什么您认为X算法比其他方法更有效?

好家伙!这就是为什么您应该知道它在哪里起作用以及在哪里不起作用的原因。

例如,您需要提出类似这样的答复:由于我们的数据是高维的,并且本质上是非线性的,因此由于种种原因,算法X倾向于比Y更好地处理非线性数据。

4.为什么算法的可解释性很重要

这是关键步骤之一,之所以如此重要,是因为作为数据科学家,您可能需要向可能完全没有技术知识的客户展示模型。在此期间,您可能需要说服他们他们的模型正在预测正确的结果,并且需要提供一些很好的理由让他们适应。您根本无法对它们施加准确性。如果您的算法是可解释的,那么您可以向他们展示模型预测的原因。可解释性只不过意味着算法的功能重要性。

例如:如果您正在从事医疗保健项目,则您的模型可以预测一个人的疾病为阳性/阴性。这是一个非常敏感的问题,他们无法承担可解释性出现时的错误。如果您的模型向您显示了(因为X特征(体内某些水平)大于x值之类的原因),作为积极/消极的人,这将变得更加容易和有意义。

5.为什么要学习算法的时间/空间复杂性?

当我们进行实时工作时,我们可能必须处理大量数据,并且如果需要低延迟,那么时空复杂度可以帮助您选择正确的算法。

如果您的模型占用更多内存,那么实时运行它会非常昂贵,尤其是当您使用云基础架构来运行模型时。有时,一些业务问题会带来较低的延迟要求,其中有些算法提供了较高的准确性,但由于其时间/空间复杂度的限制而无法满足要求。

百度,CSDN,博客园,知乎,简书是获取每种算法的所有这些相关信息的好资源。

6.为什么我们需要了解算法背后的数学原理?

再次提到数学?是的,是的,我明白了。即使不了解数学,我们也可以使用算法,只需从Sklearn这个库中导入即可,但是从长远来看,不建议这样做。(这就是很多人被称为掉包侠的原因,只会调用库函数)好吧,无论我们是否接受,我们绝对都需要数学以更好地了解汽车引擎盖下的实际情况。这可能会让一些人失望,但我得到一个好消息,我们无法避免使用数学运算,但可以简化它并避免进行严格的数学运算。

简而言之,大多数机器学习算法的工作是最小化实际输出与预测输出之间的差异(LOSS)

算法=最小化(损失)+正则项

例如,我们应该将逻辑回归的对数损失和SVM等的Hinge损失最小化。

注意:并非每种机器学习算法都如此,这仅适用于少数算法。

为了最大程度地减少这种损失,这些算法在内部使用了诸如梯度下降、牛顿法拟牛顿法等等其他最优化理论。因此,如果您对自己数学不太满意,那么只需尝试了解每种算法的损失函数及其梯度下降,就可以避免所有其他严格的数学运算并保持目标不变。一旦感到自己数学还OK,您就可以深入研究更多的数学知识。

7.为什么从头开始实施(可选):

如果假设您正在学习吉他,则首先要从基础开始,然后慢慢尝试复制别人已经创作的音乐,在此阶段,如果您了解他们如何创作音乐和进行调音,则可以下一步就是创建自己的音乐了吗?

同样,通过从头复制现有算法来实现它们,我们可以更清楚地了解现有算法。您将学到一些重要的知识点,可以帮助您将来建立更好的模型。请记住,由于某些问题,我们可能无法始终在我们的项目中使用Sklearn中算法的版本。在这种情况下,您必须准备以满足您要求的方式优化或修改算法。

这说起来容易做起来难,但是要花很多时间才能达到这一点,这就是为什么我将此标记为可选。至少尝试实现一种算法以了解其实际工作原理。如果您发现很难编写代码,请将算法分解为多个部分,然后先编写伪代码,然后再尝试将其转换为实际代码。(用面向对象的思想去解决问题,把每个部分当做一个函数或方法看待)

结论:

不要着急,花费自己的时间并尽可能最好地学习它,而不是学习一半然后每次都多次引用它。请记住,目标不是完美,而是坚实的基础,请相信我,我们永远无法完善目标,总是每天都会变得更好。如果您能理解算法的要旨并了解算法的工作原理,那么从长远来看,将来的你一定感谢现在努力的自己。(有点像鸡汤hhh)

在此过程中,如果您听不懂或被卡住,请将其放在一边,然后继续进行其他主题。不要只是坚持下去,浪费您宝贵的时间。稍后以崭新的心态返回并再次检查,请相信我,您会感到惊讶。如果您仍然无法理解某些内容,请搜索其他资源以更轻松的方式对其进行解释。

最后一步,将您所有的学习应用于不同数据类型和大小的多个数据集以获得真正的学习,实践就是一切。通过做这些事情,您将学到很多东西,而不是简单的阅读,所以请准备好动手。

如果您读了那么多书,您肯定有学习机器学习的热情,这是学习任何技能的最重要因素。不断学习,不要放弃。


查看原文

赞 0 收藏 0 评论 0

计算机与AI 发布了文章 · 2020-11-21

神经网络泛化

每当我们训练自己的神经网络时,我们都需要注意称为神经网络的 泛化 的问题。从本质上讲,这意味着我们的模型在从给定数据中学习以及将所学信息应用到其他方面有多出色。

在训练神经网络时,将有一些数据在神经网络上进行训练, 并且还将保留一些数据以检查神经网络的性能。如果神经网络在尚未训练的数据上表现良好,那么可以说它在给定数据上的推理效果很好。让我们通过一个例子来理解这一点。

假设我们正在训练一个神经网络,该神经网络应该告诉我们给定图像是否有狗。假设我们有几只狗的图片,每只狗属于某个品种,并且这些图片中总共有12个品种。我将保留10个品种的狗的所有图像进行训练,而这2个品种的其余图像将暂时保留。

现在,在进入深度学习之前,让我们从人类的角度来看待这一点。让我们考虑一个一生中从未见过狗的人(仅举一个例子)。现在,我们将向人类展示10种狗,并告诉他们这是狗。此后,如果我们向他们展示其他2个品种,他们是否能够说出它们也是狗?希望他们能做到,十个品种应该足以理解和识别狗的独特特征。从某些数据学习并将获得的知识正确应用于其他数据的这种概念 称为generalization(泛化)。

回到深度学习,我们的目标是使神经网络从给定的数据中尽可能有效地学习。如果我们成功地使神经网络了解到, 其他2个品种狗,那么我们已经培养了非常general(一般的)神经网络,它会在现实世界中执行得很好。

这实际上说起来容易做起来难,而训练通用神经网络是深度学习从业人员最令人沮丧的任务之一。这是由于神经网络中的一种现象,即过度拟合。如果神经网络对10种犬进行训练,并且拒绝将其他2种犬归为狗,那么该神经网络就过度适合了训练数据。这意味着神经网络已经 记住了 那10种狗,并且只将它们视为狗。因此,它无法形成 对狗长什么样的 _普遍了解_。在训练神经网络的同时解决这个问题是我们在本文中要探讨的。

现在,我们实际上没有自由在像“繁殖”这样的基础上划分所有数据。相反,我们将简单地拆分所有数据。数据的一部分,通常是较大部分(大约80–90%)将用于训练模型,其余部分将用于测试模型。我们的目标是确保测试数据的性能与训练数据的性能大致相同。我们使用诸如损失和准确性之类的指标来衡量这一绩效。

我们可以控制神经网络的某些方面,以防止过度拟合。让我们一一介绍。首先是参数数量。

参数数量

在神经网络中,参数的数量本质上是指权重的数量。这将与层数和每一层中神经元的数目成正比 。参数和过度拟合的数量之间的关系如下: 越多的参数,越容易导致过拟合。

我们需要根据复杂性来定义问题一个非常复杂的数据集将需要一个非常复杂的函数来成功理解和表示它。从数学上讲,我们可以将复杂度与非线性相关联 让我们回想一下神经网络公式。

在此,W1,W2和W3是此神经网络的权重矩阵。现在,我们需要注意的是方程中的激活函数,该函数适用于每一层。由于具有这些激活功能,因此每一层都与下一层非线性连接

第一层的输出为f(W_1 X)_(设L1)_,第二层的输出为f(W_2 L1)。如您所见,由于激活函数(f),第二层的输出与第一层具有非线性 关系。因此,在神经网络的末端,最终值Y相对于输入X具有一定程度的非线性,具体取决于神经网络中的层数

层的数量越多越多的激活函数扰乱层之间的线性度,并且因此更加非线性

由于这种关系,我们可以说, 如果神经网络 在每一层中具有更多的层更多的节点,它将变得更加复杂。因此,我们需要根据数据的复杂性来调整参数。除了重复实验和比较结果外,没有确定的方法。

在给定的实验中,如果测试指标远低于训练指标,则模型具有过拟合,这意味着神经网络 对于给定的数据具有 太多的参数。这基本上意味着神经网络对于给定的数据来说 太复杂 了,需要简化。如果测试分数与训练分数大致相同,则该模型已经 generalized,但这并不意味着我们已经达到了神经网络的最大潜力。如果我们增加参数,性能将会提高,但也可能会过拟合。因此,我们需要继续尝试通过平衡性能和泛化来优化参数数量

我们需要将神经网络的复杂度与数据复杂度相匹配 。如果神经网络太复杂,它将开始记忆训练数据,而不是对数据有一般的了解,从而导致过拟合。

通常,深度学习从业人员如何做到这一点是首先训练具有足够大量参数的神经网络,以使模型过拟合。因此,最初,我们尝试获得一个非常适合训练数据的模型。接下来,我们尝试迭代地减少参数的数量,直到模型停止过度拟合为止 ,这可以视为一种 最佳的神经网络。我们可以用来防止过度拟合的另一种技术是使用dropout神经元。

dropout神经元

在神经网络中,添加dropout神经元是减少神经网络过度拟合的最流行,最有效的方法之一。基本上网络中的每个神经元都有一定的概率从网络中完全退出。这意味着在特定时刻,某些神经元将不会连接到网络中的任何其他神经元。这是一个视觉示例:

在训练过程中的每一个瞬间,一组不同的神经元将以随机的方式掉落 。因此,我们可以说在每个时刻,我们都在有效地训练某个神经网络比原始神经网络少的某个 子集 神经网络。由于辍学神经元的随机性质,该子神经网络每次都会改变。

实际上,这里发生的是,当我们训练带有缺失神经元的神经网络时,我们基本上是在训练 许多较小的 子集神经网络,并且由于权重是原始神经网络的一部分,因此神经网络的最终权重可以视为 所有 相应 子集神经网络权重的平均值 。这是正在发生的事情的基本可视化:

这就是dropout神经元在神经网络中的工作方式,但是_为什么_dropout会阻止过度拟合?这有两个主要原因。

第一个原因是dropout的神经元促进神经元独立。 由于在特定瞬间可能存在或不存在围绕特定神经元的神经元这一事实,因此该神经元不能依赖于围绕其的那些神经元。因此,它会_被迫_成为更独立 ,同时训练。

第二个原因是由于dropout,我们实质上是一次训练多个较小的神经网络。通常,如果我们训练多个模型并求平均权重,则由于 每个神经网络的独立学习积累,性能通常会提高 。但是,这是一个昂贵的过程,因为我们需要定义多个神经网络并分别进行训练。但是,在辍学的情况下,这也做_同样的事情,_ 而我们需要 一个神经网络,就可以从中训练 子神经网络的多种可能配置

训练多个神经网络并汇总其学习知识称为“集合”,通常可以提高性能。使用dropout本质上是在只有1个神经网络的情况下实现的。

减少过度拟合的下一种技术是 权重正则化。

权重正则化

在训练神经网络时,某些权重的值可能会变得非常大。发生这种情况是因为这些权重_集中_在训练数据中的某些特征上,这导致它们在整个训练过程中价值不断增加。因此,网络过度适合训练数据。

我们不需要不断增加权重来捕获特定模式。相反,如果它们的值相对于其他权重较高,则很好 。但是,在训练过程中,当神经网络通过多次迭代对数据进行训练时,权重值可能会不断增加,直到权重变大为止,这是不必要的。

为什么权重过大对神经网络不利的其他原因之一是由于增加的输入输出差异。 基本上,当出现网络中的巨大权重,这是非常 容易小的变化 的输入,但神经网络应该基本输出_同样的事情_ 了_类似的投入_。当我们拥有巨大的权重时,即使我们保留两个非常相似的单独的数据输入,它们的输出也可能有很大的不同。这会导致在测试数据上发生许多错误的预测,从而降低了神经网络的通用性。

神经网络中权重的一般规则是,神经网络中的权重越高,神经网络越复杂。因此,具有较高权重的神经网络通常趋于过拟合。

因此,基本上,我们需要限制权重的增长,以使权重不会增长太多,但是我们到底该如何做呢?神经网络尝试将训练时的损失降到最低,因此我们可以尝试在该损失函数中包括权重的一部分,以便在训练时权重也被最小化 ,但是当然要优先考虑减少损失。

有两种执行此操作的方法,称为L1和L2正则化。在L1中,我们只占网络中所有权重绝对值之和的一小部分 。在L2中,我们在网络中权重的所有平方值的总和中占一小部分 。我们只是 将此表达式添加到神经网络的整体损失函数中。公式如下:

在这里,lambda是一个允许我们改变权重变化程度的值 。我们基本上只是将L1或L2项添加到神经网络的损失函数中,以便网络尝试最小化这些项。通过添加L1或L2正则化,网络将限制其权重的增长,因为权重的大小是损失函数的一部分,并且网络始终尝试使损失函数最小化。让我们重点介绍L1和L2之间的一些区别。

使用L1正则化时,虽然权重因正则化而减小,但L1尝试将其完全降低到零。 因此,对神经网络贡献不大的不重要权重最终将变为零。但是,在L2的情况下,由于平方函数对于小于1的值成反比例,因此权重不会被推为零,而是被推为 较小的值。 因此,不重要的权重比其他权重要低得多。

这涵盖了防止过度拟合的重要方法。在深度学习中,我们通常混合使用这些方法来改善神经网络的性能并改善模型的泛化性。


随机森林原理介绍与适用情况(综述篇)'建议收藏'

查看原文

赞 0 收藏 0 评论 0

计算机与AI 发布了文章 · 2020-11-10

O'Reilly 出版社又一经典之作——Python 设计模式

Architecture Patterns with Python

出版时间:2020.3

随着Python的持续流行,项目变得越来越大,越来越复杂。许多Python开发人员都对高级软件设计模式感兴趣,例如六边形/纯净架构,事件驱动的架构以及域驱动设计(DDD)规定的战略模式。但是将这些模式转换成Python并不总是那么简单。

通过该动手指南,MADE.com的Harry Percival和Bob Gregory引入了行之有效的架构设计模式,以帮助Python开发人员管理应用程序的复杂性,并从其测试套件中获得最大的价值。

每种模式都用美丽,惯用的Python给出了具体示例,从而避免了Java和C#语法的冗长。模式包括:

  • 依赖性反转及其到端口和适配器的连接(六边形/干净体系结构)
  • 域驱动设计在实体、值对象和聚合之间的区别
  • 持久存储的存储库和工作单元模式
  • 事件、命令和消息总线
  • 命令查询责任分离(CQRS)
  • 事件驱动体系结构和反应式微服务

**
如果您觉得本文对您有帮助的话请点赞转发并关注,PDF版下载方式在评论区获取。**

查看原文

赞 0 收藏 0 评论 1

计算机与AI 发布了文章 · 2020-11-08

如何将 PyTorch Lightning 模型部署到生产中

大规模服务PyTorch Lightning模型的完整指南。

纵观机器学习领域,主要趋势之一是专注于将软件工程原理应用于机器学习的项目激增。 例如,Cortex再现了部署无服务器功能但具有推理管道的体验。类似地,DVC实现了现代版本控制和CI / CD管道,但仅用于ML。

PyTorch Lightning具有类似的理念,仅适用于训练。框架为PyTorch提供了Python包装器,可让数据科学家和工程师编写干净,可管理且性能卓越的训练代码。

作为构建 整个部署平台的人 ,部分原因是我们讨厌编写样板,因此我们是PyTorch Lightning的忠实拥护者。本着这种精神,我整理了将PyTorch Lightning模型部署到生产环境的指南。在此过程中,我们将研究几种导出PyTorch Lightning模型以包括在推理管道中的选项。

部署PyTorch Lightning模型进行推理的每种方法

有三种方法可以导出PyTorch Lightning模型进行投放:

  • 将模型另存为PyTorch检查点
  • 将模型转换为ONNX
  • 将模型导出到Torchscript

我们可以通过Cortex为这三个服务。

1.直接打包和部署PyTorch Lightning模块

从最简单的方法开始,让我们部署一个没有任何转换步骤的PyTorch Lightning模型。

PyTorch Lightning Trainer是一个抽象样板训练代码(思考训练和验证步骤)的类,它具有内置的save_checkpoint()函数,该函数会将您的模型另存为.ckpt文件。要将模型保存为检查点,只需将以下代码添加到训练脚本中:

现在,在我们开始为该检查点提供服务之前,需要注意的是,虽然我一直说“ PyTorch Lightning模型”,但PyTorch Lightning是PyTorch的包装器-项目的README字面意思是“ PyTorch Lightning只是有组织的PyTorch。” 因此,导出的模型是普通的PyTorch模型,可以相应地使用。

有了保存的检查点,我们可以在Cortex中轻松地为模型提供服务。如果您不熟悉Cortex,可以 在这里快速熟悉一下,但是Cortex部署过程的简单概述是:

  • 我们使用Python为我们的模型编写了一个预测API
  • 我们在YAML中定义我们的API基础结构和行为
  • 我们使用CLI中的命令部署API

我们的预测API将使用Cortex的Python Predictor类定义一个init()函数来初始化我们的API并加载模型,并使用一个define()函数在查询时提供预测:

很简单 我们从训练代码中重新调整了一些代码的用途,添加了一些推理逻辑,仅此而已。需要注意的一件事是,如果将模型上传到S3(推荐),则需要添加一些逻辑来访问它。

接下来,我们在YAML中配置基础架构:

再次,简单。我们给我们的API起个名字,告诉Cortex我们的预测API在哪里,并分配一些CPU。

接下来,我们部署它:

请注意,我们还可以部署到集群,由Cortex加速和管理:

在所有部署中,Cortex都会容器化我们的API并将其公开为Web服务。通过云部署,Cortex可以配置负载平衡,自动扩展,监视,更新和许多其他基础架构功能。

就是这样!现在,我们有一个实时Web API,可根据要求提供模型预测。

2.导出到ONNX并通过ONNX运行时进行投放

现在,我们已经部署了一个普通的PyTorch检查点,让事情复杂一些。

PyTorch Lightning最近添加了一个方便的抽象,用于将模型导出到ONNX(以前,您可以使用PyTorch的内置转换功能,尽管它们需要更多样板)。要将模型导出到ONNX,只需将以下代码添加到您的训练脚本中:

请注意,您的输入样本应模仿实际模型输入的形状。

导出ONNX模型后,就可以使用Cortex的ONNX Predictor为其提供服务。代码基本上看起来是相同的,并且过程是相同的。例如,这是一个ONNX预测API:

基本上一样。唯一的区别是,我们不是通过直接初始化模型,而是通过onnx_client访问该数据,这是Cortex为服务于我们的模型而启动的ONNX运行时容器。

我们的YAML看起来也很相似:

我在此处添加了一个监视标志,目的只是为了显示配置的简便程度,并且有一些ONNX特定字段,但其他方面都是相同的YAML。

最后,我们使用与之前相同的$ cortex deploy命令进行部署,并且我们的ONNX API已启用。

3.使用Torchscript的JIT编译器进行序列化

对于最终部署,我们将把PyTorch Lightning模型导出到Torchscript并使用PyTorch的JIT编译器提供服务。要导出模型,只需将其添加到您的训练脚本中:

用于此目的的Python API与原始PyTorch示例几乎相同:

YAML保持与以前相同,并且CLI命令当然是一致的。如果需要的话,我们实际上可以更新我们以前的PyTorch API来使用新模型,只需将新的旧的dictor.py脚本替换为新的脚本,然后再次运行$ cortex部署:

Cortex在此处自动执行滚动更新,在该更新中,新的API会被启动,然后与旧的API交换,从而避免了模型更新之间的任何停机时间。

这就是全部。现在,您已经具有用于实时推理的完全可操作的预测API,可根据Torchscript模型提供预测。

那么,您应该使用哪种方法?

显而易见的问题是哪种方法效果最好。事实是,这里没有简单的答案,因为这取决于您的模型。

对于BERT和GPT-2等Transformer模型,ONNX可以提供令人难以置信的优化(我们测得的CPU吞吐量提高40倍 )。对于其他模型,Torchscript的性能可能比香草PyTorch更好-尽管这也带有一些警告,因为并非所有模型都干净地导出到Torchscript。

幸运的是,使用任何选项进行部署都很容易,您可以并行测试所有这三个选项,并查看哪种方式最适合您的特定API。

如果你喜欢本文的话,欢迎点赞转发!谢谢。

看完别走还有惊喜!

我精心整理了计算机/Python/机器学习/深度学习相关的2TB视频课与书籍,价值1W元。关注微信公众号“计算机与AI”,点击下方菜单即可获取网盘链接。

查看原文

赞 0 收藏 0 评论 0

计算机与AI 发布了文章 · 2020-11-06

手把手教你如何在 Windows 安装 Anaconda

本教程介绍了如何在Windows上下载和安装Anaconda。如何测试您的安装;如何解决常见的安装问题;以及安装Anaconda后的操作。

Anaconda是一个软件包管理器,一个环境管理器以及一个Python发行版,其中包含许多开源软件包的集合(numpy,scikit-learn,scipy,pandas等)。如果在安装Anaconda之后需要其他软件包,则可以使用Anaconda的软件包管理器,conda或pip安装这些软件包。这是非常有利的,因为您不必自己管理多个软件包之间的依赖关系。Conda甚至使在Python 2和3之间切换变得容易(您可以在此处了解更多信息 )。实际上,安装Anaconda也是安装Jupyter Notebooks的常见方法。

本教程包括:

  • 如何在Windows上下载并安装Anaconda
  • 如何测试您的安装
  • 如何解决常见的安装问题
  • 安装Anaconda后该怎么办

下载并安装Anaconda

1.转到 Anaconda网站, 然后选择Python 3.x图形安装程序(A)或Python 2.x图形安装程序(B)。如果不确定要安装哪个Python版本,请选择Python3。不要同时选择两者。

2.找到您的下载。

理想情况下,您以管理员身份打开/运行文件。

如果您没有权限在想要的位置安装anaconda或在路径中添加anaconda,请以管理员身份安装。

当出现以下屏幕时,单击“下一步”。

3.阅读许可协议,然后单击我同意。

4.选择“仅我”(推荐)或“所有用户”。

如果不确定选择哪个选项,请选择“仅我”,因为如果您没有管理员权限,这可以缓解潜在的问题。

5.请记下您的安装位置(1),然后单击“下一步(2)”。

您的安装位置可能有所不同,因此请记下anaconda的安装位置。在左侧的示例图像中,该路径类似于如果您为步骤4选择了“仅我”。在右侧的示例图像中,该路径类似于如果您为步骤4选择了“所有用户”。

6.这是安装过程中的重要部分。推荐的方法是不要选中框(1)将Anaconda添加到您的路径。这意味着当您希望使用Anaconda时,您将必须使用Anaconda Navigator或Anaconda命令提示符(位于“ Anaconda”下的“开始”菜单中)(如果不选中该框,则以后随时可以将Anaconda添加到您的PATH中) 。如果要在命令提示符下使用Anaconda,请使用替代方法并选中该框。单击安装(2)。

这个很重要。考虑您在此步骤中所做的事情。

7.单击下一步。

8.如果愿意,可以安装PyCharm,但这是可选的。单击下一步。

9.单击完成。

如何测试您的安装

测试安装的一种好方法是打开Jupyter Notebook。您可以通过Anaconda Prompt或Anaconda Navigator执行此操作。

Anaconda Navigator

1.找到Anaconda Navigator,然后单击Anaconda Navigator。

2.在Jupyter Notebook下,单击Launch。

Anaconda Prompt

1.找到Anaconda Prompt。

2.键入以下命令以查看可以启动Jupyter(IPython)笔记本。

将Anaconda添加到Path(可选)

这是一个 可选 步骤。在这种情况下,您没有在步骤6中选中该框,而是想将Anaconda添加到您的PATH中。这样做的好处是您将能够在命令提示符中使用Anaconda。

1.打开命令提示符。

2.检查您是否已经将Anaconda添加到路径中。在命令提示符下输入以下 命令。这是在检查您是否已经将Anaconda添加到路径中。如果您收到命令 无法识别的 错误(如下面图像的左侧所示),请继续执行步骤3。如果获得与下面图像的右侧类似的输出,则您已经将Anaconda添加到了路径中。

3.如果您不知道您的conda和/或python在哪里,请打开 Anaconda Prompt 并键入以下命令。这是在告诉您conda和python在计算机上的位置。

4.将conda和python添加到您的PATH中。您可以通过转到系统或环境变量并将步骤3的输出添加到PATH来完成此操作。(请注意,这可能会因Windows而有所不同)。

屏幕的外观可能会有所不同,具体取决于您所使用的Windows版本。

5.打开一个 新的命令提示符。尝试 在“ 命令提示符”中键入 conda --version 并  检查是否一切正常。您也可以尝试打开Jupyter笔记本进行检查。python --version

其他常见问题

Jupyter无法识别

如果您无法识别出jupyter,python无法识别或类似原因,则很可能是路径问题。请参阅将Anaconda添加到路径(可选)部分。

EnvironmentNotWritableError: The current user does not have write permissions to the target environment. environment location: C:ProgramDataAnaconda3

虽然在安装anaconda之后安装库时在映像中发生了错误,但是请记住,在安装anaconda时可能会出现这种错误(特别是如果在“下载和安装Anaconda”中单击“所有用户”作为步骤4)。如果您遇到此错误,并且要安装库,请以管理员 身份打开命令提示符/ anaconda提示符或anaconda导航器 以安装软件包。

DLL加载失败:找不到指定的模块

这是由于未将所有内容添加到路径环境变量中。我猜很可能您没有在路径中添加condabin或bin。

如果你喜欢本文的话,欢迎点赞转发!谢谢。

看完别走还有惊喜!

我精心整理了计算机/Python/机器学习/深度学习相关的2TB视频课与书籍,价值1W元。关注微信公众号“计算机与AI”,点击下方菜单即可获取网盘链接。

查看原文

赞 0 收藏 0 评论 0

计算机与AI 发布了文章 · 2020-11-04

轻松使用 TensorFlow 进行数据增强

当我们没有大量不同的训练数据时,我们该怎么办?这是在TensorFlow中使用数据增强在模型训练期间执行内存中图像转换以帮助克服此数据障碍的快速介绍。

图像分类的成功至少在很大程度上受到大量可用训练数据的驱动。暂时不考虑过拟合之类的问题,训练的图像数据越多,建立有效模型的机会就越大。

但是,如果我们没有大量的培训数据,我们该怎么办?立即想到一些针对此特定问题的广泛方法,尤其是迁移学习和数据增强功能。

迁移学习是将现有机器学习模型应用于最初并非预期的场景的过程。这种利用可以节省训练时间并扩展现有机器学习模型的实用性,这些模型可能具有可用的数据和计算,并且已经在非常大的数据集上进行了很长时间的训练。如果我们在大量数据上训练模型,则可以优化结果以对少量数据有效。

数据扩充是现有训练数据集的大小和多样性的增加,而无需手动收集任何新数据。通过对现有数据执行一系列预处理转换,可以获取此增强数据,对于图像数据,这些转换可以包括水平和垂直翻转,倾斜,修剪,旋转等。总而言之,与仅复制相同的数据相反,这种扩充的数据能够模拟各种细微不同的数据点。这些“附加”图像的细微差别应该足以帮助训练更鲁棒的模型。同样,这就是想法。

本文的重点是在TensorFlow中第二种方法的实际实施,以减轻少量图像训练数据(数据增强)的问题,而稍后将对转移学习进行类似的实际处理。

​图像增强如何帮助

当卷积神经网络学习图像特征时,我们希望确保这些特征以各种方向出现,以便使经过训练的模型能够识别出人的双腿可以同时出现在图像的垂直和水平方向。除了增加数据点的原始数量之外,增强功能在这种情况下还可以通过采用诸如图像旋转的变换来帮助我们。作为另一个示例,我们还可以使用水平翻转来帮助模型训练识别猫是直立的猫还是被倒置拍照的猫。

数据增强不是万能药;我们不希望它能解决我们所有的小数据问题,但是它可以在许多情况下有效,并且可以通过将其作为一种全面的模型训练方法的一部分,或者与另一种数据集扩展技术(例如,转移学习)

TensorFlow中的图像增强

在TensorFlow中,使用ImageDataGenerator类完成数据扩充。它非常易于理解和使用。整个数据集在每个时期循环,并且数据集中的图像根据选择的选项和值进行转换。这些转换是在内存中执行的,因此不需要其他存储(尽管save_to_dir如果需要,该参数可用于将增强的图像保存到磁盘)。

如果您正在使用TensorFlow,则可能已经使用了ImageDataGenerator简单的方法来缩放现有图像,而没有进行任何其他扩充。可能看起来像这样:

ImageDataGenerator执行增强的更新可能如下所示:

这是什么意思呢?

  • **rotation_range**-随机旋转的度数范围;在上述示例中为20度
  • **width_shift_range**-总宽度的一部分(如果值<1,在这种情况下),以随机地水平转换图像;上例中为0.2
  • **height_shift_range**-总高度的一部分(如果值<1,在这种情况下),以垂直方向随机平移图像;上例中为0.2
  • **shear_range**-逆时针方向的剪切角,以度为单位,用于剪切转换;上例中为0.2
  • **zoom_range**-随机缩放范围;上例中为0.2
  • **horizontal_flip**-用于水平随机翻转图像的布尔值;在上面的例子中为真
  • **vertical_flip**-布尔值,用于垂直随机翻转图像;在上面的例子中为真
  • **fill_mode**-根据“常数”,“最近”,“反射”或“环绕”填充输入边界之外的点;在以上示例中最接近

然后,您可以使用该ImageDataGeneratorflow_from_directory选项指定训练数据的位置(以及选择是否进行验证,如果要创建验证生成器),例如,使用选项,然后使用fit_generator在训练过程中流向您网络的这些增强图像来训练模型。此类代码的示例如下所示:

如果你喜欢本文的话,欢迎点赞转发!谢谢。

看完别走还有惊喜!

我精心整理了计算机/Python/机器学习/深度学习相关的2TB视频课与书籍,价值1W元。关注微信公众号“计算机与AI”,点击下方菜单即可获取网盘链接。

查看原文

赞 0 收藏 0 评论 0

计算机与AI 发布了文章 · 2020-11-01

实用超参数优化

关于如何使用以下技术微调机器和深度学习模型的简介:随机搜索,自动超参数调整和人工神经网络调整。

介绍

机器学习模型由两种不同类型的参数组成:

  • 超参数=是用户在开始训练之前可以任意设置的所有参数(例如,Random Forest中的估计量)。
  •  取而代之的是在模型训练过程中学习模型参数(例如,神经网络中的权重,线性回归)。

模型参数定义了如何使用输入数据来获得所需的输出,并在训练时进行学习。相反,超参数首先确定我们的模型的结构。

机器学习模型调整是一种优化问题。我们有一组超参数,我们的目标是找到它们的值的正确组合,这可以帮助我们找到函数的最小值(例如,损耗)或最大值(例如,精度)。

当比较不同的机器学习模型如何对数据集执行时,这尤其重要。实际上,例如将具有最佳超参数的SVM模型与尚未优化的随机森林模型进行比较将是不公平的。

在这篇文章中,将说明以下超参数优化方法:

  1. 手动搜寻
  2. 随机搜寻
  3. 网格搜索
  4. 自动超参数调整(贝叶斯优化,遗传算法)
  5. 人工神经网络(ANN)调整

为了演示如何在Python中执行超参数优化,我决定对信用卡欺诈检测Kaggle数据集执行完整的数据分析 。本文的目的是正确分类哪些信用卡交易应标记为欺诈或真实(二进制分类)。该数据集在分发前已被匿名化,因此,大多数功能的含义尚未公开。

在这种情况下,我决定仅使用数据集的一个子集,以加快训练时间并确保在两个不同的类之间实现完美的平衡。此外,仅使用了少量功能就使优化任务更具挑战性。最终数据集如下图所示(图2)。

机器学习

首先,我们需要将数据集分为训练集和测试集。

在本文中,我们将使用随机森林分类器作为模型进行优化。

随机森林模型由大量不相关的决策树形成,这些决策树共同构成一个整体。在随机森林中,每个决策树都进行自己的预测,并且将整体模型输出选择为最常出现的预测。

现在,我们可以从计算基本模型的准确性开始。

将随机森林分类器与默认的scikit-learn参数一起使用可获得95%的整体准确性。现在让我们看看是否应用一些优化技术可以提高精度。

手动搜寻

使用“手动搜索”时,我们会根据我们的判断/经验选择一些模型超参数。然后,我们训练模型,评估模型的准确性并重新开始该过程。重复该循环,直到获得满意的准确性为止。

随机森林分类器使用的主要参数是:

  • 标准 =用于评估分割质量的函数。
  • max_depth  =每棵树中允许的最大级别数。
  • max_features  =拆分节点时考虑的最大特征数。
  • min_samples_leaf  =可以存储在树叶中的最小样本数。
  • min_samples_split  =节点中导致节点分裂所需的最小样本数。
  • n_estimators  =集成树的数量。

可以在scikit-learn 文档中找到有关随机森林参数的更多信息。

作为手动搜索的示例,我尝试指定模型中的估计量。不幸的是,这并没有导致准确性的提高。

随机搜寻

在随机搜索中,我们创建超参数网格,并仅基于这些超参数的某些随机组合来训练/测试模型。在此示例中,我另外决定对训练集执行交叉验证。

在执行机器学习任务时,我们通常将数据集分为训练集和测试集。这样做是为了在训练模型后测试我们的模型(通过这种方式,我们可以在处理看不见的数据时检查其性能)。使用交叉验证时,我们将训练集划分为其他N个分区,以确保我们的模型不会过度拟合我们的数据。

最常用的交叉验证方法之一是K折验证。在K-Fold中,我们将训练集划分为N个分区,然后使用N-1个分区迭代地训练模型,并使用剩余的分区进行测试(在每次迭代中,我们都会更改剩余的分区)。一旦对模型进行了N次训练,我们就可以平均每次迭代获得的训练结果,从而获得整体训练效果结果。

在实现超参数优化时使用交叉验证非常重要。这样,我们可能会避免使用一些对训练数据非常有效但对测试数据却不太好的超参数。

现在,我们可以通过首先定义一个超参数网格来开始实现随机搜索,在调用_RandomizedSearchCV()_时将随机采样该超参数网格 。对于此示例,我决定将训练集划分为4折(_cv = 4_),并选择80作为要采样的组合数(_n_iter = 80_)。然后,使用scikit-learn  _best_estimator__ 属性,可以检索在训练过程中表现最佳的超参数集,以测试我们的模型。

训练完模型后,我们可以可视化更改其某些超参数如何影响整体模型的准确性(图4)。在这种情况下,我决定观察改变估计量和准则的数量如何影响我们的随机森林准确性。

然后,我们可以使可视化更具交互性,从而使这一步骤更进一步。在下面的图表中,我们可以检查(使用滑块)在模型中考虑估计的min_split和min_leaf参数时,改变估算器数量如何影响模型的整体准确性。

现在,我们可以使用随机搜索评估模型的性能。在这种情况下,与我们的基本模型相比,使用随机搜索会导致准确性不断提高。

网格搜索

在网格搜索中,我们建立了一个超参数网格,并在每种可能的组合上训练/测试我们的模型。

为了选择在Grid Search中使用的参数,我们现在可以查看哪些参数与Random Search一起使用效果最好,并根据这些参数形成网格,以查看是否可以找到更好的组合。

可以使用scikit-learn _GridSearchCV()_ 函数在Python中实现网格搜索 。同样在这种情况下,我决定将训练集划分为4折(_cv = 4_)。

使用网格搜索时,将尝试网格中所有可能的参数组合。在这种情况下,训练期间将使用128000个组合(2×10×4×4×4×10)。相反,在前面的“网格搜索”示例中,仅使用了80种组合。

与随机搜索相比,网格搜索速度较慢,但由于它可以遍历整个搜索空间,因此总体上更有效。取而代之的是,随机搜索可以更快更快,但是可能会错过搜索空间中的一些重要点。

自动超参数调整

使用自动超参数调整时,将使用以下技术来标识要使用的模型超参数:贝叶斯优化,梯度下降和进化算法。

贝叶斯优化

贝叶斯优化可以使用Hyperopt库在Python中执行。贝叶斯优化使用概率来找到函数的最小值。最终目的是找到函数的输入值,该函数可以为我们提供尽可能低的输出值。

贝叶斯优化已被证明比随机,网格或手动搜索更有效。因此,贝叶斯优化可以在测试阶段带来更好的性能,并减少优化时间。

在Hyperopt中,可以实现贝叶斯优化,为函数fmin()提供3个三个主要参数 。

  • 目标函数 =定义要最小化的损失函数。
  • 域空间 =定义要测试的输入值的范围(在贝叶斯优化中,该空间为每个使用的超参数创建概率分布)。
  • 优化算法 =定义用于选择最佳输入值以在每次新迭代中使用的搜索算法。

此外,还可以在_fmin()中_定义  要执行的最大评估数。

贝叶斯优化可以通过考虑过去的结果来选择输入值,从而减少搜索迭代的次数。这样,我们可以从一开始就将搜索集中在更接近所需输出的值上。

现在,我们可以使用fmin() 函数运行贝叶斯优化器 。 首先创建一个 Trials()对象,以便稍后可视化fmin() 函数运行时正在发生的事情 (例如,loss函数的变化方式以及Hyperparameters的使用方式变化)。

现在,我们可以检索识别出的最佳参数集,并使用 在训练过程中创建的_最佳_字典来测试模型 。一些参数已 使用索引__数字方式存储在 _最佳_字典中,因此,我们需要先将它们转换回字符串,然后再将其输入到随机森林中。

使用贝叶斯优化的分类报告如下所示。

遗传算法

遗传算法试图将自然选择机制应用于机器学习环境。它们受到达尔文自然选择过程的启发,因此通常也称为进化算法。

假设我们创建了具有一些预定义超参数的N个机器学习模型。然后,我们可以计算每个模型的准确性,并决定只保留一半模型(性能最好的模型)。现在,我们可以生成具有与最佳模型相似的超参数的后代,以便再次获得N个模型的种群。在这一点上,我们可以再次计算每个模型的准确性,并在定义的世代中重复该循环。这样,只有最佳模型才能在流程结束时生存下来。

为了在Python中实现遗传算法,我们可以使用 TPOT自动机器学习库。TPOT建立在scikit-learn库上,可用于回归或分类任务。

以下代码片段显示了使用遗传算法确定的培训报告和最佳参数。

我们的随机森林遗传算法优化模型的整体准确性如下所示。

人工神经网络(ANN)调整

使用KerasClassifier包装器,可以像使用scikit-learn机器学习模型时一样,对深度学习模型应用网格搜索和随机搜索。在以下示例中,我们将尝试优化一些ANN参数,例如:在每个层中使用多少个神经元,以及使用哪个激活函数和优化器。此处提供更多深度学习超参数优化的示例 。

使用我们的人工神经网络(ANN)评分的总体准确性可以在下面看到。

评价

现在,我们可以比较在此给定练习中所有不同优化技术的执行情况。总体而言,随机搜索和进化算法的效果最佳。

获得的结果高度依赖于所选的网格空间和所使用的数据集。因此,在不同情况下,不同的优化技术将比其他技术表现更好。

如果你喜欢本文的话,欢迎点赞转发!谢谢。

看完别走还有惊喜!

我精心整理了计算机/Python/机器学习/深度学习相关的2TB视频课与书籍,价值1W元。关注微信公众号“计算机与AI”,点击下方菜单即可获取网盘链接。

查看原文

赞 0 收藏 0 评论 0

计算机与AI 发布了文章 · 2020-10-30

对抗验证概述

了解如何实施对抗性验证,以建立分类器来确定您的数据是来自训练还是测试集。如果可以这样做,则您的数据有问题,并且对抗验证模型可以帮助您诊断问题。

如果您要在Kaggle上研究一些获胜的解决方案,则可能会注意到对“对抗性验证”的引用(像这样)。它是什么?

简而言之,我们构建了一个分类器,以尝试预测哪些数据行来自训练集,哪些数据行来自测试集。如果两个数据集来自相同的分布,那应该是不可能的。但是,如果您的训练和测试数据集的特征值存在系统差异,则分类器将能够成功学习以区分它们。您可以学会更好地区分它们的模型越多,问题就越大。

但是,好消息是_您可以分析学习到的模型来帮助您诊断问题_。并且,一旦您了解了问题,就可以解决它。

您可以在GitHub找到此文章的完整代码。

学习对抗验证模型

首先,导入一些库:

数据准备

对于本教程,我们将使用Kaggle的IEEE-CIS信用卡欺诈检测数据集。首先,假设您已将训练和测试数据加载到pandas DataFrames中,并将它们分别命名为_df_train_和_df_test_。然后,我们将通过替换缺失值进行一些基本的清理。

对于对抗性验证,我们想学习一个模型,该模型可以预测训练数据集中哪些行以及测试集中哪些行。因此,我们创建一个新的目标列,其中测试样本用1标记,训练样本用0标记,如下所示:

这是我们训练模型进行预测的目标。目前,训练数据集和测试数据集是分开的,每个数据集只有一个目标值标签。如果我们在_此_训练集上训练了一个模型,那么它只会知道一切都为0。我们想改组训练和测试数据集,然后创建新的数据集以拟合和评估对抗性验证模型。我定义了一个用于合并,改组和重新拆分的函数:

新的数据集_adversarial_train_和_adversarial_test_包括原始训练集和测试集的混合,而目标则指示原始数据集。_注意:我已将_TransactionDT_添加到特征列表中。_

对于建模,我将使用Catboost。我通过将DataFrames放入Catboost Pool对象中来完成数据准备。

建模

这部分很简单:我们只需实例化Catboost分类器并将其拟合到我们的数据中:

让我们继续前进,在保留数据集上绘制ROC曲线:

这是一个完美的模型,这意味着有一种明确的方法可以告诉您任何给定的记录是否在训练或测试集中。这违反了我们的训练和测试集分布相同的假设。

诊断问题并进行迭代

为了了解模型如何做到这一点,让我们看一下最重要的特征:

到目前为止,TransactionDT是最重要的特征。鉴于原始的训练和测试数据集来自不同的时期(测试集出现在训练集的未来),这完全合情合理。该模型刚刚了解到,如果TransactionDT大于最后一个训练样本,则它在测试集中。

我之所以包含TransactionDT只是为了说明这一点–通常不建议将原始日期作为模型特征。但是好消息是这项技术以如此戏剧性的方式被发现。这种分析显然可以帮助您识别这种错误。

让我们消除TransactionDT,然后再次运行此分析。

现在,ROC曲线如下所示:

它仍然是一个相当强大的模型,AUC> 0.91,但是比以前弱得多。让我们看一下此模型的特征重要性:

现在,_id_31_是最重要的功能。让我们看一些值以了解它是什么。

此列包含软件版本号。显然,这在概念上与包含原始日期类似,因为特定软件版本的首次出现将与其发布日期相对应。

让我们通过删除列中所有不是字母的字符来解决此问题:

现在,我们的列的值如下所示:

让我们使用此清除列来训练新的对抗验证模型:

现在,ROC图如下所示:

性能已从0.917的AUC下降到0.906。这意味着我们已经很难让模型区分我们的训练数据集和测试数据集,但是它仍然很强大。

结论

此方法用来评价训练集与测试集分布是否一致,以防止新的测试集出现,导致崩盘的现象。


如果你喜欢本文的话,欢迎点赞转发!谢谢。

看完别走还有惊喜!

我精心整理了计算机/Python/机器学习/深度学习相关的2TB视频课与书籍,价值1W元。关注微信公众号“计算机与AI”,点击下方菜单即可获取网盘链接。

查看原文

赞 0 收藏 0 评论 0

计算机与AI 发布了文章 · 2020-10-28

调包侠的炼丹福利:使用 Keras Tuner 自动进行超参数调整

使用Keras Tuner进行超参数调整可以将您的分类神经网络网络的准确性提高10%。

这篇文章将解释如何使用Keras Tuner和Tensorflow 2.0执行自动超参数调整,以提高计算机视觉问题的准确性。

假如您的模型正在运行并产生第一组结果。但是,它们与您期望的最高结果相去甚远。您缺少一个关键步骤:超参数调整!

在本文中,我们将逐步完成整个超参数调整流程。完整的代码可以在Github上找到

什么是超参数调整以及为什么要注意

机器学习模型具有两种类型的参数:

  • 可训练参数,由算法在训练过程中学习。例如,神经网络的权重是可训练的参数。
  • 超参数,需要在启动学习过程之前进行设置。学习率或密集层中的单元数是超参数。

即使对于小型模型,超参数也可能很多。调整它们可能是真正的难题,但值得挑战:良好的超参数组合可以极大地改善模型的性能。在这里,我们将看到在一个简单的CNN模型上,它可以帮助您在测试集上获得10%的精度!

幸运的是,开放源代码库可为您自动执行此步骤!

Tensorflow 2.0和Keras Tuner

Tensorflow是一个广泛使用的开源机器学习库。Tensorflow 2.0于2019年9月发布,具有重大改进,尤其是在用户友好方面。有了这个新的版本,Keras,更高级别的Python的深度学习的API,成为Tensorflow的主要API。

不久之后,Keras团队发布了Keras Tuner,该库可轻松使用Tensorflow 2.0执行超参数调整。这篇文章将展示如何将其与应用程序一起用于对象分类。它还将包括库中可用的不同超参数调整方法的比较。

Keras Tuner现在退出测试版!v1在PyPI上不可用。https://t.co/riqnIr4auA

适用于Keras及更高版本的功能全面,可扩展,易于使用的超参数调整。pic.twitter.com/zUDISXPdBw

-弗朗索瓦CHOLLET(@fchollet)2019 10月31日,

使用Keras Tuner进行超参数调整

在深入研究代码之前,请先了解一些有关Keras Tuner的理论。它是如何工作的?

首先,定义一个调谐器。它的作用是确定应测试哪些超参数组合。库搜索功能执行迭代循环,该循环评估一定数量的超参数组合。通过在保持的验证集中计算训练模型的准确性来执行评估。

最后,就验证精度而言,最好的超参数组合可以在暂留的测试集上进行测试。

入门

让我们开始吧!通过本教程,您将拥有一条端到端管道,以调整简单卷积网络的超参数,以在CIFAR10数据集上进行对象分类。

安装步骤

首先,从终端安装Keras Tuner:

现在,您可以打开自己喜欢的IDE /文本编辑器,并在本教程的其余部分中启动Python脚本!

数据集

本教程使用CIFAR10数据集。CIFAR10是计算机视觉中常见的基准数据集。它包含10个类别,相对较小,有60000张图像。这个大小允许相对较短的训练时间,我们将利用它来执行多个超参数调整迭代。

加载和预处理数据:

调谐器期望浮点数作为输入,而除以255是数据归一化步骤。

模型建立

在这里,我们将尝试使用简单的卷积模型将每个图像分类为10个可用类之一。

每个输入图像将经过两个卷积块(2个卷积层,后跟一个池化层)和一个Dropout层以进行正则化。最后,每个输出均被展平,并经过密集层,该密集层将图像分类为10类之一。

在Keras中,此模型可以定义如下: 

搜索空间定义

要执行超参数调整,我们需要定义搜索空间,即哪些超参数需要优化以及在什么范围内。在这里,对于这个相对较小的模型,已经有6个超参数可以调整:

  • 三个Dropout层的Dropout率
  • 卷积层的卷积核数
  • 全连接层神经元个数
  • 激活函数

在Keras Tuner中,超参数具有类型(可能是Float,Int,Boolean和Choice)和唯一名称。然后,需要设置一组帮助指导搜索的选项:

  • Float和Int类型的最小值,最大值和默认值
  • 选择类型的一组可能值
  • (可选)线性,对数或反向对数内的采样方法。设置此参数可增加您可能对调优参数的了解。我们将在下一节中看到如何使用它来调整学习率
  • 可选地,一个步长值,即两个超参数值之间的最小步长

例如,要设置超参数“过滤器数量”,您可以使用:

全连接层层具有两个超参数,神经元数量和激活函数:

模型编译

然后,让我们继续进行模型编译,其中还存在其他超参数。在编译步骤中,将定义优化器以及损失函数和度量。在这里,我们将分类熵用作损失函数,将准确性用作度量标准。对于优化器,可以使用不同的选项。我们将使用流行的亚当

在这里,代表学习算法进展速度的学习速率通常是重要的超参数。通常,学习速度以对数刻度选择。通过设置采样方法,可以将这些先验知识合并到搜索中:

Keras Tuner超模型

为了将整个超参数搜索空间放在一起并执行超参数调整,Keras Tuners使用了“ HyperModel”实例。超模型是库引入的可重用的类对象,定义如下:

该库已经为计算机视觉提供了两个现成的超模型HyperResNet和HyperXception。

选择调谐器

Keras Tuner提供了主要的超参数调整方法:随机搜索,超频带和贝叶斯优化。

在本教程中,我们将重点介绍随机搜索和超带宽。我们不会涉及理论,但是如果您想了解有关随机搜索和贝叶斯优化的更多信息,我写了一篇有关它的文章:用于超参数调整的贝叶斯优化。至于Hyperband,其主要思想是根据搜索时间优化随机搜索。

对于每个调谐器,可以为实验可重复性定义种子参数:SEED = 1

随机搜寻

执行超参数调整的最直观方法是随机采样超参数组合并进行测试。这正是RandomSearch调谐器的功能!

目标是优化功能。调谐器根据其值推断是最大化问题还是最小化问题。

然后,max_trials变量代表调谐器将测试的超参数组合的数量,而execution_per_trial变量则是出于健壮性目的而应构建并适合于每个试验的模型数量。下一节将说明如何设置它们

超频

调谐器的超参数?

您可能想知道在整个过程中看到必须为不同的调谐器设置几个参数的有用性:

但是,这里的问题与超参数的确定略有不同。实际上,此处的这些设置将主要取决于您的计算时间和资源。您可以执行的试验次数越多越好!关于时期的数量,最好是知道模型需要收敛多少个时期。您还可以使用提前停止来防止过度拟合。

超参数调整

一旦建立了模型和调谐器,就可以轻松获得任务的摘要:

调整可以开始了!

搜索功能将训练数据和验证拆分作为输入,以执行超参数组合评估。epochs参数用于随机搜索和贝叶斯优化,以定义每种超参数组合的训练历元数。

最后,搜索结果可以归纳如下:

结果

您可以在Github上找到此结果。在RTX 2080 GPU上运行后获得以下结果:

Keras Tuner结果。最差的基准:使用随机搜索的一组超参数之一实现最差的验证准确性的模型。默认基线:通过将所有超参数设置为其默认值获得。

这些结果与CIFAR10数据集上的最新模型所达到的99.3%的准确性相差甚远,但对于如此简单的网络结构而言,还算不错。您已经看到基线和调整后的模型之间有了显着的改进,在“随机搜索”和第一个基线之间的准确性提高了10%以上。

总体而言,Keras Tuner库是一个不错的易于学习的选项,可以为Keras和Tensorflow 2.O模型执行超参数调整。您必须要做的主要步骤是调整模型以适合超模型格式。实际上,该库中目前没有几个标准的超模型。

补充文档和教程可在Keras Tuner的网站及其Github存储库中找到


如果你喜欢本文的话,欢迎点赞转发!谢谢。

看完别走还有惊喜!

我精心整理了计算机/Python/机器学习/深度学习相关的2TB视频课与书籍,价值1W元。关注微信公众号“计算机与AI”,点击下方菜单即可获取网盘链接。

​往期精彩链接:

为什么Python中有各种各样的“_”下划线?分别有什么用?

使用Keras Tuner进行超参数调整可以将您的分类神经网络网络的准确性提高10%。

这篇文章将解释如何使用Keras Tuner和Tensorflow 2.0执行自动超参数调整,以提高计算机视觉问题的准确性。

假如您的模型正在运行并产生第一组结果。但是,它们与您期望的最高结果相去甚远。您缺少一个关键步骤:超参数调整!

在本文中,我们将逐步完成整个超参数调整流程。完整的代码可以在Github上找到

什么是超参数调整以及为什么要注意

机器学习模型具有两种类型的参数:

  • 可训练参数,由算法在训练过程中学习。例如,神经网络的权重是可训练的参数。
  • 超参数,需要在启动学习过程之前进行设置。学习率或密集层中的单元数是超参数。

即使对于小型模型,超参数也可能很多。调整它们可能是真正的难题,但值得挑战:良好的超参数组合可以极大地改善模型的性能。在这里,我们将看到在一个简单的CNN模型上,它可以帮助您在测试集上获得10%的精度!

幸运的是,开放源代码库可为您自动执行此步骤!

Tensorflow 2.0和Keras Tuner

Tensorflow是一个广泛使用的开源机器学习库。Tensorflow 2.0于2019年9月发布,具有重大改进,尤其是在用户友好方面。有了这个新的版本,Keras,更高级别的Python的深度学习的API,成为Tensorflow的主要API。

不久之后,Keras团队发布了Keras Tuner,该库可轻松使用Tensorflow 2.0执行超参数调整。这篇文章将展示如何将其与应用程序一起用于对象分类。它还将包括库中可用的不同超参数调整方法的比较。

Keras Tuner现在退出测试版!v1在PyPI上不可用。https://t.co/riqnIr4auA

适用于Keras及更高版本的功能全面,可扩展,易于使用的超参数调整。pic.twitter.com/zUDISXPdBw

-弗朗索瓦CHOLLET(@fchollet)2019 10月31日,

使用Keras Tuner进行超参数调整

在深入研究代码之前,请先了解一些有关Keras Tuner的理论。它是如何工作的?

首先,定义一个调谐器。它的作用是确定应测试哪些超参数组合。库搜索功能执行迭代循环,该循环评估一定数量的超参数组合。通过在保持的验证集中计算训练模型的准确性来执行评估。

最后,就验证精度而言,最好的超参数组合可以在暂留的测试集上进行测试。

入门

让我们开始吧!通过本教程,您将拥有一条端到端管道,以调整简单卷积网络的超参数,以在CIFAR10数据集上进行对象分类。

安装步骤

首先,从终端安装Keras Tuner:

现在,您可以打开自己喜欢的IDE /文本编辑器,并在本教程的其余部分中启动Python脚本!

数据集

本教程使用CIFAR10数据集。CIFAR10是计算机视觉中常见的基准数据集。它包含10个类别,相对较小,有60000张图像。这个大小允许相对较短的训练时间,我们将利用它来执行多个超参数调整迭代。

加载和预处理数据:

调谐器期望浮点数作为输入,而除以255是数据归一化步骤。

模型建立

在这里,我们将尝试使用简单的卷积模型将每个图像分类为10个可用类之一。

每个输入图像将经过两个卷积块(2个卷积层,后跟一个池化层)和一个Dropout层以进行正则化。最后,每个输出均被展平,并经过密集层,该密集层将图像分类为10类之一。

在Keras中,此模型可以定义如下: 

搜索空间定义

要执行超参数调整,我们需要定义搜索空间,即哪些超参数需要优化以及在什么范围内。在这里,对于这个相对较小的模型,已经有6个超参数可以调整:

  • 三个Dropout层的Dropout率
  • 卷积层的卷积核数
  • 全连接层神经元个数
  • 激活函数

在Keras Tuner中,超参数具有类型(可能是Float,Int,Boolean和Choice)和唯一名称。然后,需要设置一组帮助指导搜索的选项:

  • Float和Int类型的最小值,最大值和默认值
  • 选择类型的一组可能值
  • (可选)线性,对数或反向对数内的采样方法。设置此参数可增加您可能对调优参数的了解。我们将在下一节中看到如何使用它来调整学习率
  • 可选地,一个步长值,即两个超参数值之间的最小步长

例如,要设置超参数“过滤器数量”,您可以使用:

全连接层层具有两个超参数,神经元数量和激活函数:

模型编译

然后,让我们继续进行模型编译,其中还存在其他超参数。在编译步骤中,将定义优化器以及损失函数和度量。在这里,我们将分类熵用作损失函数,将准确性用作度量标准。对于优化器,可以使用不同的选项。我们将使用流行的亚当

在这里,代表学习算法进展速度的学习速率通常是重要的超参数。通常,学习速度以对数刻度选择。通过设置采样方法,可以将这些先验知识合并到搜索中:

Keras Tuner超模型

为了将整个超参数搜索空间放在一起并执行超参数调整,Keras Tuners使用了“ HyperModel”实例。超模型是库引入的可重用的类对象,定义如下:

该库已经为计算机视觉提供了两个现成的超模型HyperResNet和HyperXception。

选择调谐器

Keras Tuner提供了主要的超参数调整方法:随机搜索,超频带和贝叶斯优化。

在本教程中,我们将重点介绍随机搜索和超带宽。我们不会涉及理论,但是如果您想了解有关随机搜索和贝叶斯优化的更多信息,我写了一篇有关它的文章:用于超参数调整的贝叶斯优化。至于Hyperband,其主要思想是根据搜索时间优化随机搜索。

对于每个调谐器,可以为实验可重复性定义种子参数:SEED = 1

随机搜寻

执行超参数调整的最直观方法是随机采样超参数组合并进行测试。这正是RandomSearch调谐器的功能!

目标是优化功能。调谐器根据其值推断是最大化问题还是最小化问题。

然后,max_trials变量代表调谐器将测试的超参数组合的数量,而execution_per_trial变量则是出于健壮性目的而应构建并适合于每个试验的模型数量。下一节将说明如何设置它们

超频

调谐器的超参数?

您可能想知道在整个过程中看到必须为不同的调谐器设置几个参数的有用性:

但是,这里的问题与超参数的确定略有不同。实际上,此处的这些设置将主要取决于您的计算时间和资源。您可以执行的试验次数越多越好!关于时期的数量,最好是知道模型需要收敛多少个时期。您还可以使用提前停止来防止过度拟合。

超参数调整

一旦建立了模型和调谐器,就可以轻松获得任务的摘要:

调整可以开始了!

搜索功能将训练数据和验证拆分作为输入,以执行超参数组合评估。epochs参数用于随机搜索和贝叶斯优化,以定义每种超参数组合的训练历元数。

最后,搜索结果可以归纳如下:

结果

您可以在Github上找到此结果。在RTX 2080 GPU上运行后获得以下结果:

Keras Tuner结果。最差的基准:使用随机搜索的一组超参数之一实现最差的验证准确性的模型。默认基线:通过将所有超参数设置为其默认值获得。

这些结果与CIFAR10数据集上的最新模型所达到的99.3%的准确性相差甚远,但对于如此简单的网络结构而言,还算不错。您已经看到基线和调整后的模型之间有了显着的改进,在“随机搜索”和第一个基线之间的准确性提高了10%以上。

总体而言,Keras Tuner库是一个不错的易于学习的选项,可以为Keras和Tensorflow 2.O模型执行超参数调整。您必须要做的主要步骤是调整模型以适合超模型格式。实际上,该库中目前没有几个标准的超模型。

补充文档和教程可在Keras Tuner的网站及其Github存储库中找到


如果你喜欢本文的话,欢迎点赞转发!谢谢。

看完别走还有惊喜!

我精心整理了计算机/Python/机器学习/深度学习相关的2TB视频课与书籍,价值1W元。关注微信公众号“计算机与AI”,点击下方菜单即可获取网盘链接。

​往期精彩链接:

为什么Python中有各种各样的“_”下划线?分别有什么用?image.png

查看原文

赞 0 收藏 0 评论 0

计算机与AI 发布了文章 · 2020-10-27

可视化数据科学中的概率分布以帮你更好地理解各种分布

在某些分布假设下,某些机器学习模型被设计为最佳工作。因此,了解我们正在使用哪个发行版可以帮助我们确定最适合使用哪些模型。

介绍

拥有良好的统计背景可能对数据科学家的日常生活大有裨益。每次我们开始探索新的数据集时,我们首先需要进行 探索性数据分析(EDA),以了解某些功能的主要特征是什么。如果我们能够了解数据分布中是否存在任何模式,则可以量身定制最适合我们的案例研究的机器学习模型。这样,我们将能够在更短的时间内获得更好的结果(减少优化步骤)。实际上,某些机器学习模型被设计为在某些分布假设下效果最佳。因此,了解我们正在使用哪些发行版可以帮助我们确定最适合使用哪些模型。

同类型的数据

我们正在与一个数据集工作,每次,我们的数据代表一个 样本 从 人口。然后,使用此样本,我们可以尝试了解其主要模式,以便我们可以使用它对整个人口进行预测(即使我们从未有机会检查整个人口)。

假设我们要根据一组特定功能来预测房屋的价格。我们也许可以在线找到一个包含旧金山所有房价的数据集(我们的样本),并且进行一些统计分析之后,我们也许可以对美国任何其他城市的房价做出相当准确的预测(我们的人口)。

数据集由两种主要类型的数据组成: 数字 (例如整数,浮点数)和 分类 (例如名称,笔记本电脑品牌)。

数值数据还可以分为其他两类: 离散 和 继续。离散数据只能采用某些值(例如学校中的学生人数),而连续数据可以采用任何实数或分数值(例如身高和体重的概念)。

从离散随机变量中,可以计算出 概率质量函数,而从连续随机变量中,可以得出 概率密度函数

概率质量函数给出了一个变量可以等于某个值的概率,相反,概率密度函数的值本身并不是概率,因为它们首先需要在给定范围内进行积分。

自然界中存在许多不同的概率分布(概率分布流程图),在本文中,我将向您介绍数据科学中最常用的概率分布。

首先,让我们导入所有必需的库:

伯努利分布

伯努利分布是最容易理解的分布之一,可用作导出更复杂分布的起点。

这种分布只有两个可能的结果和一个试验。

一个简单的例子可以是抛掷偏斜/无偏硬币。在此示例中,可以认为结果可能是正面的概率等于p, 而  对于反面则是 (1-p)(包含所有可能结果的互斥事件的概率总和为1)。

在下图中,我提供了一个偏向硬币情况下伯努利分布的例子。

均匀分布

均匀分布可以很容易地从伯努利分布中得出。在这种情况下,结果的数量可能不受限制,并且所有事件的发生概率均相同。

例如,想象一下一个骰子的掷骰。在这种情况下,存在多个可能的事件,每个事件都有相同的发生概率。

二项分布

二项分布可以被认为是遵循伯努利分布的事件结果的总和。因此,二项分布用于二元结果事件,成功和失败的可能性在所有后续试验中均相同。此分布采用两个参数作为输入:事件发生的次数和分配给两个类别之一的概率。

一个实际的二项式分布的简单示例可以是重复一定次数的有偏/无偏硬币的抛掷。

改变偏差量将改变分布的外观(如下图所示)。

二项分布的主要特征是:

  • 给定多个试验,每个试验彼此独立(一项试验的结果不会影响另一项试验)。
  • 每个试验只能导致两个可能的结果(例如,获胜或失败),其概率分别为 p 和 (1- p)

如果给出成功的概率(p)和试验次数(n),则可以使用以下公式计算这n次试验中的成功概率(x)(下图)。

正态(高斯)分布

正态分布是数据科学中最常用的分布之一。我们日常生活中发生的许多常见现象都遵循正态分布,例如:经济中的收入分布,学生的平均报告,人口的平均身高等。此外,小的随机变量的总和还导致:通常遵循正态分布(中心极限定理)。

“在概率论中, 中心极限定理 (CLT)确定,在某些情况下,当添加独立随机变量时,即使原始变量本身未呈正态分布,其适当归一化的和也趋于正态分布。”

—维基百科[](https://en.wikipedia.org/wiki...

可以帮助我们识别正态分布的一些特征是:

  • 曲线在中心对称。因此,均值,众数和中位数都等于相同的值,从而使所有值围绕均值对称分布。
  • 分布曲线下的面积等于1(所有概率之和必须等于1)。

可以使用以下公式得出正态分布(下图)。

使用正态分布时,分布平均值和标准偏差起着非常重要的作用。如果我们知道它们的值,则只需检查概率分布即可轻松找出预测精确值的概率(下图)。实际上,由于分布特性,68%的数据位于平均值的一个标准偏差范围内,95%的数据位于平均值的两个标准偏差范围内,99.7%的数据位于平均值的三个标准偏差范围内。

许多机器学习模型被设计为遵循正态分布的最佳使用数据。一些例子是:

  • 高斯朴素贝叶斯分类器
  • 线性判别分析
  • 二次判别分析
  • 基于最小二乘的回归模型

此外,在某些情况下,还可以通过应用对数和平方根之类的转换将非正常数据转换为正常形式。

泊松分布

泊松分布通常用于查找事件可能发生或不知道事件通常发生的频率。此外,泊松分布还可用于预测事件在给定时间段内可能发生多少次。

例如,保险公司经常使用泊松分布来进行风险分析(例如,在预定时间范围内预测车祸事故的数量),以决定汽车保险的价格。

当使用Poisson Distributions时,我们可以确信发生不同事件之间的平均时间,但是事件发生的确切时刻在时间上是随机间隔的。

泊松分布可以使用以下公式建模(下图),其中 λ 表示一个时期内可能发生的预期事件数。

描述泊松过程的主要特征是:

  1. 事件彼此独立(如果事件发生,则不会改变另一个事件发生的可能性)。
  2. 一个事件可以发生任何次数(在定义的时间段内)。
  3. 两个事件不能同时发生。
  4. 事件发生之间的平均速率是恒定的。

在下图中,显示了改变周期(λ)中可能发生的事件的预期数目如何改变泊松分布。

指数分布

最后,指数分布用于对不同事件发生之间的时间进行建模。

举例来说,假设我们在一家餐厅工作,并且希望预测到到不同顾客进入餐厅之间的时间间隔。针对此类问题使用指数分布,可能是一个理想的起点。

指数分布的另一个常见应用是生存分析(例如,设备/机器的预期寿命)。

指数分布由参数λ调节。λ值越大,指数曲线到十年的速度就越快(下图)。

指数分布使用以下公式建模(下图)。

​如果你喜欢本文的话,欢迎点赞转发!谢谢。

看完别走还有惊喜!

我精心整理了计算机/Python/机器学习/深度学习相关的2TB视频课与书籍,价值1W元。关注微信公众号“计算机与AI”,点击下方菜单即可获取网盘链接。

查看原文

赞 0 收藏 0 评论 0

认证与成就

  • 获得 2 次点赞
  • 获得 1 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 1 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2020-08-10
个人主页被 679 人浏览