tensorflow的Graph对象
在tensorflow库在被加载的时候,它会自动创建一个Graph对象,并把它作为默认的数据流图.
所以在加载库后,就可以在默认图中创建Op,tensor对象.
如果要隔离多个不存在依赖关系的模型时,可以创建多个Graph对象,
# 创建graph的语法很简单
import tensorflow as tf
# 此时有一个默认的Graph对象
# 在默认图中添加一个Op
a = tf.constant(1, name='a')
# 接下来创建一个新的数据流图
# 下面结合with 语句利用Graph.as_default()方法访问上下文管理器
# 为新的数据流图添加Op
g = tf.Graph()
with g.as_default():
b = tf.constant([1, 2], name='b')
# 在with 之外添加的Op在默认的数据流图中
c = tf.constant([3, 4], name='c')
# 执行默认图中的Op
sess = tf.Session()
sess.run(a)
1
# 执行新图g中的Op
sess1 = tf.Session(graph = g)
sess1.run(b)
array([1, 2], dtype=int32)
# 如果要使用多个数据流图
# 最佳方式是,忽略默认的图
import tensorflow as tf
g1 = tf.Graph()
g2 = tf.Graph()
with g1.as_default():
# 定义g1中的Op
with g2.as_default():
# 定义g2中的Op
# 也可以同时使用默认图和新建图
import tensorflow as tf
# 获取默认数据流图的句柄
g1 = tf.get_default_graph()
g2 = tf.Graph()
with g1.as_default():
# 定义g1中的Op
with g2.as_default():
# 定义g2中的Op
tensorflow中的变量(Variable)
变量是一种特殊的数据,它在图中有固的位置,机器学习任务的本质决定了需要一种机制保存随时间变化的值.variable通过tf.Variable()方法构造
# variable对象传入的初始值,决定了这个变量的形状和类型
var = tf.Variable(3, name='variable')
# 在tensorflow的函数中和Op中都可以使用variable
a = tf.add(4, var)
b = tf.mul(3, var)
#Variable对象的初值通常是全0/1的高阶张量,tensorflow中有很多辅助函数来创建高阶张量
# 2x2 全零矩阵
zeros = tf.zeros([2, 2])
# 为1的向量
ones = tf.ones([6])
# 3x3x3张量,服从0~10的均匀分布
uniform = tf.random_uniform([3,3,3], minval=0, maxval=10)
# 服从0均值,标准差为2的正太分布
normal = tf.random_normal([3,3,3], mean=0, stddev=2.0)
# tf.truncated_mormal()返回值不会偏离均值两倍的标准差
# 返回的值不会有小于3.0或者大于7.0的
trunc = tf.truncated_normal([2,2], mean=5.0, stddev=1.0)
# 默认均值为0,标准差为1.0
random_var = tf.Variable(tf.truncated_normal([2, 2]))
Variable对象的初始化
Variable对象与大多数其他对象在图中存在的方式类似,但是变量的状态由Session对象管理.在使用变量之前需要在一个session对象内对Variable对象进行初始化.这样Session对象会开始追踪这个Variable的值的变化.
init = tf.global_variables_initializer() # 对图中所有Variable初始化的Op
sess = tf.Session()
sess.run(init) # 对图中所有的变量进行了初始化
# 也可以单独对个别变量进行初始化
var1 = tf.Variable(0, name='init_1')
init1 = tf.initialize_variables([var1], name='init_var1')
sess.run(init1)
Variable对象的修改
Variable.assign()用来修改变量的,(这个操作会给Variable赋新值),这也是一个Op,在session对象下生效.
# 变量Op
var_5 = tf.Variable(3)
# 创建一个Op来,修改variable的操作,每次执行这个节点,var_5的值都会更新
new_var5 = var_5.assign(var_5 + 3)
# 初始化varibale,创建Op
#init2 = tf.initialize_all_variables() 这个初始化方法在2017年3月去掉了,下面新方法
init2 = tf.global_variables_initializer()
# 初始化variable
sess.run(init2)
# 修改变量var_5
sess.run(new_var5)
6
sess.run(var_5)
6
sess.run(new_var5)
9
Variable对象的自增和自减,也可以通过Variable.assign_add()和.assign_sub()方法实现
sess.run(var_5.assign_add(1))
10
不同的Session对象,只对指定图中的变量的值进行跟踪维护(默认是默认数据流图)
Variable对象的重置,
(也可以再次执行,单独变量初始化,对部分变量重置)
# 再次执行变量初始化操作的Op,就会重置全部变量,恢复初始值
init2 = tf.global_variables_initializer()
sess.run(init2)
sess.run(var_5)
3
Varibale对象中的trainable参数
在训练过程当中,有些变量会被自动修改,如果有些变量不想被修改可设置为手工修改,
在创建变量时,把trainable参数设为False
not_trainable = tf.Variable(0, trainable=False)
TensorFlow中还提供了一种填充机制,在构建图时,使用tf.placeholder()临时替代任意操作的张量
,在调用Session对象的run()方法时,填充数据作为调用参数,调用结束,填充数据消失
x1 = tf.placeholder(tf.float32)
x2 = tf.placeholder(tf.float32)
y = tf.add(x1, x2)
with tf.Session() as sess:
print sess.run([y], feed_dict={x1:[2.0], x2:[3.0]})
[array([ 5.], dtype=float32)]