参与路雪 李泽南 李亚洲

Keras vs PyTorch:谁是「第一」深度学习框架?

「第一个深度学习框架该怎么选」对于初学者而言一直是个头疼的问题。本文中,来自 deepsense.ai 的研究员给出了他们在高级框架上的答案。在 Keras 与 PyTorch 的对比中,作者还给出了相同神经网络在不同框架中性能的基准测试结果。目前在 GitHub 上,Keras 有超过 31,000 个 Stars,而晚些出现的 PyTorch 已有近 17,000 个 Stars。

值得一提的是,尽管在 4 月底 PyTorch 在 0.4 版本中已经加入了对于 Windows 的支持,但其对比 Keras 与 TensorFlow 在 Windows 上的稳定性还略有差距。

两大框架的链接:

  • Keras:https://github.com/keras-team/keras (https://keras.io/)

  • PyTorch:https://github.com/pytorch/pytorch

你想学习深度学习吗?是要将深度学习应用到业务中,还是用深度学习开展副业,抑或只是为了得到一些适合市场需求的技能?无论目标是什么,选择合适的深度学习框架是达到目标的第一步。

我们强烈建议你选择 Keras 或 PyTorch。它们都是非常强大的工具,且不管是学习还是实验都很有乐趣。我们是从教师和学生的角度考虑的。本文作者 Piotr 在企业举办过 Keras 和 PyTorch 研讨会,Rafał则正在学习这两种框架。

简介

Keras 和 PyTorch 是颇受数据科学家欢迎的深度学习开源框架。

  • Keras 是能够在 TensorFlow、CNTK、Theano 或 MXNet 上运行的高级 API(或作为 TensorFlow 内的 tf.contrib)。Keras 于 2015 年 3 月首次发布,之后即因其易用性和语法简洁性而受到支持,得到快速发展。Keras 是谷歌支持的一款框架。

  • PyTorch 于 2016 年 10 月发布,是专注于直接处理数组表达式的较低级别 API。去年它受到了大量关注,成为学术研究和需要优化自定义表达式的深度学习应用偏好的解决方案。它是 Facebook 支持的一款框架。

在讨论二者的具体细节之前,我们想先说明:对于「哪一个框架更好」这个问题我们没有直接明了的答案。选择哪一个框架最终取决于你的技术背景、需求和期望。本文旨在帮助你更好地了解何时应该选择 Keras 或 PyTorch。

一句话总结

Keras 更容易学习和用标准层进行实验,即插即用;PyTorch 提供一种较低级别的方法,对于更具备数学背景的用户来讲灵活性更强。

所以,那么为什么不用其他框架呢?

本文不讨论选择 TensorFlow 作为首选深度学习框架的优劣势,因为我们认为 TensorFlow 与 Keras(TensorFlow 的官方高级库)和 PyTorch 相比对于新手不够友好。尽管你可以找到一些 Theano 教程,但它已不再处于活跃开发状态。Caffe 缺少灵活性,Torch 使用 Lua 语言(然而其重写非常难:))。MXNet、Chainer 和 CNTK 目前应用不那么广泛。

Keras vs PyTorch:易用性和灵活性

Keras 和 PyTorch 的运行抽象层次不同。

Keras 是一个更高级别的框架,将常用的深度学习层和运算封装进干净、乐高大小的构造块,使数据科学家不用再考虑深度学习的复杂度。

PyTorch 提供一个相对较低级别的实验环境,使用户可以更加自由地写自定义层、查看数值优化任务。当你可以使用 Python 的全部能量,访问使用的所有函数的核心,则复杂架构的开发更加直接。这自然会以冗长为代价。

下面用在 Keras 和 PyTorch 中定义的简单卷积网络来对二者进行对比:

Keras

model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(MaxPool2D())
model.add(Conv2D(16, (3, 3), activation='relu'))
model.add(MaxPool2D())
model.add(Flatten())
model.add(Dense(10, activation='softmax'))

PyTorch

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()

        self.conv1 = nn.Conv2d(3, 32, 3)
        self.conv2 = nn.Conv2d(32, 16, 3)
        self.fc1 = nn.Linear(16 * 6 * 6, 10) 
        self.pool = nn.MaxPool2d(2, 2)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 6 * 6)
        x = F.log_softmax(self.fc1(x), dim=-1)

        return x

model = Net()

上述代码片段显示了两个框架的些微不同。至于模型训练,它在 PyTorch 中需要大约 20 行代码,而在 Keras 中只需要一行。GPU 加速在 Keras 中可以进行隐式地处理,而 PyTorch 需要我们指定何时在 CPU 和 GPU 间迁移数据。

