一. 计算图 graph
计算图,又称有向图,数据流图。描述了张量数据的计算流程,负责维护和更新状态,对分支进行条件控制和循环操作。
数据流图:用节点和线 的有向图来描述数学计算。
节点:施加的数学计算 或 数据输入的起点 或 输出的终点 或 读写持久变量的终点
线:表示节点间的输入输出关系,运输着size可动态调整的多维数据数组(张量)
一旦输入端的所有张量准备好,节点将分配到各种计算设备中完成异步并行地执行运算
Tensorflow : 张量从图中流过的直观图像
有一类特殊的边中没有数据流动 - 依赖控制
作用:控制节点的执行顺序,让起始节点执行完毕再去执行目标节点,用户可以使用这样的边 进行灵活控制,比如限制内存使用的最高峰值
二. 张量 tensor
TensorFlow 将张量表现为基本数据类型的 n 维数组。零阶张量表示标量,一阶张量表示向量,以此类推。但在张量中,并没有保存真正的数字,而是保存如何得到这些数字的计算过程。
一个张量中主要保存了三个属性:名字、维度、类型
张量的第一个属性名字不仅是张量的唯一标识符,也给出了张量是如何计算出来的,通过”node:src_output”的形式给出,node为结点名称,src_output表示当前张量来自节点的第几个输出。第二个属性是维度。第三个属性是类型,每个张量的类型是唯一的,发现类型不匹配时会报错。
三. 常量constant 创建
import tensorflow as tf
a = tf.constant([1.0,2.0], name="a")
b = tf.constant([2.0,3.0], name="b")
word=tf.constant('hello,world!')
result = tf.add(a,b, name="add")
print word
print result
#输出
#Tensor("Const:0", shape=(), dtype=string)
#Tensor("add:0", shape(2,), dtype=float32)
比如:
a=tf.constant(10) #定义一个tf 的常量a
a = 10 #定义了一个值为10的常量a
区别是:下面可以用print(a) 直接打印。
上面则需要通过Session run(result)后才能得到值
对于tf 创建的常量或变量,都需要会话run 后才能有值,否则打印出来的是属性
四. 变量Variable 创建
当训练模型时,用变量来存储和更新参数。变量包含张量存放于内存的缓存区中。
建模时他们需要被明确地初始化,模型训练 tf.global_variables_initializer()后他们必须被存储到磁盘。这些变量的值可在之后模型训练和分析时被加载。
创建:当创建一个变量时,需将一个张量作为初始值传入构造函数Variable().同时Tensorflow提供了一系列操作符来初始化张量(常量或是随机值)
eg: #create two variables.
weights = tf.Variable(tf.random_normal([2,3]), stddv=0.35, name=”weights”)
//创建初始值为0的1维数组,长度为200
biases = tf.Variable(tf.zeros([200]), name=”biases”);
a = tf.Variable(tf.ones([3,3])) # 定义初始值都为1 的 3x3矩阵
b = tf.Variable(tf.zeros([3,3])) # 定义初始值都为0 的3x3矩阵
import tensorflow as tf
import numpy as np
y = np.array([[1,1],[2,2]])
x = [[1,1],[2,2]]
a = tf.Variable(initial_value = x)
b = tf.Variable(y)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
print(sess.run(a))
print(sess.run(b))
sess.close()
注:这些操作符都需要指定张量的shape,并且自动成为变量的shape.
变量的shape 通常是固定的,但tensorflow 提供的高级的机制来重新调整其行列数。
1.变量Variable 初始化
(1). 一次性全部初始化
变量的初始化必须在模型的其他操作运行之前先明确完成。
init = tf.initialize_all_variables(); //已被替换
init = tf.global_variables_initializer()
#启动图(graph)
sess = tf.Session()
sess.run(init)
(2). 也可以传入一组变量进行初始化
(3). 使用一个变量的初始值给另一个变量赋值
有此需求的,则要注意第一种情况
通过节点的initialized_value()属性,直接把已初始化的值作为另一个变量的初始值
biases = tf.Variable(tf.zeros([200]), name=”biases”); //创建初始值为0的1维数组,长度为200
otherBia = tf.Variable(biases.initialized_value(), name=”otherBia”)
2.变量Variable 保存和恢复
保存和加载
比如停电等操作使得模型运算停止了,此时就需要保存和恢复模型。
构造器给graph的所有变量,或者定义在列表的变量,添加save 和 restore 操作。saver对象提供了方法来运行这些操作,定义检查点文件的读写路径
检查点文件
变量存储在二进制文件里,主要包含从变量名到tensor值的映射关系
当创建一个Saver对象时,可以选择性地为检查点文件中的变量挑选变量名。默认情况下,将变量Variable.name属性的值
保存变量
用tf.train.Saver() 创建一个Saver来管理模型中的所有变量
#创建一些变量
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
#添加一个初始化操作初始化前面定义的所有变量
init_op = tf.global_variables_initializer()
#添加Saver操作对变量进行保存和恢复
saver = tf.train.Saver()
#启动会话
with tf.Session() as sess:
#运行初始化节点
//所有的tf.Variable 实例都会调用各自的run方法进行初始化
sess.run(init_op)
#do some thing
#将变量的值保存在硬盘里
save_path = saver.save(sess, "/temp/model.ckpt")
print "Model saved in file: ", save_path
恢复变量
#创建一些变量
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
#添加一个初始化操作初始化前面定义的所有变量
init_op = tf.global_variables_initializer()
#添加Saver操作对变量进行保存和恢复
saver = tf.train.Saver()
#启动会话
with tf.Session() as sess:
#从硬盘里面读取检查点文件并恢复到对应的变量中
saver.restore(sess, "/temp/model.ckpt")
print "Model restored."
# 在已经重新恢复的模型上继续工作
保存和恢复某些变量
#保存变量
saver = tf.train.Saver({“my_v2”: v2}) 通过键值对来链接(Python 字典)
五. 会话Session: 创建和运行
要评估张量,需要实例化一个 tf.Session 对象(通常被称为会话)。会话会封装 TensorFlow 运行时的状态,并运行 TensorFlow 指令。
运行张量计算。 (完成后需要关闭会话,防止出现资源泄露)
当使用 Session.run 请求输出节点时,TensorFlow 会回溯整个图,并流经提供了所请求的输出节点对应的输入值的所有节点。
sess = tf.Session()
或
with tf.Session() as sess:
sess.run(…)#使用这个创建好的会话得到关心的运算结果,
比如可以sess.run(result)来得到张量result的值
第一种需要sess.close()#会话使用完毕之后要关闭会话保证资源不被泄露
完成变量的初始化后,可以开始训练。
训练的每一步都是通过用户代码控制,而能实现有效的训练最简单的循环:
for step in xrange(0, 201):
sess.run(train) #运行计算图
if step % 20 == 0
print step, sess.run(W), sess.run(b) 打印值
ps:
vec = tf.random_uniform(shape=(3,))
out1 = vec + 1
out2 = vec + 2
print(sess.run(vec))
print(sess.run(vec))
print(sess.run((out1, out2)))
每次调用 run 时,结果都会显示不同的随机值,
结果显示的值是一致的:
[ 0.52917576 0.64076328 0.68353939]
[ 0.66192627 0.89126778 0.06254101]
(
array([ 1.88408756, 1.87149239, 1.84057522], dtype=float32),
array([ 2.88408756, 2.87149239, 2.84057522], dtype=float32)
)
六. 占位符
变量在定义时要初始化,但是如果有些变量刚开始我们并不知道它们的值,无法初始化,那怎么办呢?
那就用占位符来占个位置,如:
x = tf.placeholder(tf.float32, [None, 784])
指定这个变量的类型和shape,以后再用feed的方式来输入值。
例如:
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
z = x + y
//前面三行有点像函数。我们定义了这个函数的两个输入参数(x 和 y),然后对它们运行指令。
//我们可以使用 run 方法的 feed_dict 参数来为占位符提供真正的值,从而通过多个输入值来评估这个图:
print(sess.run(z, feed_dict={x: 3, y: 4.5}))
print(sess.run(z, feed_dict={x: [1, 3], y: [2, 4]}))
//上述操作的结果是输出以下内容:
7.5
[ 3. 7.]
//另请注意,feed_dict 参数可用于覆盖图中的任何张量。
占位符和其他 tf.Tensors 的唯一不同之处在于如果没有提供值给它们,那么占位符会显示错误。
七. 矩阵乘
满足矩阵相乘规则 m x n 与 n x y
比如:
import tensorflow as tf
a = tf.Variable([[1,2],[3,4],[5,6]]) #3 x 2矩阵
b = tf.Variable([[1,2],[3,4]])
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print(sess.run(tf.matmul(a,b)))
运行结果如下:
[[ 7 10]
[15 22]
[23 34]]
八. 矩阵加减
一般为2个相同大小的矩阵,否则会报错
tf.add
tf.mul
比如:
import tensorflow as tf
a = [[10,10],[20,20]]
b = tf.Variable([[5,5],[10,10]])
c = tf.subtract(a,b)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print(sess.run(tf.add(a,b)))
print(sess.run(c))
print(sess.run(tf.negative(a)))
结果如下:
[[15 15]
[30 30]]
[[ 5 5]
[10 10]]
[[-10 -10]
[-20 -20]]
tf.mul tf.sub tf.neg 已经废弃
分别可用tf.multiply tf.subtract tf.negative替代
乘法 减法 取反