通常以圆圈、椭圆和方框表示,代表对数据所做的某种运算或操作
对应于向Operation传入和从Operation传出的实际值,通常以箭头表示
在TensorFlow上运行不同的模型,都有相同的两个步骤: (1)定义数据流图 例如:下面这个数据流图,用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)张量(tensor):n维矩阵的抽象。 1阶张量:向量 2阶张量:矩阵 对于更高维数的张量,可以称为“N维张量”或者“N阶张量”
上述例子中,节点输入是标量,以后为了方便使用,改换为张量,这样可以简化流图: 简化后,数据流图的定义变为:
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对象“
张量对象的属性:shape 形状:描述张量的维数以及每一维的长度
例如:列表[2, 3]描述了一个2阶张量,其第1个维度上的长度是2.第2个维度上的长度为3
TensorFlow总的来说只有两大类数据:节点和张量 Op是对一些tensor对象执行运算的节点,计算完毕,返回0个或者多个张量
Op的功能不仅限于数据运算,有的Op既没有输入也没有输出,这是用来执行初始化任务的
Graph:数据流图 TensorFlow库被加载之后,会自动创建一个Graph对象,并将其作为默认的数据流图,获取默认数据流图的方法:
default_graph = tf.get_default_graph()不在Graph.as_default()内定义的节点、张量会被添加到默认的数据流图
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的使用数量
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创建Session对象,在使用之后需要关闭,调用close方法关闭或者写成with结构
可以看到在之前的代码里,输入都是采用固定输入的方式,总是使用相同的值作为输入,这里将会说明如何从客户端处接收输入 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)Tensor对象和Op对象都是不可改变的,因此引入了变量(Varible)对象
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)使用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)在使用自动训练机器学习模型的Optimizer类时,这些类会自动的修改Variable对象的值 当trainable == False,不允许Optimizer类自动修改Variable对象的值,只能手动更改
类似于封装的效果,将一部分节点隐藏起来,用一个名称显示这部分的功能 例如:
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")数据流图: 展开: