TensorFlow基本概念

一、数据流图

1、节点

通常以圆圈、椭圆和方框表示,代表对数据所做的某种运算或操作

2、边

对应于向Operation传入和从Operation传出的实际值,通常以箭头表示

3、TensorFlow中的数据流图

在TensorFlow上运行不同的模型,都有相同的两个步骤:
(1)定义数据流图
例如:下面这个数据流图,用TensorFlow表示:
TensorFlow基本概念

import tensorflow as tf

a = tf.constant(5, name = 'input_a')
b = tf.constant(3, name = 'input_b')
c = tf.mul(a, b)
d = tf.add(a, b)
e = tf.add(b, c)

(2)运行数据流图
使用会话(Session)执行定义好的数据流图

sess = tf.Session()
sess.run(e)

二、TensorFlow基本数据结构

1、张量思维

(1)基本概念

张量(tensor):n维矩阵的抽象。
1阶张量:向量
2阶张量:矩阵
对于更高维数的张量,可以称为“N维张量”或者“N阶张量”

上述例子中,节点输入是标量,以后为了方便使用,改换为张量,这样可以简化流图:
TensorFlow基本概念
简化后,数据流图的定义变为:

import tensorflow as tf

a = tf.constant([5, 3], name = "input_a")
b = tf.reduce_prod(a, name = "prod_b")
c = tf.reduce_sum(a, name = "sum_c")
d = tf.add(b, c,name = "add_d")

一般来说可以不加区分地使用“张量“或者”Tensor对象“

(2)张量形状

张量对象的属性:shape
形状:描述张量的维数以及每一维的长度

例如:列表[2, 3]描述了一个2阶张量,其第1个维度上的长度是2.第2个维度上的长度为3

2、TensorFlow的Operation(节点,简称Op)

TensorFlow总的来说只有两大类数据:节点张量
Op是对一些tensor对象执行运算的节点,计算完毕,返回0个或者多个张量

Op的功能不仅限于数据运算,有的Op既没有输入也没有输出,这是用来执行初始化任务的

3、Graph对象

Graph:数据流图
TensorFlow库被加载之后,会自动创建一个Graph对象,并将其作为默认的数据流图,获取默认数据流图的方法:

default_graph = tf.get_default_graph()
(1)创建新的数据流图
import tensorflow as tf

g1 = tf.Graph()  # 创建一个新的数据流图
g2 = tf.Graph()

with g1.as_default():
    # 定义g1的Op、张量等
    ..............

with g2.as_default():
    # 定义g2的Op、张量等
    ..............

不在Graph.as_default()内定义的节点、张量会被添加到默认的数据流图

(2)数据流图的导入

4、Session对象

(1)Session对象的参数

Session类负责数据流图的执行,有3个可选参数

-target:指定了所要使用的引擎,对大部分应用而言,该参数取默认值,即空字符串。

-graph:该参数指定了将要在Session中加载的Graph对象(数据流图),默认值为None,表示使用当前默认数据流图

import tensorflow as tf

a = tf.add(2, 3)
b = tf.mul(3, 5)

sess = tf.Session()
# 这句话等价于:sess = tf.Session(default_graph = tf.get_default_graph())

-config:允许用户指定配置Session对象,比如:限制CPU或GPU的使用数量

(2)Session对象的run方法

run方法,接受一个fetches参数,和三个可选参数:feed_dict、options、run_metadata

  • feches参数:接收任意的数据流图元素(Op或者Tensor对象)
    Tensor:输出该Tensor对象
    Op:输出None
# 初始化Varible对象,返回值:None
sess.run(tf.initialize_all_variables())

-feed_dict参数:用于覆盖数据流图中的Tensor对象值

import tensorflow as tf

a = tf.add(2, 3)
b = tf.mul(a, 5)

sess = tf.Session()

# 定义一个字典:将节点a的输出替换为了15
replace_dict = {a:15}

# 执行数据流图
sess.run(b, feed_dict = repalce_dict) # 返回值:75
(3)Session对象的close方法

创建Session对象,在使用之后需要关闭,调用close方法关闭或者写成with结构

(4)占位输入

可以看到在之前的代码里,输入都是采用固定输入的方式,总是使用相同的值作为输入,这里将会说明如何从客户端处接收输入
tf.placeholder: 创建占位符,类似于C语言里面的%d、%c…
这里,dtype参数是必选的,确定输入数据类型,shape是可选参数,确定张量形状,如果没有填写,默认是None,此时可以接收任意形状的张量

