AiTechYun
编辑:yxy
你是否希望能够学习深度学习?你是想将其应用于商业,以此为基础建立你的下一个项目,还是仅仅是增加自己的职场价值?无论如何,选择合适的深度学习框架进行学习都是关键的、能够更好实现目标的第一步。
我们强烈建议你选择Keras或PyTorch。它们是强大的工具,不论你的用途是学习还是实验,都会用的很舒服。
介绍
Keras和PyTorch是深度学习的开源框架,深受数据科学家的欢迎。其中:
- Keras是一种能够在TensorFlow、CNTK、Theano或MXNet(或者在TensorFlow中运行tf.contrib)上运行的高级API。自2015年3月首次发布以来,它因易于使用和语法简单而备受青睐,使开发更加快速。由Google的支持。
- PyTorch于2016年10月发布,是一款专注于直接使用数组表达式的低级API。它在过去的一年里备受瞩目,成为学术研究的首选解决方案,以及需要优化自定义表达式的深度学习应用。由Facebook支持。
在我们讨论这两个框架的细节之前,我们首先要告诉你,对于“它们哪个更好?”的这个问题,并没有一个固定的答案。你的最终选择取决于你的技术背景,需求和期望。本文旨在让你更好地了解选择哪个作为第一个框架更为合适。
TL; DR:
本着即插即用的精神,Keras可能更容易进入标准层并进行实验。
PyTorch为更倾向数学的用户提供了更低层的方法和更多的灵活性。
为什么不对比其他框架?
本文不去讨论选择纯TensorFlow作为第一个深度学习框架的优缺点,因为我们认为与Keras(TF的官方高级库)和PyTorch相比,它不太适合初学者。虽然你也可能会找一些Theano教程,但它已经不再继续开发。Caffe缺乏灵活性,而Torch使用Lua(虽然它的重写很棒:))。MXNet,Chainer和CNTK目前尚未广泛流行。
Keras对比PyTorch:易用性和灵活性
Keras和PyTorch在操作抽象级别方面不同。
Keras是一个更高级的框架,将常用的深度学习层和操作包装到简洁的积木式的构建块中,将深度学习的复杂性从数据科学家的眼前抽象出来。
PyTorch为实验提供了一个相对低级的环境,使用户可以更自由地编写自定义层并查看数值优化任务的底层。当你可以使用Python的全部功能并访问所使用的所有函数的内核时,可以更直接的开发更复杂的架构。当然,代价是代码冗长。
我们思考一下,在Keras和PyTorch中定义一个简单的卷积网络的详细对比:
Keras
代码语言:javascript复制model= Sequential()
代码语言:javascript复制model.add(Conv2D(32, (3,3), activation='relu', input_shape=(32,32,3)))
代码语言:javascript复制model.add(MaxPool2D())
代码语言:javascript复制model.add(Conv2D(16, (3,3), activation='relu'))
代码语言:javascript复制model.add(MaxPool2D())
代码语言:javascript复制model.add(Flatten())
代码语言:javascript复制model.add(Dense(10, activation='softmax'))
PyTorch
代码语言:javascript复制class Net(nn.Module):
代码语言:javascript复制 def __init__(self):
代码语言:javascript复制 super(Net,self).__init__()
代码语言:javascript复制
代码语言:javascript复制 self.conv1= nn.Conv2d(3,32,3)
代码语言:javascript复制 self.conv2= nn.Conv2d(32,16,3)
代码语言:javascript复制 self.fc1= nn.Linear(16 * 6 * 6,10)
代码语言:javascript复制 self.pool= nn.MaxPool2d(2,2)
代码语言:javascript复制
代码语言:javascript复制 def forward(self, x):
代码语言:javascript复制 x= self.pool(F.relu(self.conv1(x)))
代码语言:javascript复制 x= self.pool(F.relu(self.conv2(x)))
代码语言:javascript复制 x= x.view(-1,16 * 6 * 6)
代码语言:javascript复制 x= F.log_softmax(self.fc1(x), dim=-1)
代码语言:javascript复制
代码语言:javascript复制 return x
代码语言:javascript复制
代码语言:javascript复制model= Net()
上面的代码片段展示了两种框架之间的差异。至于模型训练本身 – 在PyTorch中需要大约20行代码,而Keras只需一行代码。启用GPU加速在Keras中隐式处理,而PyTorch要求我们指定何时在CPU和GPU之间传输数据。
如果你是初学者,Keras的这种高级可能看起来是一个明显的优势。Keras确实更具可读性和简洁性,使你可以更快地构建自己的第一个端到端深度学习模型,同时跳过实现细节。然而,隐藏这些细节会限制了在深度学习过程中探索每个计算块的内部运作的机会。使用PyTorch可以让你更多的了解关于核心深度学习概念,如反向传播和其他训练过程。
也就是说,Keras比PyTorch简单得多,但绝不是玩具 – 它初学者和经验丰富的数据科学家都喜欢的一种严谨的深度学习工具。
以Kaggle竞赛“ Dstl Satellite Imagery Feature Detection”为例,最好的三支队伍在他们的解决方案中使用了Keras,deepsense.ai队(第四名)使用了PyTorch和Keras(较少)的组合。
值得深思的是,你的深度学习应用是否需要比纯Keras更强的灵活性。根据自己的需求,Keras可能最有效率。
总结
- Keras – 更简洁,更简单的API
- PyTorch – 更灵活,更容易深入理解深度学习概念
Keras对比PyTorch:人气和可获取学习资源
框架的普及度不仅是其可用性的代表。对于社区支持也很重要(教程、带有可用代码的资源库和讨论用户)。截至2018年6月,Keras和PyTorch在GitHub和arXiv论文上都受到越来越多的欢迎(请注意,大多数提及Keras的论文也到了他的TensorFlow后端)。根据KDnuggets的调查,Keras和PyTorch是增长最快的数据科学工具。
虽然这两个框架都有令人满意的文档,但PyTorch有更强大的社区支持,如果你遇到困难(你肯定会遇到)并且文档或StackOverflow不能为你提供所需的答案,它们的讨论板是解决你困惑的好地方。
有趣的是,我们发现,在给定的网络架构上具有注释的初学者级别的深度学习课程中,Keras来说比PyTorch更容易说清楚,使初学者更容易理解前者。代码的可读性和Keras提供的无与伦比的实验易用性可能会使其受到广大深度学习爱好者,导师和老道的Kaggle获奖者的广泛欢迎。
关于好的Keras资源和深度学习课程的例子,请参阅下方链接(也可以看看keras作者François Chollet写的“Deep Learning with Python”)。
链接https://blog.deepsense.ai/deep-learning-hands-on-image-classification/
而对于PyTorch资源,我们推荐官方教程,它提供了一个更具挑战性,更全面的方法来学习神经网络的内部运作。
总结
- Keras – 可以很好地访问教程和可重用代码
- PyTorch – 优秀的社区支持和积极的发展
Keras对比PyTorch:调试与自省
Keras在抽象中封装了大量计算块,因此难以确定导致问题的确切的行。
PyTorch作为更为繁琐的框架,可以让我们逐行执行我们的脚本。这就像调试NumPy一样 – 我们可以轻松访问代码中的所有对象,并且可以使用打印语句(或其他标准的Python调试)来查看方法失败的位置。
创建正常网络的Keras用户比PyTorch用户出错的机会少一个数量级。但一旦出现问题,就会很麻烦,而且通常很难找到出错的代码行。无论模型的复杂性如何,PyTorch都提供了更加直接的,更简单的调试。此外,如果有疑问,你可以随时查找PyTorch repo以查看其可读代码。
总结
- PyTorch – 更好的调试能力
- Keras – 可能不太需要调试简单的网络
Keras对比PyTorch:导出模型和跨平台可移植性
导出和部署训练好的模型有哪些选择?
PyTorch将模型保存为Pickles,基于Python且不可移植的,而Keras利用JSON H5文件,有更安全的方法(尽管在Keras中保存自定义层通常更困难)。如果你需要使用R语言与数据分析师团队进行协作,在R中也有Keras。
在Tensorflow上运行的keras通过TensorFlow for Mobile和TensorFlow Lite部署到移动平台。你可以使用TensorFlow.js或keras.js部署Web应用程序。例如:
https://github.com/cytadela8/trypophobia
由于由Python编码导出PyTorch模型更加费力,目前广泛推荐的方法是首先用ONNX将PyTorch模型转换Caffe2。
总结
- Keras – 更多的部署选项,更简单的模型导出。
KerasVSPyTorch:表现
唐纳德·克努特的名言:
在程序中设计中,不成熟的优化方案是万恶之源。
在大多数情况下,以速度基准的差异不应该成为选择框架的主要标准,特别是当它用于入门时。数据科学家的时间显然比GPU时间宝贵得多。而且,在学习时,性能瓶颈一般由实验失败,网络未优化和数据加载造成; 不取决于原始的框架的速度。然而,为了完整的比较,我们不得不谈到这个问题。我们推荐这两个比较:
- https://wrosinski.github.io/deep-learning-frameworks/
- https://github.com/ilkarman/DeepLearningFrameworks/
PyTorch速度与TensorFlow一样快,对于RNN可能更快。Keras一贯较慢。正如第一个比较的作者所指出的那样,高性能框架(即PyTorch和TensorFlow)的计算效率的提高在大多数情况下,会被快速的开发环境和Keras提供的易用性所压制。
总结
- 就训练速度而言,PyTorch优于Keras
Keras对比PyTorch:最后结论
Keras和PyTorch都是第一个学习的深度学习框架的绝佳选择。但是,如果你是一位数学家、研究人员或者倾向于理解你的模型真正在做什么,那么就考虑选择PyTorch。在需要更高级的定制(及其调试)(例如,用YOLOv3或LSTM with attention的对象检测),或者当我们需要优化除神经网络以外的数组表达式(例如,矩阵分解或word2vec算法)时,它真的很出色。
如果你需要即插即用的框架,Keras毫无疑问是更简单的选择:构建快,训练和评估模型也快,并且无需花费太多时间在数学实现细节上。