【TensorFlow】TensorFlow基础知识

在 TensorFlow 1.X 版本中, 必须 在导入 TensorFlow 库后调用 tf.enable_eager_execution() 函数以启用即时执行模式。在 TensorFlow 2 中,即时执行模式将成为默认模式,无需额外调用 tf.enable_eager_execution() 函数(不过若要关闭即时执行模式,则需调用 tf.compat.v1.disable_eager_execution() 函数)。

TensorFlow计算模型——计算图
TensorFlow是一个通过计算图的形式来表述计算的编程系统。TensorFlow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。
TensorFlow程序一般可以分为两个阶段。在第一个阶段需要定义计算图中所有的计算,第二个阶段为执行计算。以下给出计算定义阶段的样例:

import tensorflow as tf
a = tf.constant([1.0, 2.0], name='a')
b = tf.constant([2.0, 3.0], name='b')
result = a + b

计算图可以通过tf.Graph.device函数来指定运行计算的设备,这为temsorflow使用GPU提供了机制,以下程序可以将加法计算跑在GPU上:

g = tf.Graph()
with g.device('/gpu:0'):
	result = a + b

tensorflow数据类型——张量
张量在tennsorflow中的实现并不是直接采用数组的形式,它只是对tensorflow中运算结果的引用。在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程。

import tensorflow as tf
a = tf.constant([1.0, 2.0], name='a')
b = tf.constant([2.0, 3.0], name='b')
result = tf.add(a, b, name='add')
print result

输出
Tensor("add:0", shape=(2, ), dtype=float32)

张量和计算图上节点所代表的计算结果是对应的,张量的命名可以通过“node:src_output”的形式来给出。其中node为节点的名称,src_output表示当前张量来自节点的第几个输出。
如果不指定类型,tensorflow会给出默认的类型,不带小数点的数会被默认为int32,带小数点的数会默认为float32

张量的重要属性是其形状、类型和值。可以通过张量的 shape 、 dtype 属性和 numpy() 方法获得。例如:

A = tf.constant([[1., 2.], [3., 4.]])
print(A.shape)      # 输出(2, 2),即矩阵的长和宽均为2
print(A.dtype)      # 输出<dtype: 'float32'>
print(A.numpy())    # 输出[[1. 2.]
                    #      [3. 4.]]

tensorflow运行模型——会话
在tensorflow中,使用会话来执行定义好的运算。会话拥有并管理tensorflow程序运行时的所有资源,所有计算资源完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄漏的问题。
tensorflow中使用会话的模式一般有两种:

  • 需要明确调用会话生成函数和关闭会话函数:
# 创建一个会话
sess = tf.Session()
# 使用这个创建好的会话来得到运算的结果
sess.run(result)
# 关闭会话使得本次运行中使用到的资源可以被释放
sess.close()

当程序因为异常而退出时,关闭会话的函数可能不会被执行而导致资源泄漏。

  • 为了解决异常退出时资源释放的问题,tensorflow可以通过python的上下文管理器来使用会话:
# 创建一个会话,并用过python的上下文管理器来管理这个会话
with tf.Session as sess:
	sess.run(result)

# 当上下文退出时会话关闭和资源释放也自动完成了

通过python的上下文管理器的机制,只要将所有的计算放在with的内部就可以。当默认的会话被指定后,可以通过tf.Tensor.eval函数来计算一个张量的取值。

sess = tf.Session()
with sess.as_default():
	print(result.eval())
v = tf.constant([1.0, 2.0, 3.0])
print tf.log(v).eval()
# 输出 [0.     0.6931    1.0986]

以下代码也可以完成相同的功能:

sess = tf.Session()
# 以下两个命令有相同的功能
print(sess.run(result))
print(result.eval(session=sess))

可以通过ConfigProto Protocol Buffer来配置需要生成的会话

config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)
sess = tf.Session(config = config)

通过ConfigProto可以配置蕾丝并行的线程数、GPU分配策略、运算超时时间等参数。在这些参数中,最常使用的有两个:

  1. allow_soft_placement:当它为True时,GPU上的计算可以放到CPU上进行。这个参数的默认值为False,但是为了使得代码的可移植性更强,在有GPU的环境下这个参数一般会被设置成True。
  2. log_device_placement:当它为True时日志中将会记录每个节点被安排在哪个设备上以方便调试,而在生产环境中将这个参数设置为False可以减少日志量。

参考资料:
TensorFlow实战Google深度学习框架-中国公信出版集团

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值