【TensorFlow小记】基础知识

本文主要介绍一些TensorFlow的基础知识和基本概念,如果不了解这些,将很难上手使用这款开源机器学习框架。

一、介绍

  TensorFlow是Google开源的基于数据流图的科学计算库,适用于机器学习。为什么叫这个名字呢?
  Tensor的意思是张量,“张量”这个词平时生活中不会接触到,但在人工智能领域就像ABCD一样常见,先记住。它代表的是N维数组。
  Flow的意思是流,代表基于数据流图(Data Flow Graph)的计算。
  所谓数据流图,如下图所示。可以看到黑色的边一直在流动,即Tensor在数据流图中Flow。
data_flow_graph.gif

二、各个机器学习库的对比

库名/对比项 开发/支持 主要开发语言 支持分布式
TensorFlow Google Python, C++
MXNet 社区/Apache/Amazon Python, C++
DL4J 团队/Eclipse Java, Python
CNTK Microsoft Python, C#
(Py)Torch Facebook(个人) (Python)Lua
Caffe(2) 贾扬清(Facebook) Python, C++
Theano 加拿大蒙特利尔大学 Python ×
Keras 个人, 有被TF吸纳 Python
Scikit Learn 法国Inria, 有被TF吸纳 Python ×

三、TensorFlow的基础结构

1. 基础结构-数据流图

  取上面数据流图中的一部分,得到简化的数据流图(Graph),如下图所示。
simple_data_flow_graph.png
  边就是那些流动的 Tensor(张量),即Tensor在边里面流动。
  每一个节点就是一个 Operation 操作,即数学计算或激励函数等的操作。
  边和节点共同构成了 Graph 也就是数据流图。
  数据流图会被放进 Session 会话中进行运行。会话可以在不同的设备上去运行,比如cpu和GPU。
  所以数据流图(Graph)主要有两部分组成:
  Tensor(张量) 边里流动的数据
  Operation(操作)
  Tensor作为Operation的输入,Operation的输出又是Tensor。
tensorflow_graph.png

2. TensorFlow的基础模型

  数据模型 - Tensor(张量) 张量是TensorFlow中最重要的结构。
  计算模型 - Graph(图)
  运行模型 - Session(会话)

3. TensorFlow程序的流程

  1. 定义算法的计算图(Graph)结构
  2. 使用会话(Session)执行图的一部分(计算)
  注:一般不主动创建图的话,TensorFlow会有一个默认的图,可以直接用。通过 tf.get_default_graph() 可以得到这个默认的图。

import tensorflow as tf

c = tf.constant([[2, 3], [4, 5]], name='const1', dtype=tf.int64)
if c.graph is tf.get_default_graph():
    print('The graph of c is the default graph of the context')

# 输出如下:
# The graph of c is the default graph of the context

四、TensorFlow的数据结构(重要)

  TensorFlow的主要数据结构是张量(Tensor),这点从TensorFlow的命名就可以看出来了。
  前面说过,张量这个词在生活中比较陌生,但仔细想一下,它曾出现在大学物理的课本中(如果你学过“大物”)。没错,张量这一术语起源于力学,同时它也是几何与代数中的基本概念之一(大学里没学过没关系,忽略这段话即可)。

1. Tensor的概念

  TensorFlow里的数据都是Tensor。
  既然前面说,Tensor代表的是N维数组,那么它就有维度(秩):Rand/Order,如下图所示:
  维度为0时,是一个标量(Scalar),即只有一个元素,称为0阶张量;维度为1时,是一个一维向量(Vector),称为1阶张量;维度为2时,就是矩阵(Matrix),称为2阶张量;维度N大于等于3时,就是一个N阶张量
  一个张量里面的元素类型都是一样的。
tensor_dimension.png

2. Tensor的属性

  Tensor具有一些属性:
  1)device:在哪个设备上被计算出来的
  2)dtype:Tensor里面的元素具有一个共同的数据类型,各种数据类型参见:
    https://tensorflow.google.cn/api_docs/python/tf/dtypes/DType
  3)graph:这个Tensor所属的图
  4)name:给这个Tensor起的名字
  5)op:Operation的缩写,是产生这个Tensor的一个操作/运算,对应图上的节点
  6)shape:描述张量的形状,例如一个四行三列的二维矩阵,它的shape就是(4, 3)
  7)其它参见:
    https://tensorflow.google.cn/api_docs/python/tf/Tensor

3. 几种主要的Tensor

  1)Constant
    常量,值不能改变的一种Tensor。详情见官方文档的 tf.constant
  2)Variable
    变量,值可以改变的一种Tensor。详情见官方文档的 tf.Variable
  3)Placeholder
    占位符,先占住一个固定的位置,等之后往里面添加值的一个Tensor。详情见官方文档的 tf.placeholder
    一般在正式运行图的时候,即sess.run()里面通过 feed_dict() 以字典形式赋值。
  4)SparseTensor
    稀疏张量,一种“稀疏”的Tensor,类似线性代数里的稀疏矩阵的概念。详情见官方文档的 tf.SparseTensor
    * 数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律的矩阵。

4. Tensor的表示法

  当我们创建一个Tensor后,直接print()它,输出的不是实际值,而是一个表示法,该表示法如下结构所示:
print_tensor.png
例如:

import tensorflow as tf

var = tf.Variable([[1.0], [2.0]])
print(var)

# 输出如下:
# <tf.Variable 'Variable_2:0' shape=(2, 1) dtype=float32_ref>

  类型:指明是tf.Variable
  名字:Variable_2,如果定义是没有指定名字,默认会以数据类型为名字。
  索引:0,表示该Operation产生的第几个张量,因为每个Operation可能会产生多个张量
  形状:(2, 1)表示2行1列的二维矩阵,如果是标量则为空()
  数据类型:float32_ref表示数据类型为float32,32位浮点型

五、小试牛刀

  写一个TensorFlow程序,实现两个矩阵的乘法

# -*- coding: utf-8 -*-

import tensorflow as tf

# 创建两个常量Tensor
# 注意矩阵乘法要求前一个矩阵的列数等于后一个矩阵的行数
const1 = tf.constant([[2, 2]])
const2 = tf.constant([[4],
                      [4]])

# 矩阵乘法
multiple = tf.matmul(const1, const2)

# 直接用print输出multiple的值
print(multiple)

# 创建Session对象
with tf.Session() as sess:
    # 用Session的run方法来实际运行multiple这个矩阵乘法操作
    result = sess.run(multiple)
    print(result)

# 输出如下:
# Tensor("MatMul:0", shape=(1, 1), dtype=int32)
# [[16]]

六、总结

  TensorFlow基础知识思维导图


参考
https://blog.csdn.net/xun527/article/details/79690226
https://blog.csdn.net/u013521220/article/details/79721682


  目录