import tensorflow as tf
import numpy as np

a = tf.placeholder(tf.int32, shape = [2], name = "my_input")

b = tf.reduce_prod(a, name = "prod_b")
c = tf.reducee_sum(a, name = "sum_c")
d = tf.add(c, b)

input_dict = {a:np.array([5, 4], dtype = tf.int32)}

with tf.Session as sess:
    sess.run(d, feed_dict = input_dict)

5、Varible对象

Tensor对象和Op对象都是不可改变的,因此引入了变量(Varible)对象

(1)Variable对象的创建
'''
创建函数: tf.Varible()
'''
import tensorflow as tf

# 创建标量变量
my_var1 = tf.Varible(3, name = "my_varible1")

# 创建全1向量变量
my_var2 = tf.Varible(ones([6]), name = "my_varible2")

# 创建三阶张量Variable对象,服从正态分布(均值:0, 标准差:2)
var_normal1 = tf.Varible(tf.random_normal([3, 3, 3], mean=0.0, stddev = 2.0), name = "my_var_normal1")

# tf.truncated_normal():创建正态分布随机值,但是所创建的值,不会偏离超过2倍的标准差值。下面的例子中,张量里元素的值的取值范围:[3, 7]
var_normal2 = tf.Varible(tf.random_normal([3, 3, 3], mean=5.0, stddev = 1.0), name = "my_var_normal2")

# 正态分布函数的默认参数:均值:0.0, 标准差:1.0
(2)Variable对象的初始化

Variable对象与其他的Tensorflow对象在Graph中存在的方式相似,它们的实际状态都是由Session对象管理,因此,为了能使Session对象追踪Variable对象的值的变化,需要对其进行初始化:

'''
初始化函数:
tf.initialize_all_variables
tf.initialize_variables
'''
import tensorflow as tf

init = tf.initialize_all_variables()
with tf.Session() as sess:
    sess.run(init)

上述操作是对Session对象的Graph的所有Variable进行初始化,若要初始化一部分,则:

import tensorflow as tf

var1 = tf.Variable(tf.truncated_normal([2, 3], mean = 1, stddev = 3), name = "var1")
var2 = tf.Variable(tf.random_normal([3, 4], mean = 0, stddev = 2), name = "var2")

init = tf.initialize_variables([var1, var2], name = "init_var")
with tf.Session() as sess:
    sess.run(init)
(3)Variable对象的修改

使用Variable.assign()方法,修改Variable对象的值
注意Variable.assign()是一个Op,必须通过Session.run()执行,所做修改才能生效

import tensorflow as tf

var1 = tf.Variable(1, name = "var1")

var1_times_two = var1.assign(var1 * 2)

init = tf.initialize_variables([var1], name = "init_var")
with tf.Session() as sess:
    sess.run(init)
    sess.run(var1_times_two) # 输出为:2
    sess.run(var1_times_two) # 输出为:4
    sess.run(var1_times_two) # 输出为:8
    sess.run(var1.assign_sub(1)) # 输出为:7
    sess.run(var1.assign_add(10)) # 输出为:17

此外,同一个Variable对象在不同的Session对象里面的值可能是不一样的,它们之间相互独立

import tensorflow as tf

var1 = tf.Variable(0, name = "var1")

init = tf.initialize_all_variables()

sess1 = tf.Session()
sess2 = tf.Session()

sess1.run(init)
sess.run(var1.assign_sub(5)) # 输出:-5

sess2.run(init)
sess2.run(var1.assign_add(10)) # 输出:10

# 重置为初始值:
sess1.run(init)
sess2.run(init)
(4)trainable参数

在使用自动训练机器学习模型的Optimizer类时,这些类会自动的修改Variable对象的值
当trainable == False,不允许Optimizer类自动修改Variable对象的值,只能手动更改

6、名称作用域

类似于封装的效果,将一部分节点隐藏起来,用一个名称显示这部分的功能
例如:

import tensorflow as tf

with tf.name_scope("Scope_A"):
    a = tf.add(1, 2, name = "A_add")
    b = tf.mul(a, 3, name = "A_mul")

with tf.name_scope("Scope_B"):
    c = tf.add(4, 2, name = "B_add")
    d = tf.mul(c, 7, name = "B_mul")

e = tf.add(b, d, name = "output")

数据流图:
TensorFlow基本概念
展开:
TensorFlow基本概念