深度学习第59讲:再谈深度学习三大计算框架TensorFlowKeras和PyTorch
Posted 机器学习实验室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习第59讲:再谈深度学习三大计算框架TensorFlowKeras和PyTorch相关的知识,希望对你有一定的参考价值。
笔者的系列文章写到这里,主要内容基本上就讲差不多了,但在第59讲,笔者想再单独和大家讨论一下深度学习的框架问题,其实在系列文章的第7、17和23讲,分别对深度学习主流的三大计算框架TensorFlow、Keras和PyTorch进行了入门级的讲解:
作为本系列的一次总结也好,作为后来人学习深度学习的建议也好,笔者要在这篇文章里对深度学习的计算框架进行一个简单的概述。
我们先来看一张柱状图,图中显示了2018年各主要深度学习框架的综合得分排名情况:
数据来源:https://www.kaggle.com/discdiver/deep-learning-framework-power-scores-2018
可以看到:TensorFlow、Keras和PyTorch这三种框架分别位于排行榜前三位,其他小众框架则影响力微弱,比如Theano虽然历史悠久、但实在是太老了,开发团队早已停止开发和维护了;MxNet虽然不错,亚马逊也在用,但相较于前三个确实小众了很多;CNTK是微软推出的深度学习计算框架,但一直一来所获得的关注度也很有限;至于Caffe,由于其本身是由C++编写,也提供了Python接口,但在最新的更新Caffe2中已经被整合进了PyTorch里面去了,所以直接用PyTorch替代即可。正是由于上述原因,笔者这里选择TensorFlow、Keras和PyTorch作为本篇概述的主要内容。
对于初次踏入深度学习的人员而言,选择哪一门计算框架是一个值得思考的问题,包括笔者自己也有这样的疑问。通过笔者这大半年以来的学习经验,我想说的是,如果是一定要选出一个框架作为你的深度学习入门工具,我建议是Keras,Keras具备搭建神经网络各个零部件高度集成的API,对新手非常友好,基于Keras进行一次快速的深度学习试验几乎是分分钟的事情。相对熟练之后我的建议是不要继续停留在Keras的舒适区,你应该继续学习其他计算框架,无论是流行度第一的TensorFlow还是异军突起的PyTorch,你都得学,包括笔者自己,现在也在跟着PyTorch的文档在深入学习。假如你只学了TensorFlow,有一个你非常感兴趣的深度学习项目,结果对方是用PyTorch写的,如果你一点也不懂PyTorch,岂不是很尴尬,再说PyTorch在2018年下半年在一段时间内的热度已经赶超TensorFlow了。
所以对于框架而言,笔者的建议在于:先选一门Keras作为入门,熟练之后直接学习TensorFlow和PyTorch,理论结合实践,多动手,相信对于学习深度学习而言,工具不会是大问题。
下面我们就再次单独来看一下TensorFlow、Keras和PyTorch这三大深度学习计算框架。
作为Google开发维护的深度学习工具,TensorFlow应该是目前最为流行和使用率最高的深度学习计算框架了。它是用C ++ / Python编写的,提供Python,R、Java,Go和javascript API。TensorFlow使用静态计算图,尽管最近发布的TensorFlow Fold库也增加了对动态图的支持。此外,从版本1.7开始,TensorFlow在动态执行方面采取了不同的步骤,并实现了可以立即评估Python代码的急切执行,而无需构建图形。
另外TensorFlow也有着非常好的社区环境支持,你可以轻易的从网上找到很多有关TensorFlow使用教程、视频,在线课程和教程等等。除了纯粹的计算功能外,TensorFlow还提供了TensorBoard这样的性能监控工具,它可以显示计算图,绘制关于模型训练或推理执行的量化指标,并基本上提供调试和微调深度神经网络所需的各种信息。
TensorFlow虽然很棒,但对于初学者来说并不友好,初学者用TensorFlow来搭建神经网络需要一个思维转变,总体来说TensorFlow没那么容易。
基于TensorFlow搭建神经网络的简单例子:
import numpy as np
import tensorflow as tf data_size = 10
input_size = 28 * 28
hidden1_output = 200
output_size = 1
data = tf.placeholder(tf.float32, shape=(data_size, input_size)) target = tf.placeholder(tf.float32, shape=(data_size, output_size)) h1_w1 = tf.Variable(tf.random_uniform((input_size, hidden1_output))) h2_w1 = tf.Variable(tf.random_uniform((hidden1_output, output_size))) hidden1_out = tf.maximum(tf.matmul(data, h1_w1), 0) target_ = tf.matmul(hidden1_out, h2_w1) loss = tf.losses.mean_squared_error(target_, target) opt = tf.train.GradientDescentOptimizer(1e-3) upd = opt.minimize(loss)with tf.Session() as sess: sess.run(tf.global_variables_initializer()) feed = {data: np.random.randn(data_size, input_size), target: np.random.randn(data_size, output_size)}
for step in range(100): loss_val, _ = sess.run([loss, upd], feed_dict=feed)
Keras是一个高层神经网络API,Keras由纯Python编写而成并基TensorFlow、Theano以及CNTK后端。所以我们也可以直接使用TensorFlow调用Keras。Keras 为支持快速实验而生,能够把你的想法迅速转换为结果,Keras的主要优点如下:
简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)
支持CNN和RNN,或二者的结合
无缝CPU和GPU切换
Keras非常易于学习和使用。无论是初学者还是不打算进行复杂研究的高级深度学习研究员,笔者都建议你使用Keras。Keras的设计原则:
用户友好:用户的使用体验始终是我们考虑的首要和中心内容。Keras遵循减少认知困难的最佳实践:Keras提供一致而简洁的API, 能够极大减少一般应用下用户的工作量,同时,Keras提供清晰和具有实践意义的bug反馈。
模块性:模型可理解为一个层的序列或数据的运算图,完全可配置的模块可以用最少的代价自由组合在一起。具体而言,网络层、损失函数、优化器、初始化策略、激活函数、正则化方法都是独立的模块,你可以使用它们来构建自己的模型。
易扩展性:添加新模块超级容易,只需要仿照现有的模块编写新的类或函数即可。创建新模块的便利性使得Keras更适合于先进的研究工作。
与Python协作:Keras没有单独的模型配置文件类型(作为对比,caffe有),模型由python代码描述,使其更紧凑和更易debug,并提供了扩展的便利性。
将前面TensorFlow的例子再用Keras写一遍如下:
import numpy as np
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD data_size = 10
input_size = 28 * 28
hidden1_output = 200
output_size = 1
data = np.random.randn(data_size, input_size) target = np.random.randn(data_size, output_size) model = Sequential() model.add(Dense(hidden1_output, input_shape=(input_size,), activation=tf.nn.relu)) model.add(Dense(output_size)) model.compile(loss='mean_squared_error', optimizer=SGD(lr=1e-3)) model.fit(data, target, epochs=100, batch_size=data_size)
PyTorch是一款可以媲美于 TensorFlow 优秀的深度学习计算框架,但又相比于 TensorFlow 在语法上更具备灵活性。PyTorch原生于一款小众语言lua,而后基于python 版本后具备了强大的生命力。作为一款基于 python 的深度学习计算库,PyTorch提供了高于 numpy 的强大的张量计算能力和兼具灵活度和速度的深度学习研究功能。
PyTorch已经于今年10月份发布了1.0版本,标识着PyTorch正式走向了稳定可用阶段。在最新的 ICLR 2019 提交论文中,提及TensorFlow的论文数量从228升到了266,而提及PyTorch的论文数量从 2018 年的 87 激增到了252。这也从侧面说明PyTorch影响力今非昔比。
基于PyTorch搭建神经网络示例:
import torch
import torch.nn as nn
import torch.nn.functional as fun data_size = 10
input_size = 28 * 28
hidden1_output = 200
output_size = 1
data = torch.randn(data_size, input_size) target = torch.randn(data_size, output_size) model = nn.Sequential( nn.Linear(input_size, hidden1_output), nn.ReLU(), nn.Linear(hidden1_output, output_size) ) opt = torch.optim.SGD(model.parameters(), lr=1e-3)
for step in range(100): target_ = model(data) loss = fun.mse_loss(target_, target) loss.backward() opt.step() opt.zero_grad()
最后的结论就是:对于TensorFlow、Keras和PyTorch这三种深度学习计算框架,大家最好都要学习!
参考资料:
https://www.jiqizhixin.com/articles/deep-learning-framework-scores-2018
https://keras-cn.readthedocs.io/en/latest/
https://medium.com/neuromation-io-blog/neuronuggets-an-overview-of-deep-learning-frameworks-8e5c164ce012
往期精彩:
一个数据科学从业者的学习历程
长按二维码.关注机器学习实验室
以上是关于深度学习第59讲:再谈深度学习三大计算框架TensorFlowKeras和PyTorch的主要内容,如果未能解决你的问题,请参考以下文章
最新深度学习框架Tensorflow学习与应用附软件代码讲义
书单丨5本书上手三大深度学习框架:TensorFlowKerasPyTorch
节日福利丨5本书上手三大深度学习框架:TFKerasPyTorch
深度学习100例 | 第2例:人脸表情识别 - PyTorch实现