【AI理论】深度学习笔记 | 第20讲:再谈三大深度学习框架TensorFlow、Keras和PyTorch
1
概述
我们先来看一张柱状图,图中显示了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这三大深度学习计算框架。
2
TensorFlow
作为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)
3
Keras
再来看Keras。
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)
4
PyTorch
最后是PyTorch。
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这三种深度学习计算框架,大家最好都要学习!
- 点赞
- 收藏
- 关注作者
评论(0)