【最新TensorFlow1.4.0教程01】TF1.4.0介绍与动态图机制 Eager Execution使用

【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工智能( 机器学习、自然语言处理、计算机视觉等)、大数据、编程语言、系统架构。使用请访问专知 进行主题搜索查看 - 桌面电脑访问http://www.zhuanzhi.ai, 手机端访问http://www.zhuanzhi.ai 或关注微信公众号后台回复" 专知"进入专知,搜索主题查看。随着TensorFlow 1.4 Eager Execution的出现,TensorFlow的使用出现了革命性的变化。专知为大家推出TensorFlow 1.4系列教程

  • 01:动态图机制Eager Execution
  • 02: 使用Eager Execution训练卷积神经网络
  • 待定

简介

近期PyTorch比较火,并不是因为PyTorch轮子多或者生态圈庞大,而是因为PyTorch可以构建动态图,即可以像正常程序一样去编写或者调试深度学习模型。1.4版本之前的Tensorflow一直被人诟病的一个问题就是它不具备构建动态图的能力。Tensorflow 1.4的Eager Execution在兼容老版本的基础上,提供了动态图以及其它的一些新特性,通俗地来说有下面几个特点:

  • 无需Placeholder和Feed,可以直接使用numpy作为输入
  • 可以立即执行Operation,例如输入图像数据(numpy),立即输出卷积结果,并将结果转换为numpy。即可以将老版本中定义静态图的Operation直接当做函数来立即执行一个Operation。(老版本需要先利用Operation定义静态图,然后到Session中执行不可变的静态图,并且获取Operation的结果需要通过sess.run()和feed,非常麻烦)。
  • 动态图特性使得Tensorflow可以使用python的if语句和循环语句来控制模型的结构,而不用通过tf.cond这种难用的函数来控制模型的解构。
  • 动态图特性使得模型更便于调试,模型的运行过程与代码的运行过程一致。而在老版本的静态图中,网络的forward与backward都是黑箱操作,想加个print来输出过程中的变量都很难。
  • 梯度的计算和更新也变成函数的调用,可由开发者自己调用。
  • 上述的Eager Execution特性的实现,只需在代码顶部加上下面两行代码即可,其他的操作均兼容老版本的API: import tensorflow.contrib.eager as tfetfe.enable_eager_execution()

安装

想体验1.4版Tensorflow的,可以用pip下载nightly build版本的Tensorflow:

  • CPU: pip install tf-nightly
  • GPU: pip install tf-nightly-gpu

注意,使用GPU版需要安装cuDNN 6以上的版本。在Windows上推荐使用conda(python3.5)+pip进行安装。

示例

下面用一些示例来展示Eager Execution为我们带来的礼物。

下面所有的示例都依赖下面的import:

import tensorflow as tfimport tensorflow.contrib.eager as tfeimport numpy as nptfe.enable_eager_execution()

示例1,直接使用Operation进行卷积操作

# 随机生成2个图像(batch_size=2),每个图像的大小为 28 * 28 * 3images = np.random.randn(2, 28, 28, 3).astype(np.float32)# 卷积核参数filter = tf.get_variable("conv_w0", shape = [5,5,3,20], initializer = tf.truncated_normal_initializer)# 对生成的batch_size=2的数据进行卷积操作,立即获得结果conv = tf.nn.conv2d(input = images, filter = filter, strides = [1,2,2,1], padding = 'VALID')# 用结果的numpy()方法可获得结果的numpy表示,显示其shapeprint(conv.numpy().shape)

运行结果如下,成功获得卷积后结果的大小。

(2, 12, 12, 20)

示例2,自动计算梯度

x*x + 40自动求导:

grad = tfe.gradients_function(lambda x: x * x + 4.0)print(grad(10))print(grad(5))

计算结果:

[<tf.Tensor: id=11, shape=(), dtype=int32, numpy=20>]
[<tf.Tensor: id=22, shape=(), dtype=int32, numpy=10>]

可以看到,输入为10和5时的导数为20和10。

示例3,使用Python的程序流程控制模型的流程

自己动手实现leaky relu激活函数:

def leaky_relu(x):
    if x < 0:
        return x * 0.1
    else:
        return xgrad = tfe.gradients_function(leaky_relu)print(grad(4.0))print(grad(-3.0))

代码运行记结果如下:

[<tf.Tensor: id=9, shape=(), dtype=float32, numpy=1.0>]
[<tf.Tensor: id=21, shape=(), dtype=float32, numpy=0.1>]

结果中的1.0和0.1分别是leaky relu对于输入4和-3的梯度。可以看出,leakly relu需要条件语句来控制流程,上面代码在老版本TensorFlow里是不可行的,因为条件语句的判断会发生在定义静态图的阶段,而定义静态图的阶段连输入数据是啥都不知道。

示例4,自动优化

