本主题内容:体验Tensorflow的两种执行方式:
- Tensorflow的Eager(立即)运行方式
- Tensorflow的Graphs(图)运行方式
- Tensorflow提供两种数据处理方式
-
Eager
TensorFlow 的Eager执行是传统的编程方式,直接对实际的数据立即执行运算,操作会返回具体的值; -
Graphs
TensorFlow 的Graphs执行是类似泛型模板编程方式,先对数据与计算过程进行模板描述,然后对具体的数据进行实例化执行,并获取结果的方式。
Graphs的核心是构建图,图的主要元素是节点,Graphs中关键节点有两个:数据节点,运算节点。数据输入、处理、输出构成节点这几件的运算与数据流流[1],借用官方的一张示意图可以说明计算节点、数据节点与图:
-
Eager
-
Tensorflow引入了一些符号来表示图,截图说明如下:
-
准备
- 安装Tensorflow
pip install tensorflow -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
这是使用的是速度比较快的镜像站点,可以使用默认的官方站点。
- 在python程序中import模块
import tensorflow as tf
- 例子的计算任务描述
计算两个随机矩阵的内积()。
- 例子的计算任务描述
一、体验Eager执行方式
1、启动Eager执行模式
- 启动eager执行环境,并检测是否是eager执行环境,如果不是eager执行环境,则终止程序退出。
import sys import numpy as np import tensorflow as tf #1.开启eager执行方式 tf.enable_eager_execution() #2.判定当前是否是eager执行方式 if tf.executing_eagerly(): print("Eager执行方式") else: print("Graphs执行方式") sys.exit(-1)
2、Eager执行代码
- 在计算中使用了两个numpy数组(矩阵),运算调用的是tensorflow的内积计算函数matmul。
#实现eager执行方式 m1=np.random.uniform(0,1,(4,3)) m2=np.random.uniform(0,1,(3,2)) r=tf.matmul(m1,m2) print(r)
- 程序输出如下:
- 如果把eager模式代码注释掉,则运行结果如下:
在Graphs执行方式下,该怎样才能得到结果?下面使用来说明。
二、体验Graphs执行方式
- Graphs执行模式是别人设计好的,使用的时候需要按照设计来使用,用好Graphs就多看官方文档。
- 使用Graphs执行方式最大的好处,只要描述清楚数据与运算流程,细节都由API来执行(比如在Graphs模式下,感知器的训练中的激活函数与损失误差函数的导数都会交给API自动完成)。Eager传统模式,则需要关注所有细节(在Eager模式下,感知器的训练中,激活函数与误差损失函数都需要程序员处理)。
1.Graphs执行方式的模式
-
Graphs编程模式分成两步:
- (1)描述数据、运算以及运算流程。
- (2)构建运行会话环境,执行运算。
2.Graphs代码实现
-
描述数据,运算与运算流程
这里没有复杂的运算流程(通过函数的输入,输出形成数据与运算流程),可能不足以提现Graphs执行方式的强大。#1.描述图:数据节点,运行节点 #数据节点 m1=np.random.uniform(0,1,(4,3)) #数据节点 m2=np.random.uniform(0,1,(3,2)) #运算节点(r也算数据节点,通过matmul建立与m1、m2的数据与运算流 ) r=tf.matmul(m1,m2)
-
构建会话环境,执行运算
#2.构建会话执行环境,并执行图。 #构建会话对象 session=tf.Session() #使用会话初始化变量环境 init_op= tf.global_variables_initializer() #构建一个初始化器 session.run(init_op) #执行初始化器,并完成全局变量初始化 #执行运算 re=session.run(r) #返回结果 print(re)
-
完整代码
#coding=utf-8 import numpy as np import tensorflow as tf #1.描述图:数据节点,运行节点 #数据节点 m1=np.random.uniform(0,1,(4,3)) #数据节点 m2=np.random.uniform(0,1,(3,2)) #运算节点(r也算数据节点,通过matmul建立与m1、m2的数据与运算流 ) r=tf.matmul(m1,m2) #2.构建会话执行环境,并执行图。 #构建会话对象 session=tf.Session() #使用会话初始化变量环境 init_op= tf.global_variables_initializer() #构建一个初始化器 session.run(init_op) #执行初始化器,并完成全局变量初始化 #执行运算 re=session.run(r) #返回结果 print(re)
-
执行结果
【资源】
相关代码:
- t01_eager.py(体验eager执行方式)
- t01_graphs.py(体验graphs执行方式)
下载:【 代码(github) 】
-
[数据流]:是一种用于并行计算的常用编程模型。在数据流图中,节点表示计算单元(椭圆表示)与计算使用或产生的数据(矩形表示)。 ↩