如果你是新手,那么 Keras 作为更高级别的框架可能具备明显优势。Keras 确实可读性更强,更加简练,允许用户跳过一些实现细节,更快地构建自己的第一个端到端深度学习模型。但是,忽略这些细节会限制用户探索深度学习流程中每个计算模块内在工作原理的机会。使用 PyTorch 会提供更多机会,来更深入地思考深度学习核心概念,如反向传播以及其他训练过程。

也就是说,Keras 虽然比 PyTorch 简单得多,但它绝不是「玩具」,它是初学者以及经验丰富的数据科学家使用的正经深度学习工具。

例如,在 DSTL 卫星图像特征检测 Kaggle 竞赛中,最优秀的 3 支队伍的解决方案都使用了 Keras,第四名(deepsense.ai 队伍)使用了 PyTorch 和 Keras。

你的深度学习应用所需的灵活性是否超出 Keras 能够提供的灵活性值得考虑。根据你的需求,遵循 Rule of least power,Keras 可能是最完美的解决方案。

结论

  • Keras:更简练,更简单的 API

  • PyTorch:更灵活,鼓励用户更深入地理解深度学习概念

Keras vs PyTorch:流行度和可获取学习资源

框架流行度不仅代表了易用性,社区支持也很重要——教程、代码库和讨论组。截至 2018 年 6 月,Keras 和 PyTorch 的流行度不断增长,不管是 GitHub 还是 arXiv 论文(注意大部分提及 Keras 的论文也提到它的 TensorFlow 后端)。根据 KDnuggets 调查,Keras 和 PyTorch 是增长最快的数据科学工具。

尽管两个框架的文档都比较好,但是 PyTorch 的社区支持更强大:其讨论板很值得访问,其中能找到你在文档或 StackOverflow 中找不到的答案。

我们发现基于 Keras 的初学者深度学习课程要比基于 PyTorch 的课程简单,这使得前者更容易受初学者喜欢。Keras 的代码可读性和无与伦比的易用性使它被深度学习爱好者、教师和实力派 Kaggle 冠军广泛使用。

伟大的 Keras 资源和深度学习课程示例,参见 Piotr Migdał写的文章《Starting deep learning hands-on: image classification on CIFAR-10》,以及 Keras 创建者 François Chollet 写的书《Deep Learning with Python》。至于 PyTorch 资源,我们推荐官方教程,提供了稍微更有挑战性的综合方法来学习神经网络的内在工作原理。

结论

  • Keras:大量可获取教程和可重用代码

  • PyTorch:卓越的社区支持和活跃的开发

Keras vs PyTorch:debug 和内省

Keras 封装了大量计算模块,这使得确定导致问题的代码较为困难。

相比起来,PyTorch 更加详细,我们可以逐行执行脚本。和 debug NumPy 类似,我们可以轻松访问代码中的所有对象,使用 print 语句(或任何标准 Python debug 语句)查看有问题的代码。

Keras 用户创建的标准网络要比 PyTorch 用户创建的标准网络出错的机率小一个数量级。但是一旦出错,则损害巨大,且通常很难定位出错的代码行。PyTorch 提供更直接了当的 debug 经验,而无需关注模型复杂度。此外,当你怀疑哪里出错时,你可以查找 PyTorch repo 查看可读代码。

结论

  • PyTorch:debug 能力更强

  • Keras:debug 简单网络的需求的(潜在)频率更低

Keras vs PyTorch:导出模型和跨平台可移植性

在生产环境中,导出和部署自己训练的模型时有哪些选择?

PyTorch 将模型保存在 Pickles 中,Pickles 基于 Python,且不可移植,而 Keras 利用 JSON + H5 文件格式这种更安全的方法(尽管在 Keras 中保存自定义层通常更困难)。另一方面,Keras 也有 R 语言接口,如果你合作的数据分析师团队使用 R 语言,那么你会用得上它。

Keras 是在 TensorFlow 上运行的,这意味着它可以通过 TensorFlow for Mobile 和 TensorFlow Lite 享有更多选择来部署到移动平台。你编写的 web 应用也可以通过 TensorFlow.js 或 Keras.js 部署到网页上。例如,你可以看看这个深度学习驱动的浏览器插件,它可以检测密集恐惧症触发因素:https://github.com/cytadela8/trypophobia。