w = tf.get_variable("w", initializer = 3.0)def loss(x):
    return x * woptimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)for i in range(5):
    optimizer.minimize(lambda: loss(5))
    print(w.numpy())

运行结果如下,可以看出变量w的值在不断被更新,以减小loss的值

2.5
2.0
1.5
1.0
0.5

分布式和多GPU

TensorFlow的Github上对于Eager Execution的描述如下:

This feature is in early stages and work remains to be done in terms of smooth support for distributed and multi-GPU training and CPU performance.

意思是说,Eager Execution仍然是一个新特性,对于分布式训练、多GPU训练和CPU的性能,仍有很多的工作可做。对于想使用分布式训练的朋友来说,还是老老实实先用TensorFlow的静态图吧。下面这段引用描述了TensorFlow的分布式运行方法:

TensorFlow是Google开源的基于神经网络的深度学习引擎,可以支持分布式运行。通常构建单一的包含了一系列参数的图, 并且创建多个模型的副本来映射到不同tasks。每个model的副本有一个不同的train_op,并且对于每个Worker service而言一个或者多个的客户端线程可以调用sess.run(train_ops[i])。这种方法只使用了单一的tf.Session,它的工作目标是集群中的某个workers。而另一种分布式训练器的方法使用多张图,一张图对应一个worker,并且每张图都包含了一系列的参数的集合和一份模型的赋值。而容器的机制就是在不同的图之间共享变量:一旦某个变量构造完成,可选的container参数会由图中每份复制的相同值来决定。对于较大的模型而言,这种方法会更加有效,毕竟整个图更小了一点。这种方法就需要使用多个tf.Session对象:每个worker过程都会包含一个,不过不同的Session会指向不同的目标worker。这个tf.Session对象即可以在单一的Python客户端中创建,也可以在多个客户端中创建。

性能

国外一些人在博客里公布了一些Eager Execution和PyTorch的对比,总的来说,就是目前TensorFlow的Eager Execution特性并不是特别理想,但正如上面所说,Eager正处于非常初级的阶段,相信Google可以很快地将Eager特性完善。

原文发布于微信公众号 - 专知(Quan_Zhuanzhi)

原文发表时间:2017-11-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能LeadAI

毫秒级检测!你见过带GPU加速的树莓派吗?

86910
来自专栏磐创AI技术团队的专栏

Tensorboard 详解(上篇)

2413
来自专栏Java进阶架构师

dubbo源码解析-详解LoadBalance

终于到了集群容错中的最后一个关键词,也就是LoadBalance(负载均衡),负载均衡必然会涉及一些算法.但是也不用太担心,算法这个词虽然高大上,但是算法也有简...

1643
来自专栏CreateAMind

开源|MultiNet模型解决Kitti数据集自动驾驶中的道路分割、车辆检测和街道分类(附源代码)

MultiNet能够同时完成道路分割、汽车检测和道路分类的任务。MultiNet模型的实时存档速度和分割性能都处于最先进水平。详细的模型描述请查阅我们的论文。

2793
来自专栏北京马哥教育

手把手教你用 1 行命令实现人脸识别

? 人脸识别很难吗? -- Kangvcar 本文导航 ◈ 环境要求00% ◈ 环境搭建03% ◈ 实现人脸识别19% ◈ 示例一(1 行命令实现人脸识别):...

3636
来自专栏PPV课数据科学社区

手把手教你用1行代码实现人脸识别 -- Python Face_recognition

环境要求: Ubuntu17.10 Python 2.7.14 环境搭建: 1. 安装 Ubuntu17.10 > 安装步骤在这里 2. 安装 Python2....

4388
来自专栏简书专栏

基于xgboost的波士顿房价预测kaggle实战

2018年8月24日笔记 这是作者在波士顿房价预测项目的第3篇文章,在查看此篇文章之前,请确保已经阅读前2篇文章。 第2篇文章链接:https://www....

2K3
来自专栏梦里茶室

毫秒级检测!你见过带GPU的树莓派吗?

树莓派3B+英特尔神经计算棒进行高速目标检测 转载请注明作者梦里茶 ? 代码: 训练数据预处理: https://gist.github.com/ahan...

4.5K8
来自专栏专知

Tensorflow Eager Execution入门指南

本文介绍了最新版的Tensorflow 1.7的功能及其使用方法,重点介绍其中最有趣的功能之一eager_execution,它许用户在不创建静态图的情况下运行...

55813
来自专栏ATYUN订阅号

自定义对象检测问题:使用TensorFlow追踪星球大战中的千年隼号宇宙飞船

大多数的大型科技公司(如IBM,谷歌,微软,亚马逊)都有易于使用的视觉识别API。一些规模较小的公司也提供类似的产品,如Clarifai。但没有公司能够提供对象...

4835

扫码关注云+社区

领取腾讯云代金券