有Backprop NEAT的神经网络演化的游乐场

GitHub

本演示将尝试使用遗传算法来生成高效但非典型的神经网络结构,采用TensorFlow Playground的数据集进行分类。请尝试在这里进行演示。

动机

几周前,Google发布了一个名为TensorFlow Playground的网页应用 。如果你还没有玩过它,我鼓励你这样做,因为它是一个非常精心设计的网站演示,它展示了神经网络用一些虚拟数据集来处理一个简单的分类问题的训练进程。您可以自定义网络的许多方面,比如层数、每层神经元及其激活功能、初始输入功能等等。

我比较感兴趣的事情之一是使用那个演示的用户的反馈。人们开始尝试不同的神经网络配置,例如:实际需要多少神经网络层来适应某个数据集?或者应该为另一个数据集使用什么样的初始特征?哪个激活函数更适合哪个数据集?

在典型的基于神经网络的分类问题中,数据科学家在人类启发式的基础上设计和组合一些预定义的神经网络,并且,这个实际的机器学习位的任务将是来解决网络的权重集,用一些随机梯度下降的变量和反向传播算法来计算梯度权重,以使网络在一定的正则化约束条件下配对一些训练数据。TensorFlow Playground的演示抓住了这类任务的本质,但是我一直在思考是否机器学习也可以高效地用于设计给定任务的实际神经网络?如果我们能够自动化发现神经网络架构的过程呢?

我决定通过创建这个演示来实验这个想法。我们不会用传统方法组织许多具有统一激活函数的神经元层,而是会试着放弃这些层的概念,因此每个神经元都可能连接到我们网络中的任何其他神经元。同时,我们将鼓励许多类型的激活函数,如S形、双曲、正弦、正弦、高斯、abs、平方等许多类型的神经元,甚至还有加法门和乘法门。而不是坚持与使用统一激活函数,如S形或relu的神经元。

被称为NEAT (Evolving Neural Networks through Augmenting Topogies,增强拓扑的进化神经网络)的遗传算法被用来将一个非常简单的神经网络发展到更复杂的神经网络,神经网络的权重问题将通过反向传播而解决。karpathy所制作的了不起的的一个库,recurrent.js,使得构建具有任意激活函数的任意神经网络的计算图表示成为可能。我用NEAT算法生成了可以被recurrent.js处理的神经网络的表示,从而使得该库可以被用来往前传递NEAT发现的神经网络,并且还支持神经网络来优化它们的权重。

神经进化导论

大多数学习机器学习的学生了解到,为了训练一个神经网络,应该定义一个目标函数来测量神经网络执行某个任务的能力,并且通过每个权重使用反向传播来求解这个目标函数的导数,然后使用这些梯度来迭代求解神经网络的一组好的权重,这个框架被称为端到端的培训。

虽然反向传播算法是当前许多应用程序中最强大的方法,但它肯定不是唯一的方法。还有其他方法找出了神经网络的权重。例如,走一种极端,有一种方法是随机猜测神经网络的权重,直到我们得到一组可以帮助我们执行一些任务的权重。

遗传算法是一个超越了随机猜测的简单步骤。它的工作原理如下:设想一下,如果我们有100组神经网络的随机权重,并用每组权重来评估神经网络,来看看它是如何执行某个任务的。做完这些之后,我们只保留最佳的20组权重。我们将每组权重重塑成一维数组集。然后,我们可以通过从我们保存的20个随机选择中填充剩余的80个权重集,并且应用简单的交叉和变异操作来形成新的权重集合:

交叉和变异的简单例子(图像源

新的80个权重的集合将是前20个权重的一些变异组合,一旦我们再次拥有了100个权重的全集,我们可以用每个权重重新评估神经网络,重复这个任务,并重复演变进程,直到我们获得一组满足我们需求的权重。

这种类型的算法是神经元进化的一个例子,当难以定义一个在数学上表现良好的目标函数时(例如没有明确导数的函数),对于求解神经网络权重是非常有用的。前面使用过这种简单的方法,我设法训练过让神经网络来平衡倒立的摆锤,打煤泥排球,并让agents一起学习避免障碍

虽然这种方法易于实现,便于使用,但它并不能很好地扩展,特别是在网络规模超过一千个连接的情况下时。排球agent的大脑只有十几个激活功能,诸如深度学习(Deep Q Learning)和策略梯度等现代方法也使我们能够训练一个(更大的)网络来执行这些控制任务,或者使用反向传播来训练游戏任务。话虽如此,我敢打赌我头脑简单的排球agent还是会踢DQN的屁股:-)

过去几年深度学习的研究给了我们许多有用的工具来有效地使用backprop来完成许多机器学习任务。除了重量正则化之外,我们也有dropout、rmsprop、批量归一化等方法。所以我觉得,在将来,backprop将一直是训练神经网络的非常有价值的部分,因为研究人员发现很多将更多问题构建到端到端框架的方法。

除了权重搜索之外,深度学习的研究还产生了许多强大的神经网络架构,这些架构是重要的构建模块。历史以来,大部分神经网络架构都是被那些聪明人用手工设计的。例如,LSTM门是手工制作的,以避免RNN消失的梯度问题。Convnets的创建是为了尽量减少计算机视觉问题所需的连接数量,ResNets被设计成能够有效地堆叠多层神经网络。通常情况下,主流学术研究发现和适应了这样的新架构之后,其他研究人员会回过头来认识到这个发明实际上有多简单,并且很遗憾他们不能第一个提出这个想法。

我认为Neuroevolution可以在神经网络架构设计的领域中成为一个有用的工具的。遗传算法不仅仅能够发现神经网络连接权重,它也可以扩宽范围到发现整个神经网络。我认为,让计算机能够自动发现新的神经网络架构是一个非常酷的想法,所以我创建了这个简单的演示来探索这个概念。

演化神经网络拓扑

增强拓扑(NEAT)的神经元演化是一种基于遗传算法的新型神经网络的演化方法。在十多年前被肯·斯坦利所发表,非常受小边缘群体中做进化计算的AI研究者所欢迎。然而在深度学习占主导地位的主流机器学习研究中,演化计算当然不受欢迎。深度学习的研究人员就像人工智能社区的流行 偶像,而边缘研究人员更像是一些没有人听说过的晦涩难懂的车间 独立 金属乐队

无论如何,NEAT的工作方式是将神经网络表示为连接列表。一开始,网络的初始种群将有一个非常简单的架构,比如每个输入信号和偏置直接连接到没有隐藏层的输出上。在变异操作中,有一定的概率创建一个新的神经元。一个新的神经元将被放置在一个现有的连接之间,因此在引入一个新的神经元之后将创建一个新的连接,如下所示:

在同一个变异操作中也会有一些新的连接被创建,如下所示:

每个神经元和整个接口中的连接都是唯一的,且被分配了一个唯一的整数标签。所以和这些连接的权重一起,每个网络只是一个连接列表。请注意,两个不同的网络可以有类似的连接,但每个网络的权重通常会不同。

因为每个神经元和每个连接都是独一无二的,所以合并两个不同的网络从而产生一个新的网络也是有可能的。以下是交叉操作如何在NEAT中完成的图:

所有的图表都来自NEAT的原始论文

交叉操作是非常厉害的,如果我们有一个擅长某个子任务的网络,还有一个擅长于某个其他子任务的网络,我们有可能可以培育出一个支系网络,这个支系网络可能擅长将两种技能结合起来,在执行更大的任务时,表现得比双方源网络都好。

既然定义了突变和交叉操作,我们可以简单地使用前面介绍的遗传算法来发现新的网络。但是,这还不够,因为在NEAT算法中不止有这些遗传算子。

物种形成

