TensorFlow还是Keras?深度学习框架选型指南

2018 年 3 月 24 日 论智 Askash Nain
作者:Aakash Nain
编译:weakish

编者按:到底该选择TensorFlow还是Keras,是深度学习初学者经常纠结的一个问题。数据科学家Aakash Nain比较了TensorFlow和Keras,希望有助于选择合适的框架。

深度学习库/框架流行度(来源:Google)

深度学习无处不在,大量的深度学习库让初学者无所适从。这篇文章重点关注TensorlFlowKeras两者之间的选择。TensorFlow是最著名的用于深度学习生产环境的框架。它有一个非常大非常棒的社区。然而,TensorFlow的使用不那么简单。另一方面,Keras是在TensorFlow基础上构建的高层API,比TF(TensorFlow的缩写)要易用很多。

既然Keras基于TensorFlow,那么两者有何区别?既然Keras对用户更友好,为什么我还需要使用TF来构建深度学习模型呢?下面一些内容将帮助你做出选择。

快速开发原型

如果你想快速创建、测试一个神经网络,写尽可能少的代码,那么选择Keras。花不了多少分钟,你就能用Keras创建简单或很复杂的神经网络。ModelSequential API如此强大,基本上能做到你可能想要做的任何事情。让我们看一个例子吧:

  
    
    
    
  1. model = Sequential()

  2. model.add(Dense(32, activation='relu', input_dim=100))

  3. model.add(Dense(1, activation='sigmoid'))

  4. model.compile(optimizer='rmsprop',

  5.              loss='binary_crossentropy',

  6.              metrics=['accuracy'])

  7. # 生成虚假数据

  8. import numpy as np

  9. data = np.random.random((1000, 100))

  10. labels = np.random.randint(2, size=(1000, 1))

  11. # 训练模型,迭代数据(每个batch包含32个样本)

  12. model.fit(data, labels, epochs=10, batch_size=32)

收工!!就是这么容易!

没有人不喜欢Pythonic!!

Keras的开发设计注重用户友好,因而某种意义上它更加pythonic。模块化是Keras的另一个优雅的设计指导原则。Keras中的任何东西都可以表示为模块,用户可以根据需要将其进一步组合。

弹性

有时候你不想用现成的东西,想要自己定义一些东西(比如,损失函数、测度、网络层,等等)。

尽管Keras 2的设计让你可以实现几乎所有你想要的东西,但是我们都知道底层的库提供了更多弹性。TF同样如此。相比Keras,TF允许你进行更多调整。

功能性

尽管Keras提供了创建深度学习模型一般所需的所有功能性,它还是不如TF提供得多。相比Keras,TensorFlow提供更多高级操作。当你从事研究或开发特殊种类的深度学习模型时,这一点是十分便利的。下面是一些例子:

线程和队列

队列是一个强大的机制,可以异步地计算图中的张量。类似地,你可以使用多个线程执行同一会话,通过并行运算加速操作。下面是一个在TensorFlow中使用队列和线程的简单例子:

  
    
    
    
  1. # 创建图,等等。

  2. init_op = tf.global_variables_initializer()

  3. # 创建会话,以运行图中的操作。

  4. sess = tf.Session()

  5. # 初始化变量(比如epoch计数器)

  6. sess.run(init_op)

  7. # 开始输入入队线程。

  8. coord = tf.train.Coordinator()

  9. threads = tf.train.start_queue_runners(sess=sess, coord=coord)

  10. try:

  11.    while not coord.should_stop():

  12.        # 运行训练步骤,等等

  13.        sess.run(train_op)

  14. except tf.errors.OutOfRangeError:

  15.    print('训练完毕——达到epoch限制')

  16. finally:

  17.    # 结束时,请求停止线程

  18.    coord.request_stop()

  19. # 等待线程终止。

  20. coord.join(threads)

  21. sess.close()

调试器

TensorFlow有一个专门的调试器,为内部结构和正在运行的TensorFlow图的状态提供了可见性。从调试器获得的洞见可以加速调试训练和推断阶段的多种bug。

TensorFlow调试器截屏(来源:TensorFlow文档)

控制

就我的经验而言,你对神经网络的控制越多,你对神经网络在做什么的理解就更深。TF让你可以更多地控制神经网络。在TF中对权重和梯度进行操作有如神助。

例如,假设你的模型有三个变量,比如wbstep,你可以选择变量step是否可以训练。你只需写一行代码就可以办到:

  
    
    
    
  1. step = tf.Variable(1, trainable=False, dtype=tf.int32)

