我爱编程

TensorFlow入门(笔记)

2018-04-22  本文已影响38人  独立开发者Lau

本篇介绍TensorFlow基本概念。前三节分别介绍TensorFlow的计算模型、数据模型和运行模型。最后一节,简单介绍了神经网络的主要计算流程,以及如何通过TensorFlow实现这些计算。

1 TensorFlow计算模型---计算图
计算图是TensorFlow中最基本的一个概念,TensorFlow中的所有计算都会被转化为计算图上的节点。两节点之间的边描述了计算之间的依赖关系。
TensorFlow程序分两个阶段:定义计算图中所有的计算、执行计算。
TensorFlow会自动将定义的计算转化为计算图上的节点。程序中,系统会自动维护一个默认的计算图,通过tf.get_default_graph函数可以获取当前默认的计算图。
如:print(a.graph is tf.get_default_graph())。
除了使用默认的计算图,TensorFlow支持通过tf.Graph函数来生成新的计算图,不同计算图上的张量和运算都不会共享。
如:import tensorflow as tf
g1 = tf.Graph()
with g1.as_default():
...

     g2 = tf.Graph()
     with g2.as_default():
          ...
  TensorFlow中的计算图不仅可以用来隔离张量和计算,还提供了管理张量和计算的机制。计算图可以通过tf.Graph.device函数指定运行计算的设备。这为TensorFlow使用GPU提供了机制。

如:g = tf.Graph()
with g.device('/gpu:0'):
result = a + b
有效地整理TensorFlow程序中的资源也是计算图的一个重要功能。在一个计算图中,可通过集合管理不同类别的资源。如通过tf.add_to_collection函数可将资源加入一个或多个集合中,然后通过tf.get_collection获取一个集合里面的所有资源。这里的资源可以是张量、变量或者运行TensorFlow程序所需要的队列资源。

2 TensorFlow数据模型---张量
张量是TensorFlow管理数据的形式,所有的数据都通过张量的形式来标示。从功能的角度上,张量可被简单理解为多维数组。其中零阶张量表示标量,也就是一个数;第一阶张量为向量,即一维数组。n阶张量可理解为一个n维数组。但张量在TensorFlow中的实现并不是直接采用数组的形式,它只是对TensorFlow中运算结果的引用。在张量中并没有真正保存数字,保存的是如何得到这些数字的计算过程。
如:...
result = tf.add(a,b,name='add')
print(result)
...
输出:
Tensor("add:0",shape=(2,),dtype=float32)
一个张量中主要保存了三个属性:名字、维度和类型。
张量使用主要可以分为两大类:
1、第一个用途是对中间计算结果的引用;
2、当计算图构造完成之后,张量可以用来获得计算结果,也就是得到真实的数字(通过会话session)。

3 TensorFlow运行模型---会话
会话拥有并管理TensorFlow程序运行时的所有资源。当所有计算完成之后需要关闭会话来回收资源,以免资源泄漏。TensorFlow中使用会话的模式有两种:明确调用会话生成函数和关闭会话函数、通过Python的上下文管理器来使用会话。
如:
with tf.Session() as sess:
sess.run(...)
通过Python上下文管理器机制,只要将所有的计算放在“with”内部即可。当上下文管理器退出时候会自动释放所有资源。
在交互式环境下(比如Python脚本或者Jupyter的编辑器下),通过设置默认会话的方式来获取张量的取值更加方便。TensorFlow提供了在交互式环境下直接构建默认会话的函数:tf.InteractiveSession。使用此函数会自动将生成的会话注册为默认会话。
如: sess = tf.InteractiveSession()
print(result.eval())
sess.close()
通过tf.InteractiveSession函数可以省去将生成的会话注册为默认会话的过程。无论使用哪种方法都可以通过ConfigProto Protocol Buffer来配置需要生成的会话。
如:
config = tf.ConfigProto(allow_soft_placement=True)
sess1 = tf.IntreactiveSession(config=config)
sess2 = tf.Session(config=config)
通过ConfigProto可以配置类似并行的线程数、GPU分配策略、运算超时时间等参数。

4 TensorFlow实现神经网络
TensorFlow游乐场(http://playground.tensorflow.org)是一个通过网页浏览器就可以训练的简单神经网络并实现了可视化训练过程的工具。
使用神经网络解决分类问题4步骤:
1、提取问题中实体的特征向量作为神经网络的输入。
2、定义神经网络的结构,并定义如何从神经网络的输入得到输出。这个过程就是神经网络的前向传播算法。
3、通过训练数据来调整神经网络中参数的取值,这就是训练神经网络的过程。
4、使用训练好的神经网络来预测未知的数据。
前向传播算法。计算机网络的前向传播结果需要三部分信息:神经网络的输入,即从实体中提取的特征向量;神经网络的连接结构,神经网络由神经元构成,神经网络的结构给出不同神经元之间输入输出的连接关系;神经元中的参数。前向传播算法可通过矩阵乘法表达。
在TensorFlow中,变量的作用就是保存和更新神经网络中的参数。需要指定初始值。因为在神经网络中,给参数赋予随机初始值最为常见,因此一般也使用随机数给TensorFlow中的变量初始化。
如:weights = tf.Variable(tf.random_normal([2,3], stddev=2))。
TensorFlow中变量的初始值可设置为随机数、常熟或者通过其他变量的初始值计算得到。
TensorFlow提供了tf.initialze_all_variables()函数实现初始化所有变量的过程。
如:init_op = tf.initialize_all_variables()
sess.run(init_op)
通过tf.initialize_all_variables函数,就不需要将变量一个一个初始化。此函数也会自动处理变量之间的依赖关系。
在使用神经网络解决实际的分类或者回归问题时需要更好地设置参数取值。设置神经网络参数的过程就是训练过程。只有经过有效训练的神经网络模型才可以真正解决分类或回归问题。
使用监督学习的方式设置神经网络参数需要有一个标注好的训练数据集。监督学习最重要的思想就是,在已知答案的标注数据集上,模型给出的预测结果要尽量接近真实的答案。通过调整神经网络中的参数对训练数据进行拟合,可以使得模型对未知的样本提供预测能力。
在神经网络优化算法中,最常用的方法是反向传播算法。

上一篇下一篇

猜你喜欢

热点阅读