在进化算法中,物种形成是一个将基因群体分成由类似群体组成的不同物种的想法。这个想法是给出种群中的具体成员数,这些成员可能不是最擅长执行任务的,但是看起来和与那些目前表现最好的成员有很大不同,也有更多的时间发展他们的全部潜力,而不是在每一代中完全否决掉他们。

想象有一个孤岛,那里只有狼和企鹅。如果我们顺其自然,企鹅在第一代之后将成为死肉,我们只剩下狼群。但是如果我们在狼群进入这个区域的时候,制造一个特殊的禁杀区,不允许狼群在岛上杀企鹅,那么一定数量的企鹅将会永远存在,并有时间演化成可以飞翔的企鹅,这将使他们可以回到有大量植被生存的大陆,而狼将永远卡在岛上。也有可能有一些奇怪的带着突变因子的狼和一只企鹅坠入爱河,在这个地区共同建立一个家族,最后,这里还会有一群最终将统治大陆的狼企鹅。物种形成是人造进化中的一个强大的概念。

举一个更具体的例子,考虑一下前面关于100组权重的例子,想象一下,如果我们修改算法,只保留最好的20,然后扔下其余的,首先,根据相似性将100个权重分组成5个组,比如说,在他们的权重之间使用欧氏距离。现在我们有五个组,或者说物种,有20个网络,对于每个组,我们只保留前20%(因此我们保留每个物种的前4组权重),并且除去剩余的16个。从那里,我们可以决定填充由剩余的16个通过交叉变异每个物种的其余4个成员组成,或者由更大群体中的所有存活成员组成。通过修改遗传算法以允许物种形成的发生,某些类型的基因有时间充分发挥其潜力以达到极限,而且多样性将引起更好的基因产生,这些基因包含不同独特种类最好的物种。没有物种形成,群体很容易陷入局部最优的状况。

NEAT论文还定义了物种形成的一种方法。它定义了一个用距离运算符来衡量一个网络到另一个网络的差异程度。基本上,它计算两个网络不共享的连接的数量,以及共享的连接的数量,它测量了公共连接内的权重的差异,并且两个网络之间的距离是这些因素的线性组合。一旦我们可以计算出我们集群里每个网络之间的距离,NEAT就会规定一个公式,将一定距离内的网络组合在一起形成一个物种,或者一个子群体。如果你有兴趣进一步阅读细节,本文还列出了一些关于如何处理不同物种的想法,以及何时进行物种交叉繁殖和使某些物种灭绝。

我个人的看法是,虽然物种形成的概念很重要,但是如何确切地实现物种形成的过程是非常灵活的,没有完全确切的方法。在我实现这个演示的NEAT时,我实际上忽略了NEAT物种形成的方法,并且最终使用K-Medoids算法根据计算出的网络间距离将100个网络的人口分成5个。我们不能使用K均值聚类,因为我们只知道每个网络之间的距离,而不知道超维空间中的确切位置。对于本演示中的简单分类任务来说,这种方法很好地完成了工作要求,而且看起来更好,对我来说也简单易用。

Backprop NEAT

忘了Torch,Tensorflow和Theano,我决定用Javascript来实现NEAT的Backprop,因根据数据科学的Dojo(Dojo是一个用javascript语言实现的开源DHTML工具包)来说,它是适合深度学习最好的语言。

为了创作基因艺术,我在早期的一个名为Neurogram的项目中实现了NEAT的遗传算子部分,这个项目允许用户使用NEAT风格的交叉和变异算子交互式地演化一群神经网络。为了生成图片,该图片中每个像素的坐标将是神经网络的输入,而输出将是该像素的颜色。网络越复杂,输出图片就会越详细。

在我们的NEAT的实现中,我允许在神经网络中以不同颜色表示的许多类型的激活函数。以下是不同激活函数的图例:

input(输入)

output(输出)

bias(偏置)

sigmoid(S形)

tanh(双曲正切)

relu(线性整流函数)

gaussian(高斯)

sine(正弦)

abs(绝对值)

mult(多元)

add(加法)

square(平方)