在训练阶段,梯度可以提供大量信息。你想控制梯度?当然可以,看下面的例子:

  
    
    
    
  1. # 创建优化器

  2. optimizer = GradientDescentOptimizer(learning_rate=0.1)

  3. # 为一组变量计算梯度

  4. grads_and_vars = opt.compute_gradients(loss, <list of variables>)

  5. # grads_and_vars是一个元组的列表(梯度, 变量)。

  6. # 你可以随意对梯度部分进行操作,比如,每项减1.

  7. subtracted_grads_and_vars = [(gv[0] - 1.0, gv[1]) for gv in grads_and_vars]

  8. # 请求优化器应用减一后的梯度。

  9. optimizer.apply_gradients(subtracted_grads_and_vars)

(以上代码样例取自 CS 20SI: TensorFlow for Deep Learning Research)

结论(TL;DR)

除非你正从事研究性质的工作或开发某种特殊种类的神经网络,选择Keras(相信我,我是一个Keras党!!)使用Keras快速构建非常复杂的模型仍然超容易。

如果你想要更精细地控制你的网络,或者想要仔细查看你的网络发生了什么,那么TF是正确的选择(不过有时TF的语法会让你做噩梦的)。不过,现在TF已经集成了Keras,所以更明智的做法是使用tf.contrib.Keras创建你的网络,然后根据需要在你的网络中插入纯TensorFlow。简而言之,

tf.contrib.keras +tf =你所需要的一切

登录查看更多
5

相关内容

Sklearn 与 TensorFlow 机器学习实用指南,385页pdf
专知会员服务
129+阅读 · 2020年3月15日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
【模型泛化教程】标签平滑与Keras, TensorFlow,和深度学习
专知会员服务
20+阅读 · 2019年12月31日
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
188+阅读 · 2019年12月28日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
163+阅读 · 2019年10月28日
PyTorch  深度学习新手入门指南
机器学习算法与Python学习
9+阅读 · 2019年9月16日
盘一盘 Python 系列 10 - Keras (上)
平均机器
5+阅读 · 2019年8月26日
TF Boys必看!一文搞懂TensorFlow 2.0新架构!
引力空间站
18+阅读 · 2019年1月16日
【干货】基于Keras的注意力机制实战
专知
59+阅读 · 2018年5月4日
Tensorflow 文本分类-Python深度学习
Python程序员
12+阅读 · 2017年11月22日
干货|7步掌握基于Keras的深度学习!
全球人工智能
4+阅读 · 2017年11月14日
Pytorch还是Tensorflow?英伟达工程师帮你总结了
人工智能头条
5+阅读 · 2017年10月27日
教程 | 如何从TensorFlow转入PyTorch
深度学习世界
38+阅读 · 2017年9月30日
深度学习实战(二)——基于Keras 的深度学习
乐享数据DataScientists
15+阅读 · 2017年7月13日
Bivariate Beta LSTM
Arxiv
5+阅读 · 2019年10月7日
Learning Recommender Systems from Multi-Behavior Data
Arxiv
7+阅读 · 2018年11月29日
Arxiv
8+阅读 · 2018年5月15日
Arxiv
6+阅读 · 2018年3月28日
Arxiv
19+阅读 · 2018年3月28日
Arxiv
4+阅读 · 2016年12月29日
VIP会员
相关VIP内容
相关资讯
PyTorch  深度学习新手入门指南
机器学习算法与Python学习
9+阅读 · 2019年9月16日
盘一盘 Python 系列 10 - Keras (上)
平均机器
5+阅读 · 2019年8月26日
TF Boys必看!一文搞懂TensorFlow 2.0新架构!
引力空间站
18+阅读 · 2019年1月16日
【干货】基于Keras的注意力机制实战
专知
59+阅读 · 2018年5月4日
Tensorflow 文本分类-Python深度学习
Python程序员
12+阅读 · 2017年11月22日
干货|7步掌握基于Keras的深度学习!
全球人工智能
4+阅读 · 2017年11月14日
Pytorch还是Tensorflow?英伟达工程师帮你总结了
人工智能头条
5+阅读 · 2017年10月27日
教程 | 如何从TensorFlow转入PyTorch
深度学习世界
38+阅读 · 2017年9月30日
深度学习实战(二)——基于Keras 的深度学习
乐享数据DataScientists
15+阅读 · 2017年7月13日
Top
微信扫码咨询专知VIP会员