Tensorflow 变量(Variable)的主要作用是维护特定节点的状态 tf.Variable方法是操作,返回值是变量(特殊的张量) 变量与张量不同之处: 张量的生命周期通常是伴随着计算的完成而结束,内存也随着释放 变量则是常驻内存,每一步训练时不断更新其值,以实现模型的更新(自我感觉跟栈和堆有点像)
#创建变量
#返回一个形状为(1,4)的张量,四个元素的均值为100,标准差为0.35的正态分布
w = tf.Variable(initial_value = tf.random_normal(shape=(1,4),mean=100,stddev=0.35),name="W")
b = tf.Variable(tf.zeros([4]),name="b")
#初始化变量
#创建会话
sess = tf.Session()
#使用 tf.global_variables_initializer 方法初始化全局变量w和b
sess.run(tf.global_variables_initializer())
#执行操作,获取变量值
sess.run([w,b])
[array([[ 99.80061, 100.13786, 99.69376, 100.35596]], dtype=float32),
array([0., 0., 0., 0.], dtype=float32)]
#更新变量
sess.run(tf.assign(b,[1,1,1,1]))
array([1., 1., 1., 1.], dtype=float32)
sess.run(tf.assign_add(b,[9,9,9,9]))
array([10., 10., 10., 10.], dtype=float32)
sess.run(tf.assign_sub(b,[2,2,2,2]))
array([8., 8., 8., 8.], dtype=float32)
Saver
Saver 使用实例
v1 = tf.Variable(...,name='v1')
v2 = tf.Variable(...,name='v2')
#指定需要保存和恢复的变量
有三种方法
saver = tf.train.Saver({'v1': v1,'v2': v2}) 以字典的形式保存
saver = tf.train.Saver({v1,v2}) 以变量的name保存
saver = tf.train.Saver({v.op.name: v for in [v1,v2]})
#创建saver
saver = tf.train.Saver({'w':w,'b':b})
#存储变量到文件
saver.save(sess,'./test.ckpt',global_step=0)
'./test.ckpt-0'
#更新
sess.run(tf.assign_add(b,[1,1,1,1]))
array([9., 9., 9., 9.], dtype=float32)
#恢复
saver.restore(sess,'./test.ckpt-0')
sess.run(b)
INFO:tensorflow:Restoring parameters from ./test.ckpt-0
Out[29]:
array([8., 8., 8., 8.], dtype=float32)
Tensorflow 用数据流图表示算法模型,数据流图由节点和有向边组成, 每个节点均对应着具体操作,因此操作是模型功能的实际载体。
数据流图中的节点按照功能分成不同的三种:
存储节点:有状态的变量操作,用来存储模型参数
计算节点:伍状态的计算或者控制操作,主要负责算法逻辑表达或者流程控制
数据节点:数据的占位符 操作,用于描述图外输入数据的属性
Tensorflow使用占位符操作表示图外的数据,,如训练和测试数据。 Tensorflow数据流图描述了算法模型的计算拓扑,其中的各个操作节点都是抽象的函数映射或者数学表达式。 换句话谁,数据流图本身是一个具有计算拓扑和内部结构的壳,在用户向数据流图填充数据之前,图中并没有真正执行的操作。
#x和y两个占位符
x = tf.placeholder(tf.int16,shape=(),name='x')
y = tf.placeholder(tf.int16,shape=(),name='y')
#定义两个操作
add = tf.add(x,y)
mul = tf.multiply(x,y)
with tf.Session() as sess:
print(sess.run(add,feed_dict={x:2,y:3}))
print(sess.run(mul,feed_dict={x:2,y:3}))
5
6