add(加法)运算不执行任何操作的输入(传入连接的输出的加权和),而mult运算将多个所有的加权输入到一起。通过允许一个正弦运算,网络可以在输出中产生重复模式。squareabs的运算对于生成对称性是很有用的。 Gaussian运算可以帮助一次性绘制聚集区域。

从某种意义上讲,TensorFlow Playground中的分类问题可以看成是图像生成的一个子集。训练集中的每个数据点对应一个类(零个或一个),每个数据点都有一个(x,y)的坐标。如果我们调整这个艺术生成程序来输出一个0到1之间的实数,而不是三元色通道,我们可以试图让这个艺术生成程序画出来一个单调图像,单调图像中的区域强度低于0.5预测将对应零,高于0.5的区域预测将对应一。

因此,将Neurogram NEAT代码从图像生成调整为执行一个分类任务是非常简单的。我们唯一需要做的就是实现NEAT的遗传算法部分以及物种形成,以使网络专门演化来拟合这些训练数据,而不是生成奇特的艺术。

由于我是通过描述一个神经网络来实现NEAT的工作的,这个神经网络最终构建为可由recurrent.js处理的计算图形,所以我们还能够执行反向传播并优化每个单独神经网络体系结构的权重,以便和训练数据最拟合。这样,NEAT严格地负责来确认新的体系结构,而backprop可以试着决定NEAT提出的每个体系结构的最佳权重的集合。在最初的NEAT论文中,NEAT也被用来通过遗传算法运算来计算权重,但是我认为这并没有什么效果,特别是当我们知道backprop是一个用于计算简单分类问题权重的好方法时。在我的现里,当每个网络上执行反向传播时,我还会加入一个L2正则化项。将来,还有可能实现其他一些技术,例如dropout(退出)。

一开始,网络的群集开始看起来非常简单也非常小,如下所示。请注意,对于这个演示来说,输出神经元也是一个sigmoid(S形)运算,因为我们将那些标记为0或1的类进行分类。所以基本上第一代网络都是具有不同的随机初始权值的逻辑回归网络。

output=σ(w1x+w2y+w3b)

\displaystyle {output=\sigma\left(w_1x+w_2y+w_3b\right)}output=σ(w​1​​x+w​2​​y+w​3​​b)

这个简单的网络只是将坐标线性组合成一个S形图层,只会将平面划分成如上图所示的一条线。输出接近于零的区域将被涂成橙色。接近于1的区域将被涂成蓝色,零到1之间的区域将被混合在两种颜色之间,并且在0.5处将完全是白色的。我们看到,当数据集是两个高斯集群时,最简单的默认网络将表现得相当好。实际上,我们首先用纯粹的随机权重的100个简单网络的初始种群开始,并且在对种群执行任何反向传播或遗传算法之前,群体中最好的网络对于用于这种类型的数据集已经足够好了。

在评估每个网络时,我们需要为每个网络分配一个好的分数,所以我们可以在遗传算法中对它们进行排序。除了查看每个网络如何适合训练数据,使用最大可能性的方法,连接的数量会影响网络的拟合度评分。如果它们达到的是相同的回归精度,我们宁愿在更复杂的网络上使用更简单的网络,在某些情况下,即使简单的网络没那么精确地拟合训练数据,我们也会更喜欢简单得多的网络。为了达到这个目的,我把拟合度评分乘以一个与连接数的平方根成比例的因子。

\displaystyle {fitness=-regression_\;error * \sqrt{1 + connection\;count\;penalty * connection\;count}}fitness=−regression​​​error∗√​1+connectioncountpenalty∗connectioncount​​​

具有更多连接的网络将具有比具有更少连接的网络有更负方向的拟合度。我使用了平方根函数,因为我觉得一个有51个连接的网络应该被看作是一个50个连接的网络,而一个有5个连接的网络应该被看作与4个连接的网络非常不同的对待。其他凹面效用函数可能会达到相同的效果。从某种意义上来说,就像权重的L2正则化一样,这种惩罚是神经网络结构本身正则化的一种形式。

