真锋
永远保持一颗学习和专注的心
嵌入式视觉笔记

TensorFlow基本使用教程

TensorFlow框架介绍

TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习。它是目前应用最广泛的机器(深度)学习框架,利用TensorFlow,你可以很快的构建深度学习模型,目前在工业界应用非常广泛,截止到目前最新版本是tf.1.11。

TensorFlow相对其他框架比如keras、Pytoch、Caffe等,更稳定,处理数据更方便,更适合开发AI应用,当然它也有个缺点,相对刚才那三个框架,它更难上手,新手学起来难度很大,但是一旦学会再去使用其他框架,就没什么难度。我个人建议,想要在工业界发展的,还是学习TensorFlow框架为主,当然Pytoch也可以选择。

TensorFlow特点

  • 使用图 (graph) 来表示计算任务.
  • 在被称之为 会话 (Session) 的上下文 (context) 中执行图.
  • 使用 tensor 表示数据.
  • 通过 变量 (Variable) 维护状态.
  • 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据.
  • 当会话定义完成后就可以真正运行定义好的计算了.
  • 在TensoorFlow中,所有的操作op,变量都视为节点

TensorFlow框架原理综述

TensorFlow 是一个编程系统, 使用图来表示计算任务。图中的节点被称之为 op (operation 的缩写)。 一个 op 获得 0 个或多个Tensor,执行计算,产生 0 个或多个 Tensor。

每个 Tensor 是一个类型化的多维数组。例如, 你可以将一小组图像集表示为一个四维浮点数数组, 这四个维度分别是 [batch, height, width, channels]。

一个 TensorFlow 图描述了计算的过程。为了进行计算, 图必须在会话里被启动。会话将图的op分发到诸如CPU或GPU之类的设备上,同时提供执行op的方法。这些方法执行后, 将产生的 tensor 返回。

在 Python 语言中, 返回的 tensor 是 numpy ndarray 对象; 在 C 和 C++ 语言中, 返回的 tensor 是tensorflow::Tensor 实例。

TensorFlow基础

要想初步学会TensorFlow框架,必须先理解三个概念,张量、计算图、会话。

张量是TensorFlow的数据模型,TensorFlow中所有运算的输入、输出都是张量。注意,张量本身并不储存任何数据,它知识对运算结果的引用。通过张量,我们可以更好地组织TensorFlow程序。

计算图是TensorFlow的计算模型,所有TensorFlow的程序都会通过计算图的形式表示计算图上的每一个节点都是一个运算,而计算图上的边则表示了运算之间的数据传递关系。计算图还保存了每个运算的设备信息(是通过CPU还是GPU运行)以及运算之间的依赖关系。计算图还提供了管理不同集合的功能,TensorFlow会自动维护5个不同的默认集合。

会话是TensorFlow的运算模型,它管理了一个TensorFlow程序拥有的系统资源,所有的运算都必须要通过会话才能执行。

TensorFlow的数据模型-张量

TensorFlow的计算结果不是一个具体的数字,而是一个张量的结构。一个张量中主要保存了三个属性:名字(name),维度(shape)和类型(type)。在张量中并没有真正保存数字,它保存得只是这些数字的计算过程。

TensorFlow计算图

TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段。 在构建阶段, op 的执行步骤 被描述成一个图. 在执行阶段, 使用会话执行执行图中的 op。TensorFlow的计算都可以通过计算图的模型来建立,而计算图上的每一个节点代表了计算,计算的结果就保存在 张量之中。

例如, 通常在构建阶段创建一个图来表示和训练神经网络,然后在执行阶段反复执行图中的训练 op。

在TensorFlow中张量可以被理解为多维数组。TensorFlow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。

TensorFlow 支持 C, C++, Python 编程语言. 目前, TensorFlow 的 Python 库更加易用, 它提供了大量的辅助函数来简化构建图的工作, 这些函数尚未被 C 和 C++ 库支持.
三种语言的会话库 (session libraries) 是一致的.

TensorFlow构造图

构建图的第一步, 是创建源 op (source op)。源 op 不需要任何输入, 例如 常量 (Constant). 源 op 的输出被传递给其它 op 做运算。

Python 库中, op 构造器的返回值代表被构造出的 op 的输出, 这些返回值可以传递给其它 op 构造器作为输入。TensorFlow Python 库有一个默认图 (default graph), op 构造器可以为其增加节点。这个默认图对 许多程序来说已经足够用了。阅读 Graph 类 文档 来了解如何管理多个图。

TensorFlow会话

构造图完成后, 才能启动图。启动图的第一步是创建一个 Session 对象, 如果无任何创建参数, 会话构造器将启动默认图。会话会管理TensorFlow程序运行时的所有资源。当所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄露的问题。

经典的输入数据处理流程图

TensorFlow官方推荐的输入数据处理流程,可以总结如下:

  1. 将数据转为 TFRecord 格式的多个文件;
  2. 用tf.train.match_filenames_once()创建文件列表;
  3. 用tf.train.string_input_producer()创建输入文件队列,可将输入文件顺序随机打乱;
  4. 用 tf.TFRecordReader() 读取文件中的数据;
  5. 用 tf.parse_single_example() 解析数据;
  6. 对数据进行解码及预处理;
  7. 用 tf.train.shuffle_batch() 将数据组合成 batch;
  8. 将batch 用于训练。

前向/前馈神经网络理解

前向神经网络只在训练过程会有反馈信号,而在分类过程中数据只能向前传送,直到到达输出层,层间没有向后的反馈信号,因此被称为前馈网络。感知机( perceptron)与BP神经网络就属于前馈网络。

这是传统的神经网络,现在的神经网络都有反向传播功能,当然,我们还是有必要了解下概念。

训练神经网络的过程

在理解和知道如何定义神经网络之后,我们就需要去连接如何训练神经网络,大致过程如下:

  1. 定义神经网络的结构和前向传播的输出结果。
  2. 定义损失函数以及选择反向传播优化的算法。
  3. 生成会话(tf.Session)并且在训练数据上反复运行反向传播优化算法。
    (无论神经网络的结构如何变化,这三个步骤是不变的)

理解dropout

dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。dropout是CNN中防止过拟合提高效果的一个大杀器,但对于其为何有效,却众说纷纭。

通过dropout,可以让卷积神经网络更加健壮(robust),类似的,在循环神经网络中使用dropout也有类似的功能。

注意,类似卷积神经网络只在最后的全连接层使用dropout,循环神经网络一般只在不同层循环体结构之间使用dropout,而不在同一层的循环体结构之间使用。

查看TensorFlow版本及安装路径

如图,简单易懂,先激活tensorflow,然后进入python,输入python语句执行查询。

Windows系统下显卡信息查看

在安装好cuda和cuDNN后,可通过以下操作查看新卡信息,这也是检测cuda和cuDNN安装是否成功的方法。

进入DOS命令框,输入nvdia-smi

 

赞赏

发表评论

textsms
account_circle
email

  • harley博主

    哈哈,写的不错!

    4年前 回复

嵌入式视觉笔记

TensorFlow基本使用教程
TensorFlow框架介绍 TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习。它是目前应用最广泛的机器(深度)学习框架,利用TensorFlow,你可以很快的构建深度学习模型,目…
扫描二维码继续阅读
2018-11-08