TensorFlow核心概念及基本使用
TensorFlow核心概念
综述:TensorFlow中的计算可以表示为一个有向图,或称计算图,其中每一个运算操作将作为一个节点,节点间的链接叫做边。这个计算图描述了数据的计算流程,它也负责维护和更新状态,用户可以对计算图的分支进行条件控制和循环操作。计算图中的每一个节点可以有任意多个输入和输出,每一个节点描述了一种运算操作,节点可以算是运算操作的实例化。在计算图的边中流动的的数据被称为张量。
1.计算图
TensorFlow是一个通过计算图的形式来表述计算的编程系统。每一个计算都是计算图的一个节点,而节点间的边描述了计算之间的依赖关系。
a.不同的图上的张量与运算不会共享(每个图中的数据类似于一个代码块中的局部变量),因此可以用计算图来隔离张量和计算,它还提供了管理张量和计算的机制(指定运算进行的设备)。
b.计算图还有个重要的功能是有效地整理TensorFlow程序中的资源。在一个计算图中可以通过集合(collection)来管理不同类别的资源。
2.TensorFlow的数据模型-张量(Tensor)
TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通.
a.TensorFlow计算的结果不是一个具体的数字,而是一个张量结构。一个张量主要保存了三个属性:名字(name)、维度(shape)和类型(type)。
eg:print (result)
输出:
Tensor("add:0", shape=(2,), dtype=float32)
b.张量有两大用途:
对中间计算结果的引用。当一个计算包含很多中间结果时,使用张量可大大提高代码的可读性。
用来获得计算结果。虽张量本身没有储存具体的数字,但可通过tf.Session().run(...)语句得到计算结果。
3.TensorFlow的运行模型-会话(Session)
会话(Session)用来执行定义好的运算。会话拥有并管理TensorFlow程序运行时的所有资源。当所有计算完成后需关闭会话来帮助系统回收资源。使用会话的方式一般有两种:
(1)sess = tf.Session()
sess .run(...)
sess.close()
//因异常退出可能会未执行关闭会话的语句
(2)with tf.Session() as sess:
sess.run(...)
//执行完自动关闭会话
(3)在交互式环境中,通过设置默认会话的方式来获取张量的取值会更加方便。
sess = tf.TnteractiveSession()
sess.close()
无论使用哪种方法都可以通过ConfigProto Protocol Buffer来配置需要生成的会话。通过ConfigProto可以配置类似并行的线程数、GPU分配策略、运算超时时间等参数。
4.变量
变量是一类特殊的运算操作,它可以将一些需要保留的tensor储存在内存或显存中,比如神经网络中的系数。当训练模型时,用变量来存储和更新参数。通常会将一个统计模型中的参数表示为一组变量. 例如, 你可以将一个神经网络的权重作为某个变量存储在一个 tensor 中. 在训练过程中, 通过重复运行训练图, 更新这个 tensor.
变量的作用就是保存和更新以及使用神经网络中的参数。
在神经网络中,给参数赋予随机初始值最为常见,所以一般也使用随机数给TensorFlow中的变量初始化。下面是两个例子:
1.#将特征向量定义为一个常量,这里是一个1×2的矩阵
x = tf.constant([[0.7,0.9]])
2.#声明w1变量,还通过seed参数设定了随机种子,这样可以保证每次运行的结果是一样的。
w1 = tf.Variable(tf.random_normal((2,3), stddev=1, seed=1))
虽然在变量的定义时给出了变量初始化的方法,但这个方法并没有被真正运行。所以在计算结果前,需要运行下面语句来初始化变量,为变量赋值。
sess.run(w1.initializer)
但当变量数目增多,或者变量之间存在依赖关系时,单个调用变量初始化过程就比较麻烦。TensorFlow提供了一种更为便捷的方式来完成变量的初始化过程。
init_op = tf.global_variables_initializer()
sess.run(init_op)
该函数实现初始化所有变量的过程并自动处理变量之间的依赖关系。
5.神经网络优化的简单框架
1.前向传播算法
提取的特征向量通过连接节点边的权重计算,在对应节点求得加权和作为中间的张量,然后依次向后一层按相同的方式传播,最终得到的输出节点上的加 权和为输出结果。前向传播算法可得到当前的预测值。
2.损失函数
损失函数用于刻画当前预测值与真实答案之间的差距,评价学习的情况好坏的标准,其重要性不言而喻。具体的介绍在后面文章总结。
3.反向传播算法
反向传播算法用于更新变量,既各层的权重,是训练神经网络的核心算法,它可以根据定义好的损失函数优化神经网络中参数的取值,从而使神经网络模 型在训练数据集上的损失函数达到一个最小值。反向传播算法给出了一个高效的方法在所有参数上使用梯度下降算法。梯度下降算法总结在下文。
TensorFlow的基本使用
1.构建图
import tensorflow as tf
# 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点
# 加到默认图中.
# 构造器的返回值代表该常量 op 的返回值.
matrix1 = tf.constant([[3., 3.]])
# 创建另外一个常量 op, 产生一个 2x1 矩阵.
matrix2 = tf.constant([[2.],[2.]])
# 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入.
# 返回值 'product' 代表矩阵乘法的结果.
product = tf.matmul(matrix1, matrix2)
2.在一个会话中启动图
这个使用在上一点会话中有提到的两种方法。