经过几代NEAT进化步骤以及在计算适应性评分之前在每个网络上执行反向传播之后,我们最终得到一些试图拟合训练数据的网络:

更复杂的数据集,比如螺旋数据集将要求有更复杂的网络来适应训练数据。

就像前面提到的,我们的网络不是由许多结构化的神经元层组成的,每个神经元都可以连接到网络中的任何其他神经元。因此,有时甚至会形成循环,例如当输出连接回到隐藏的神经元时。当决定如何遍历神经网络时,这给我们带来了一个问题。

对于TensorFlow Playground中的传统前馈神经网络,可以用一行数学描述输出作为输入的一组嵌套函数,例如

对于一个两层递进网络来说,

而对于一个两层的Res网络来说,

因此,可以为这些前馈体系结构的每个输入准确确定输出的值。然而,对于由NEAT生成的大型网络来说,有许多循环连接,可能是非常困难的,或者甚至不可能将输出表达为我们可以一步计算的输入的函数。

要找到输出,我们只能一步一步地传播每一个连接,所以如果输入x和输出之间的最短距离由3个连接组成,那么至少需要3个步骤才能获得一个依赖于输入,否则输出值将为零。得到输出后,在训练周期性网络时,可以像反向传播一样使用backprop。输出信号也是时间的函数,或者说是我们传播网络的步数的函数。问题是我们该何时停止递进传播信号以便记录输出值用于分类?我已经做了一些与这个话题有关的工作,并在之前的博客文章中写下了我的一些想法。最后,我选择了第二种方法来停止每个神经元至少被触摸一次,我认为这是在我能做的选择之间的一个很好的平衡。

进化过程

在我的实现中,我保持了100个网络的固定群体规模。正如前面所讨论的,我使用K-Medoids算法将子种群数量固定为5,因此整个种群将被聚类成5组20个相互类似的网络。

在进化步骤中,每个子网络的下一代将通过在相同的子网络(它可以是相同的网络选择两次)中随机选择来自上一代的两个网络来创建,由相对于拟合度得分的概率加权,所以更好的得分网络将有更多的可能的选择为下一代交配和生产后代。NEAT中的交叉+突变遗传算子将被应用在这个步骤中,因此下一代的后代相比于前一代将可能具有更多的神经元和连接。这是来自不同神经元类型的新型激活函数将被实验选择用于下一代,以查看它们是否将改善网络。

但有时候,下一代相对于现在的这一代来说,它可能并没有提供任何实际上飞改进,如果有的话,所有新的神经元和连接对于手头的任务都是无用的。为了解决这个问题,我还保留了上一代最好的10个网络,并将它们存储在一个特殊的hall of fame基因池中,以保存下一代,这样每一代的最好的一代将被克隆,以防万一他们的孩子们比父母的人数还要多。迈克尔·乔丹的儿子在篮球上不可能比迈克尔·乔丹好。在这个世界上,你可能需要与他们的父母竞争。

在计算每个网络的适应度分数之前,将对每个网络进行反向传播以优化其权重。默认情况下,每个网络将被反向安装600次。之后,他们的逻辑回归误差将被结合一个因子来惩罚连接的数量来计算每个网络的拟合度得分。拟合度评分将在下一个进化过程中再次使用。

在每一代进化之后,我们有50%的机会迫使表现最差的种群灭绝,杀死20个所有成员。为了弥补现有的20个新瑕疵的缺口,我们允许上一代表现最好的品种生产另外20个额外的后代。如果企鹅一直不学习飞行,我们会让狼进入。这将导致表现最好的物种被分成两个亚种,然后往不同的方向发展。

使用演示

好的,用遗传算法、NEAT和backprop的方法的详解,我们终于可以讨论如何实际使用这个演示了,并且可以探索不同的选择。

