「第一个深度学习框架该怎么选」对于初学者而言一直是个头疼的问题。本文中,来自 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 于 2017 年 1 月对外发布,是专注于直接处理数组表达式的较低级别 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 中定义的简单卷积网络来对二者进行对比:
1. 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'))
2. 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))) xx = 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 可能是最完美的解决方案。
3. 结论
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 时间比其数据科学家的时间显然便宜得多。而且,在学习过程中,性能瓶颈大多是由失败的实现、未优化的网络和数据加载造成的,而不是框架本身的运行速度。当然,为了完整地进行比较,我们还是要介绍这一方面。在这里我们推荐两个性能对比结果:
Wojtek Rosiński 的《TensorFlow, Keras and PyTorch Comparison》:https://wrosinski.github.io/deep-learning-frameworks/
微软的《Comparing Deep Learning Frameworks: A Rosetta Stone Approach》:https://github.com/ilkarman/DeepLearningFrameworks/
PyTorch 和 TensorFlow 一样快,在循环神经网络上或许更快,相比之下,Keras 通常速度较慢。正如第一篇文章的作者指出的那样:大多数情况下,高性能框架(即 PyTorch 和 TensorFlow)的计算效率优势不敌快速开发环境以及 Keras 提供的实验易用性。
结论:
就训练速度而言,PyTorch 胜过 Keras
八、Keras vs PyTorch:对比总结
Keras 和 PyTorch 都是深度学习框架初学者非常棒的选择。如果你是数学家、研究员或者想要理解模型的本质,那么可以考虑选择 PyTorch。在需要更先进的定制化和 debug 时(例如用 YOLOv3 做目标检测或者带有注意力的 LSTM),或者当我们需要优化数组表达式而不是神经网络时(例如矩阵分解或者 word2vec 算法),PyTorch 真的很棒。
如果你想要一个即插即用的框架,Keras 无疑是更简单的选择:快速构建、训练、评估模型,不需要在数学实现上花费太多的时间。
深度学习的核心概念知识是可转移的。一旦你掌握了一个环境中的基础知识,你就能学以致用,掌握新的深度学习库。
我们鼓励你在 Keras 和 PyTorch 中都尝试下简单的深度学习模型。