TensorFlow 1.X 简单入门

TensorFlow是一个基于数据流编程的符号数学系统,被广泛应用于各类机器学习算法的实现。“TensorFlow”这一名字很好地说明了TensorFlow的主要特点或者说概念。Tensor,中文为“张量”,可以简单理解为多维数组,其直接表明了TensorFlow的数据模型;Flow,中文为“流”,其形象地表达了张量在操作之间转化、传递的过程。该过程由TensorFlow中的计算图表示,即计算任务。此外,TensorFlow将计算任务的定义和执行分开,使得其更灵活强大。具体地,TensorFlow使用会话(Session)来执行计算图。综上所示,TensorFlow具有以下几大特点:

  1. 使用张量表示数据
  2. 使用计算图表示任务
  3. 使用会话执行计算图
1. TensorFlow数据模型——张量

张量可以简单理解为多维数组,其中零阶张量表示标量,一阶张量表示向量,二阶张量表示矩阵,以此类推。例如,我们可以将一个图像表示为一个三维数组 [height, width, channel]。

张量在TensorFlow中并非直接以数组的形式实现,其只是对TensorFlow中运算结果的引用。话句话说,张量中并未真正保存数字,其保存的是如何得到这些数字的计算过程。例如:

import tensorflow as tf

# tf.constant是一个计算,这个计算的结果为一个张量,保存在变量v_1中。
v_1 = tf.constant([1.0, 2.0])
v_2 = tf.constant([2.0, 3.0])
result = tf.add(v_1, v_2)
print (result)

# 输出一个张量结构
Tensor("add:0", shape=(2,), dtype=float32)

从上面结果可以看出,一个张量主要保存了三个属性:

  1. 名字(name):名字属性不仅是一个张量的唯一标识符,其也给出了这个张量是如何计算出来的。其形式为“node:src_output”,其中“node”为计算图中计算节点的名称,代表一个计算;“src_output”表示当前张量来自节点的第几个输出。如上所示,“add:0”说明result所表示的张量是计算节点“add”的第一个输出结果(编号从0开始)
  2. 维度(shape):维度属性描述了一个张量的维度信息。如上所示,“shape=(2,)”表示张量result是一个一维张量,且该维度上的长度为2。如果将上面代码修改为“v_1 = tf.constant(1.0)”,“v_2 = tf.constant(2.0)”,那么result的维度信息为“shape=()”
  3. 类型(type):类型属性指定了一个张量的数据类型。TensorFlow会对所有参与运算的张量进行检查,当发现类型不匹配时就会报错,如下所示:
import tensorflow as tf

v_1 = tf.constant([1, 2])
v_2 = tf.constant([2.0, 3.0])
result = v_1 + v_2

# 报错
Tensor conversion requested dtype int32 for Tensor with dtype float32: 'Tensor("v_2_2:0", shape=(2,), dtype=float32)'

因为张量v_1的数据不带小数点,TensorFlow默认其为int32,所以造成数据不匹配。

张量的用途主要是对中间计算结果的引用,提升代码可读性,并方便获取(中间)结果

2. TensorFlow计算模型——计算图

计算图描述了计算任务的计算过程。图中的节点被称为op(operation的缩写),表示一个运算操作/计算,其结果与张量一一对应;而节点之间的边描述了计算之间的依赖关系。下图展示了上述第一个代码块对应的计算图:
在这里插入图片描述
定义一个计算图也就是定义计算所需要的数据(张量)和计算。在TensorFlow中,系统会自动维护一个默认的计算图,从而自动将定义的计算转化为计算图上的节点,因此一般无需我们手动指定。但是,定义好计算图并不意味着我们可以直接得到我们想要的计算结果。在TensorFlow中,计算任务的定义和执行分开,计算图需要通过会话来执行。

TensorFlow中的计算图不仅可以用来隔离张量和计算,还可以管理张量和计算,如指定计算运行的设备。

3. TensorFlow运行模型——会话

TensorFlow中会话负责执行定义好的计算图。会话拥有并管理TensorFlow程序运行时的所有资源。所有计算完成之后需要关闭会话来帮助系统回收资源,否则可能会出现资源泄露的问题。不同于计算图,TensorFlow不会自动生成默认的会话,而是需要手动指定。TensorFlow使用会话的方式一般有以下两种:

  1. 明确调用会话生成函数和会话关闭函数
# 生成会话
sess = tf. Session()

# 使用创建的会话执行计算图,得到想要的计算结果。比如可以通过sess.run(result)来得到上面第一个代码块中的result的数值
sess.run(...)

# 关闭会话
sess.close()

该方式下,程序需明确调用Session.close函数来关闭会话,从而释放资源。但是当程序因为异常而退出时,关闭会话的函数可能就不会被执行,从而导致资源泄露。为解决此问题,可以通过第二种方式来使用会话。

  1. 通过Python的上下文管理器来使用会话
# 生成会话,并通过Python的上下文管理器来管理
with tf.Session() as sess:
	sess.run(...)

该方式下,只要将所有的计算都放在“with”内部就可以,程序无需再调用Session.close函数来关闭会话,因为当上下文退出时,会话会被自动关闭,资源从而被自动释放。

以下几个命令具有相同的计算张量取值的功能:

import tensorflow as tf

v_1 = tf.constant([1.0, 2.0])
v_2 = tf.constant([2.0, 3.0])
result = v_1 + v_2

sess = tf.Session()
print(sess.run(result))
print(result.eval(session=sess))

sess.close()

# 上面两个命名均输出[3. 5.]
[3. 5.]
[3. 5.]

如果利用“with sess.as_default()”将上面的“sess”注册为默认会话,那么“eval()”就不需要传入指定的会话,如下所示:

import tensorflow as tf

v_1 = tf.constant([1.0, 2.0])
v_2 = tf.constant([2.0, 3.0])
result = v_1 + v_2

sess = tf.Session()
with sess.as_default():
    print (result.eval())

#输出[3. 5.]
[3. 5.]

在交互式环境下(比如Python脚本或者Jupyter Notebook),通过设置默认会话的方式来获取张量的取值更加方便。因此,TensorFlow提供了一种在交互式环境下直接构建默认会话的函数,即“tf.InteractiveSession”。该函数会自动将生成的会话注册为默认会话,如下所示:

import tensorflow as tf

v_1 = tf.constant([1.0, 2.0])
v_2 = tf.constant([2.0, 3.0])
result = v_1 + v_2

sess = tf.InteractiveSession()
print (result.eval())

sess.close()

#输出[3. 5.]
[3. 5.]

Reference

[1] TensorFlow:实战Google深度学习框架(第二版)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值