首先,我们可以通过一个绿色的按钮来选择一个数据集。我已经截屏了TensorFlow Playground演示中使用的数据集,以便您可以比较结果。在大圆圈数据集、XOR数据集、由2个高斯聚类组成的数据集以及最具挑战性的螺旋数据集中里有小圆圈。每个数据集的随机数量可以使用data noise level左侧的滑动条进行控制。您也可以随时选择重置和重新生成数据集。我还放置了一个自定义数据集模式,以便您可以使用鼠标或触控板轻敲自己的数据集。

生成的数据中有一半属于训练集,一半属于测试集。您可以使用橙色按钮来选择要显示哪些组。

自定义数据集条目,数据点越多越好。

神奇的事情发生在这个蓝色的evolve + backprop按钮。这个按钮将在前一节中描述的一代网络中演变出整整一代的100个网络,然后在新一代的每个网络上执行backprop(反向传播)。有时候,如果你觉得还没有达到他们的局部最优值,那么你可能还想试验网络的进一步推广,因为对于网络来说,这可能已经变得非常大了。所以我纳入了一个红色的backprop more按钮,以便只进行反向传播,而不会发生进化。另外,我们可以通过调整相应的滑动条来控制每次backprop(反向传播)的次数,也可以控制学习速度。

在你点了evolve + backprop或者backprop only按钮之后,具有最佳拟合度评分的网络将被绘制在所有的神经元和连接到屏幕的右侧。较粗的连接线意味着重量的绝对值较大。分类区域和分类准确性也将被计算并显​​示在屏幕的左侧。除了绘制分类区域之外,错误预测的样本将在数据点周围形成一个小的红色圆圈来指示预测错误。网络上方印有世代数、神经计数和连线数、以及最佳网络的拟合度得分。如前所述,拟合度评分还取决于连接计数惩罚因子数,该因子的大小可以通过左下角的滑块控制。

如果你不想看到集群中最好的网络,也可以选择在5个子群体中看到最好的网络。每个子群体都有一个按钮,如果您点击其中一个,您将能够调出并显示该子群体的最佳网络,并且所有相关信息都将基于该网络。这将允许你看到不同物种的不同结构,并欣赏集群中的(强制)多样性。默认情况下,最好的子群体,也就是最好的网络将被选中显示。子种群按钮的颜色的相对阴影是基于每个亚种群的最佳成员的相对拟合度分数的,颜色越一致,子群越与其他的子群具有相关性。

结果

在原始的TensorFlow Playground演示中,用户可以走捷径使用预定义的功能,比如平方输入,相乘或者通过正弦曲线,然后将输入和所有这些人工设计的预处理特征输入到多层神经网络。这有利于人类直观地识别数据集中的特征,并选择好的特征来计算,以简化神经网络的任务。例如,如果数据集是大圆内的小圆圈,我们知道决策边界就是原点的半径,甚至是半径的平方,所以通过先将两个输入平方,大部分工作已经为网络完成了。

我感兴趣看到的是,遗传算法自身通过演化过程发现这些特征,通过额外的可用激活函数将这些特征计算结合到实际的神经网络中,而不依赖于人体工程学。因此,每个NEAT网络的原始输入将只是x和y坐标,而偏差值为1。任何特征,如平方数据,乘以或穿过正弦门,都必须被算法自己发现。

我注意到,对于两个圆圈数据集,最终网络更可能由许多正弦、平方或abs激活门组成,这对于给定数据集的对称性是有意义的。对于异或数据集,往往有更多的激励激活,这是需要产生的决策边界是或多或少直线与尖锐的角落。

XOR数据集解决方案示例

我注意到一个更有趣的事情是,反向传播良好的网络将在进化过程中更受到青睐,而与倾斜的网络相比,由于网络的爆炸性权重可能会导致垃圾分类结果导致不好的拟合度评分。设置较少的backprop步骤或较大的学习速率可能导致遗传算法产生不同类型的网络,它们在这些环境中性能会更好。

