TensorFlow笔记之基础总结

本文主要对TensorFlow的基础知识做一下总结回顾

  1. 计算图:计算模型

    • 计算图概念

        TensorFlow的所有计算都会被转化为计算图上的节点。
        Tensor就是张量。可以简单理解为多维数组,表明了它的数据结构,Flow就是“流”,它直观地表达了张量之间通过计算相互转化的过程。
        TensorFlow是一个通过计算图的形式来表述计算的编程系统。TensorFlow的每一个计算都是计算图上的一个节点,而节点之间的边表述了计算之间的依赖关系。如果一个运算的输入依赖于另一个运算的输出,那这两个运算有依赖关系。

    • 计算图的使用

        TensorFlow程序一般可以分为两个阶段。第一个阶段需要定义计算图中所有的计算;第二个阶段为执行计算。在这个过程中,TensorFlow会自动将定义的计算转化为图上的节点。
         tf.get_default_graph()可以获取当前默认的计算图。 TensorFlow可以使用tf.Graph()来生成新的计算图,不同计算图上的张量和运算都不会共享。
         tf.Graph.device()函数可以来指定运行计算的设备。tf.Graph.device('/gpu:0')可以将计算跑在GPU上。
        通过集合(collection)可以管理不同类别的资源。tf.add_to_collection()函数可以将资源加入一个或多个集合中,然后通过tf.get_collection()获取一个集合里面的所有资源。
        这里的资源可以是张量、变量或者队列资源。

      TensorFlow中的计算图不仅仅可以用来隔离张量和计算,它还提供了管理张量和计算的机制。

  2. 张量:数据模型

    • 张量概念

        张量是TensorFlow管理数据的形式。在TensorFlow中,所有的数据都是通过张量的形式来表示。从功能的角度讲,张量可以被简单的理解为多维数组。
        张量在TensorFlow中实现并不是直接采用数组的形式,只是对TensorFlow中运算结果的引用。在张量中并没有真正保存数字,它保存的如何得到这些数字的运算过程。
        一个张量主要保存三个属性:名字(name)、维度(shape)、类型(type)。
      Tensor("add:0", shape = (2,), dtype = float32)
        这个shape可以看出,保存的是列向量。

    • 张量的使用

        张量的使用主要有两类:
        第一个,是对中间计算结果的引用。
        第二个,当计算图构造完成后,张量可以用来获得计算结果,也就是在会话(Session)中得到具体的结果。

  3. 会话:运行模型

      前面介绍了TensorFlow是如何组织数据和运算的。本节将介绍如何使用TensorFlow中的会话(Session)来执行定义好的运算。
      会话拥有并管理TensorFlow程序运行时的所有资源。当所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄露的问题。
      TensorFlow中使用会话的模式一般有两种:

    • 指定关闭模式

        需要明确调用会话生成函数和关闭会话函数,这种模式的代码如下。
        这种模式,需要调用Session.close()函数来关闭会话并释放资源。有时候程序异常退出,关闭会话可能不会执行从而导致资源泄露。
       

    • 上下文模式
        为了解决异常退出时资源释放的问题,TensorFlow可以通过Python的上下文管理器使用会话,也就是这种模式。
        不再调用”Session.Close()来自动释放资源。
        这样来解决资源泄露问题。
        
        TensorFlow会自动生成一个默认的计算图,如果没有特殊指定,运算会自动加入这个计算图中。TensorFlow中的会话也有类似的机制,但是TensorFlow不会自动生成默认的会话,而是需要手动指定。
        当默认的会话被指定之后,可以用tf.Tensor.eval()函数来计算一个张量的取值。
        tf.InteractiveSession()可以自动将生成的会话注册为默认会话。
        无论哪种方法都可以通过tf.ConfigProto()来配置需要生成的会话。通过ConfigProto可以配置类似并行的线程数、GPU分配策略、运算超时时间等参数。最常用的参数有两个:
        (1)、allow_soft_placement
        当参数为True时,GPU不可用时候,就放在CPU上进行。这样的移植性更强。
        (2)、log_device_placement
        当参数为True时,会记录每个节点在哪个设备上进行了方便调试。而在生产环境中可以设为False,减少日志量。
  4. 神经网络参数与TensorFlow变量

      在神经网路中,变量(tf.Variable)的作用就是保存和更新神经网络中的参数。tf.Variable(tf.random_normal([2, 3], stddev = 2)) 这个变量将产生一个2x3的矩阵,矩阵中的元素是均值为0,标准差为2的随机数。tf.random_normal可以通过mean参数来指定平均值,在没有指定时候默认为0。通过正态分布的随机数来初始化神经网络中的参数是一个非常常用的方法。还有别的方法,在此不再赘述。
      TensorFlow也支持通过常数来初始化一个变量。例如,tf.zeros([2, 3], int32) ->[[0, 0, 0], [0, 0, 0]]。类似的,还有tf.ones, tf.fill, tf.constant。
      TensorFlow提供了一个更加便捷的方式来完成变量初始化过程。tf.global_variables_initializer()方法可以初始化所有变量。
      变量和张量之间的关系:变量的声明函数tf.Variable()是一个运算,这个运算的输出结果就是一个张量,这个张量也就是本书中介绍的变量。所以,变量只是一个特殊的张量。
      collection:所有的变量都会被自动的加入GraphKeys.VARIABLES这个集合。通过tf.all_variables函数可以拿到当前计算图上所有的变量。拿到计算图上所有的变量有助于持久化整个计算图的运行状态。
      可以通过变量声明函数中的trainable参数来区分需要优化的参数和其他不需要优化的参数。如果声明变量时参数trainable为True,那么这个变量就会被加入GraphKeys.TRAINABLE_VARIABLES集合。在TensorFlow中可以通过tf.trainable_variables函数得到所有需要优化的参数。设置神经网络参数的过程就是神经网络的训练过程。
      TensorFlow通过迭代训练,如果使用常量来表示训练样本数据,会导致计算图非常大,而且利用率特别低。所以TensorFlow提供了placeholder机制用于提供输入数据。placeholder相当于定义了一个位置,这个位置中的数据在程序运行时再指定。这样在程序中就不需要生成大量常量来提供输入数据,而只需要将数据通过placeholder传入TensorFlow计算图。当placeholder定义时,这个位置上的数据类型是需要指定的。和其他张量一样,placeholder的类型也是不可以改变的。placeholder中数据的维度信息可以根据提供的数据推导得出,所以不一定给出。
      在训练时候,placeholder需要feed_dict来进行传值。sess.run(y, feed_dict = { x: [[0.7, 0.9]]})

  5. 总结
    训练神经网络过程主要分为三步:

(1)、定义神经网络的结构和前向传播的输出结果;
(2)、定义损失函数以及选择反向传播优化的算法;
(3)、生成会话,并且在训练数据上反复运行反向传播优化算法。

无论神经网络的结构如何变化,这三个步骤是不变的。

你可能感兴趣的:(tensorflow,数据结构,编程,TensorFlow)