导出 PyTorch 模型的过程由于其 Python 代码的限制而更加费力,目前人们广泛采用的方法是首先使用 ONNX 将 PyTorch 模型转换为 Caffe2 形式。

结论

  • Keras 获胜:它有更多的部署选项(直接通过 TensorFlow 后端),模型导出也更简单。

Keras vs PyTorch:性能篇

Donald Knuth 有一句名言:不成熟的优化是编程中所有邪恶(至少大部分)的根源。

在大多数情况下,基准测试中的速度差异不应该成为框架选择的主要标准——特别是在学习阶段。GPU 时间比其数据科学家的时间显然便宜得多。而且,在学习过程中,性能瓶颈大多是由失败的实现、未优化的网络和数据加载造成的,而不是框架本身的运行速度。当然,为了完整地进行比较,我们还是要介绍这一方面。在这里我们推荐两个性能对比结果:

PyTorch 和 TensorFlow 一样快,在循环神经网络上或许更快,相比之下,Keras 通常速度较慢。正如第一篇文章的作者指出的那样:大多数情况下,高性能框架(即 PyTorch 和 TensorFlow)的计算效率优势不敌快速开发环境以及 Keras 提供的实验易用性。


结论

  • 就训练速度而言,PyTorch 胜过 Keras

Keras vs PyTorch:对比总结

Keras 和 PyTorch 都是深度学习框架初学者非常棒的选择。如果你是数学家、研究员或者想要理解模型的本质,那么可以考虑选择 PyTorch。在需要更先进的定制化和 debug 时(例如用 YOLOv3 做目标检测或者带有注意力的 LSTM),或者当我们需要优化数组表达式而不是神经网络时(例如矩阵分解或者 word2vec 算法),PyTorch 真的很棒。

如果你想要一个即插即用的框架,Keras 无疑是更简单的选择:快速构建、训练、评估模型,不需要在数学实现上花费太多的时间。

深度学习的核心概念知识是可转移的。一旦你掌握了一个环境中的基础知识,你就能学以致用,掌握新的深度学习库。

我们鼓励你在 Keras 和 PyTorch 中都尝试下简单的深度学习模型。

原文链接:https://deepsense.ai/keras-or-pytorch/

工程PyTorchKeras深度学习框架
5
相关数据
神经网络技术
Neural Network

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

MXNet技术
MXNet

MXNet是开源的,用来训练部署深层神经网络的深度学习框架。它是可扩展的,允许快速模型训练,并灵活支持多种语言(C ++,Python,Julia,Matlab,JavaScript, Go,R,Scala,Perl,Wolfram语言)

word2vec技术
word2vec

Word2vec,为一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。 训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系。该向量为神经网络之隐藏层。 Word2vec依赖skip-grams或连续词袋(CBOW)来建立神经词嵌入。Word2vec为托马斯·米科洛夫(Tomas Mikolov)在Google带领的研究团队创造。该算法渐渐被其他人所分析和解释。

深度学习技术
Deep learning

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法。观测值(例如一幅图像)可以使用多种方式来表示,如每个像素强度值的向量,或者更抽象地表示成一系列边、特定形状的区域等。而使用某些特定的表示方法更容易从实例中学习任务(例如,人脸识别或面部表情识别)。 近年来监督式深度学习方法(以反馈算法训练CNN、LSTM等)获得了空前的成功,而基于半监督或非监督式的方法(如DBM、DBN、stacked autoencoder)虽然在深度学习兴起阶段起到了重要的启蒙作用,但仍处在研究阶段并已获得不错的进展。在未来,非监督式学习将是深度学习的重要研究方向,因为人和动物的学习大多是非监督式的,我们通过观察来发现世界的构造,而不是被提前告知所有物体的名字。 至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

张量技术
Tensor

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

TensorFlow技术
TensorFlow

TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习。目前被50个团队用于研究和生产许多Google商业产品,如语音识别、Gmail、Google 相册和搜索,其中许多产品曾使用过其前任软件DistBelief。

路雪
路雪

机器之心编辑

推荐文章
【技术实践报告】神经机器翻译 - 中英翻译探索与实战【技术实践报告】神经机器翻译 - 中英翻译探索与实战
机器之心机器之心
6
如何将模型部署到安卓移动端,这里有一份简单教程如何将模型部署到安卓移动端,这里有一份简单教程
路雪路雪
2
在Python 2.7即将停止支持时,我们为你准备了一份3.x迁移指南在Python 2.7即将停止支持时,我们为你准备了一份3.x迁移指南
机器之心机器之心
4
返回顶部