因此,即使存在一个能准确拟合训练数据的特定网络的权值集合,如果反向传播条件不允许该网络学习该权值集合,也可能最终被演化丢弃。也许生活中的一个比喻就是,如果在野蛮的时代生活在一个非常恶劣的环境中,那些智力高的人可能永远无法发挥出自己的潜力,而这个野蛮的时代有利于生硬的体力和渴望掠夺弱者。或者在现代,原始智力高的人如果缺乏能够影响社会同仁接受他们思想的人的技能,也可能会失败。

未来工作

除了分类问题之外,我之前也创建了一个类似的演示来获得Backprop NEAT来处理回归问题。如果你有兴趣,下面是一个简单的回归演示。在这个演示中,为了更好的比较,所有五个子群体结果都被绘制在画布上。

我感兴趣的的任务之一是,看到神经元进化演化来发现新型的小型神经网络构建模块,例如LSTM模块,这些模块通常在更大的深度神经网络或循环神经网络中重复使用。考虑到一定深度的学习任务和大量的GPU(每隔几个月就会变得越来越实惠),或许在未来我们可以看到,基于不断发展的小型计算机,可以并行训练100个深度网络构造块神经网络组件,并可以发现能够很好​​地解决某些问题的新颖的小型网络块。

也许“A”可以演变?(来源:Colah 在LSTM上的博客文章

感谢那些帮助我更早地测试神经网络演化游戏演示的朋友们,并为我们提供了宝贵的反馈,用于微调和改进。

本文的版权归 林纾燊 所有,如需转载请联系作者。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能头条

写给大家看的机器学习书【Part2】训练数据长什么样?机器学到的模型是什么?

20030
来自专栏量化投资与机器学习

Python机器学习:数据拟合与广义线性回归

谢谢大家支持,可以让有兴趣的人关注这个公众号。让知识传播的更加富有活力,谢谢各位读者。 很多人问博主为什么每次的头像是奥黛丽赫本,因为她是博主女神,每天看看女神...

48670
来自专栏大数据文摘

斯坦福CS231N深度学习与计算机视觉第二弹:图像分类与KNN

20140
来自专栏PPV课数据科学社区

“小数据”的统计学

一、小数据来自哪里? 科技公司的数据科学、关联性分析以及机器学习等方面的活动大多围绕着”大数据”,这些大型数据集包含文档、 用户、 文件、 查询、 歌曲、 图片...

36260
来自专栏钱塘大数据

Python的开源人脸识别库:离线识别率高达99.38%(附源码)

以往的人脸识别主要是包括人脸图像采集、人脸识别预处理、身份确认、身份查找等技术和系统。现在人脸识别已经慢慢延伸到了ADAS中的驾驶员检测、行人跟踪、甚至到了动态...

10.6K50
来自专栏量子位

@马斯克:只凭一个摄像头,3D目标检测成绩也能媲美激光雷达

靠一个摄像头拍下的图像做3D目标检测,究竟有多难?目前最先进系统的成绩也不及用激光雷达做出来的1/10。

17220
来自专栏钱塘大数据

Python的开源人脸识别库:离线识别率高达99.38%

以往的人脸识别主要是包括人脸图像采集、人脸识别预处理、身份确认、身份查找等技术和系统。现在人脸识别已经慢慢延伸到了ADAS中的驾驶员检测、行人跟踪、甚至到了动态...

2.5K70
来自专栏IT派

【源码】Python的开源人脸识别库:离线识别率高达99.38%

如果你觉得好的话,不妨分享到朋友圈。 以往的人脸识别主要是包括人脸图像采集、人脸识别预处理、身份确认、身份查找等技术和系统。现在人脸识别已经慢慢延伸到了ADAS...

1K60
来自专栏人工智能头条

用深度学习做个艺术画家 ——模仿实现PRISMA

24740
来自专栏量子位

GANs很难?这篇文章教你50行代码搞定(PyTorch)

作者:Dev Nag,Wavefront创始人、CTO,曾是Google、PayPal工程师。量子位编译。 2014年,Ian Goodfellow和他在蒙特利...

35950

扫码关注云+社区

领取腾讯云代金券