从三大神经网络出发,对TensorFlow、MXNet、CNTK、TheanoKeras后端四大框架进行测试对比,测试不同框架在不同类型任务中的表现。本文通过五个任务测试了MLP、CNN和RNN模型。机器之心不仅介绍了实验,还使用Keras(TensorFlow后端)在MNIST数据集上测试运行CNN。如果我们对Keras在数据科学和深度学习方面的普及有任何疑虑,那么考虑一下各大云平台和深度学习框架的支持,看看它的威力。目前Keras正式版已经支持谷歌的TensorFlow、微软的CNTK、蒙特利尔大学的Theano。此外,AWS去年宣布Keras将支持ApacheMXNet。上个月发布的MXNet0.11添加了CoreML和Kerasv1.2。支持。但到目前为止MXNet似乎只支持Kerasv1.2.2而不是最新版本2.0.5。虽然我们可以使用任何Keras支持的后端部署模型,但开发者和解决方案架构师应该明白,Keras作为各个深度学习库的高层API,本质上并不支持各个库提供的所有基础参数微调.所以如果我们想要微调后端框架提供的所有参数,那么我们最好直接使用深度学习框架,而不是使用Keras。当然,随着各种工具加入Keras和深度学习框架,这种情况会有所改善,但目前Keras仍然是一个非常适合深度学习开发早期和数据科学家的优秀工具。为算法工程师提供强大的工具来快速构建和测试复杂的深度学习模型。机器之心也尝试过使用TensorFlow作为后端来测试Keras。我们发现整个模型搭建起来非常简单,即使是初学者也能轻松理解整个网络的架构。与直接用TensorFlow构建卷积神经网络相比,使用Keras作为高层API,使用TensorFlow作为后端要简单的多。后面我们会把Keras实现CNN的代码和注释上传到机器之心的GitHub项目。下图是我们使用TensorFlow作为后端初始化训练时的情况:下面是整个卷积网络的架构:model=Sequential()model.add(Conv2D(32,kernel_size=(3,3),activation='relu',input_shape=input_shape))model.add(Conv2D(64,(3,3),activation='relu'))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(128,activation='relu'))model.add(Dropout(0.5))model.add(Dense(num_classes,activation='softmax'))上面的代码明确定义了整个网络覆盖使用的层级。Sequential表示一个顺序模型,即多个网络层的线性堆叠。建立时序模型后,我们可以从输入层开始依次添加不同的层,实现整个网络的构建。上述架构首先使用二维卷积层Conv2D,卷积核大小为3*3,激活函数为ReLU,其中第一个参数32表示卷积核的个数。另外,卷积网络还使用了最大池化层MaxPooling2D,pool_size=(2,2)是两个方向(垂直,水平)的下采样因子;Dropout层,以0.25的概率在每次更新参数时随机断开输入神经元;Dense层,即全连接层;Flatten层,即将输入“扁平化”,即将多维输入一维化,从卷积层到全连接层经常用到。层过渡。以上是架构的基本层次。更详细的代码和注释请参考HeartoftheMachineGitHub项目。以下是JasmeetBhatia评价的具体情况。Keras后端框架性能测试Keras还使开发人员能够快速测试使用不同的深度学习框架作为Keras后端的相对性能。Keras配置文件中有一个参数决定了使用哪个深度学习框架作为后端,所以我们可以构建相同的模型,直接在不同的深度学习框架(如TensorFlow、CNTK、Theano)上运行。对于MXNet,由于目前只支持Kerasver1.2.2,我们需要对代码做一点修改。当然这个模型可以根据各种深度学习框架中的不同库进行微调以获得更好的性能,但Keras仍然提供了一个很好的机会来比较这些基础库之间的性能。之前有一些文章比较了Keras支持的后端框架的相对性能,但是比较的比较早,比较的主要是TensorFlow和Theano作为后端。因此,本文基于最新版本的Keras和深度学习框架,进行更大范围的对比。让我们先看看用于测试的配置。所有性能测试都是在带有NvidiaTeslaK80GPU的AzureNC6VM上执行的,使用的VM映像是Ubuntu上的AzureDSVM(数据科学虚拟机)。我们预装了Keras、TensorFlow、Theano和MXNet等数据科学工具。为了测试,所有包都使用最新版本,但由于MXNet仅支持Keras1.2.2,因此使用旧版本。配置由于每个深度学习框架都有不同的依赖关系,我们的测试在以下三种配置中运行:性能测试为了比较不同DL框架的性能,我们使用了5种不同的测试模型,如下所述。为确保没有特定框架得到任何特定处理,所有模型均取自GitHubKeras/examples存储库中维护的模型。模型源码地址:https://github.com/fchollet/keras/tree/master/examples测试代码可以在作者的GitHub项目中找到:https://github.com/jasmeetsb/deep-learning-keras-projects注:有两个测试MXNet没有参与,因为MXNet不支持最新版本的Keras,以MXNet为后端运行模型需要大量的代码调整。其他三项测试使用MXNet作为后端也需要做一些小的调整,主要是新版Keras对部分功能进行了重命名。测试一:CIFAR-10&CNN学习模型类型:卷积神经网络(CNN)数据集/任务:CIFAR-10小图像数据集目标:将图像分为10类根据每个epoch的训练速度,TensorFlow快一点比MXNet。在准确率/收敛速度上,CNTK在前25个epochs略有领先,50个epochs后,其他框架达到相似的准确率,而CNTK略有下降。测试2:MNIST&CNN学习模型类型:CNN数据集/任务:MNIST手写数字数据集目标:将图片分类为10类手写数字所有框架在速度/收敛速度方面具有相似的特征。测试3:MNIST&MLP学习模型类型:多层感知器/深度神经网络数据集/任务:MNIST手写数字数据集目标:将图像分类为10类手写数字在使用MNIST数据集执行标准神经网络测试时,CNTK、TensorFlow和Theano实现相似的分数(2.5–2.7s/epoch),而MXNet只需要1.4s/epoch。此外,MXNet在准确率/收敛速度上也略有优势。测试4:MNIST&RNN学习模型类型:层次递归神经网络(HRNN)数据集/任务:MNIST手写数字数据集目标:将图像分类为10类手写数字CNTK和MXNet在训练时间(162–164s/epoch)上具有相似的性能,TensorFlow的时间是179s/epoch,而Theano需要的时间明显增加。Test5:BABI&RNNLearningModel类型:递归神经网络(RNN)Dataset/Task:bAbiProject(https://research.fb.com/downloads/babi/)目标:根据故事(story)和问题分别训练两个递归神经网络,使得组合向量可以回答一系列bAbi任务。本次测试不使用MXNet,TensorFlow和Theano每个epoch的速度是CNTK的两倍多。TensorFlow在CNN测试中表现最好,但在RNN测试中表现不佳。CNTK在BabiRNN和MNISTRNN测试上比TensorFlow和Theano好得多,但在CNN测试上比TensorFlow差。MXNet在RNN测试上略好于CNTK和TensorFlow,在MLP上优于所有框架。但是MXNet不支持Kerasv2的功能,所以我们不能不修改代码就直接测试,所以可能会有一点偏差。Theano在深度神经网络(MLP)方面略优于TensorFlow和CNTK。结语从上面的结果可以看出,所有的深度学习框架都有自己擅长的领域,没有哪个框架一定比别人好。CNTK可用作RNN用例的Keras后端,TensorFlow可用于CNN,而MXNet虽然在性能方面显示出很大潜力,但仍有望支持所有Keras功能。在开源社区中,这些框架不断得到扩展和增强,以提供更好的性能并轻松部署到生产环境中。在考虑将这些深度学习框架用于生产时,性能至关重要。在大多数情况下,我们还需要考虑易于部署和其他辅助工具,这将帮助我们在生产中管理机器学习模型。***,所有框架的性能都是作为Keras后端来评估的,所以会有一点误差,但是这篇文章至少可以帮助大家对这些框架的性能有一定的了解。另外,这篇文章可以在你使用不同的后端时,给出一些相对客观的建议。
