Tensorflow所有的计算都会转化为计算图上的节点,
tensor张量的意思,可以理解为多维数组,可以理解为它的数据结构;flow 流,体现了计算模型;
tensorflow是通过计算图的形式来表述计算的编程系统。
每一个计算都是计算图上的一个节点,节点之间的变描述为计算之间的依赖关系。
每一个节点就是一个运算,而每一条边代表了计算之间的依赖关系。
如果一个运算的输入依赖另一个运算的输出,这这两个运算由依赖关系。
tensorflow 程序一般分为两个阶段:
1、定义计算图中的所有计算。
for example:import tensorflow as tf/常用载入tensorflow的技巧
a=tf.constant([1,2],name="a")//定义向量
b=tf.constant([1,2],name="b")
rusult=a+b
2执行计算阶段
注意的是在这个过程中,tf会自动的将定义的计算转化为计算图上的节点。系统还会自动维护一个默认的计算图
通过tf.get_default_graph()获取当前默认的计算图
In [1]: import tensorflow as tf
In [2]: a=tf.constant([1.0,2.0],name="a")
In [3]: b=tf.constant([3.0,4.0],name="b")
In [4]: result=a+b
In [5]: print(a.graph is tf.get_default_graph)
False
我是生成的false;
ternsorflow支持通过tf.Graph函数来生成新的计算图,不同计算图上的张量和运算不会共享
这里讲一下tf.get_variable()的用法,第一个坑:
tf.get_variable(name, shape, initializer): name就是变量的名称,shape是变量的维度,initializer是变量初始化的方式,初始化的方式有以下几种:
tf.constant_initializer():常量初始化函数
tf.random_normal_initializer():正态分布
tf.truncated_normal_initializer():截取的正态分布
tf.random_uniform_initializer():均匀分布
tf.zeros_initializer():全部是0
tf.ones_initializer():全是1
tf.uniform_unit_scaling_initializer():满足均匀分布,但不影响输出数量级的随机值
这里又是一个坑:
initialize_all_variables已被弃用,将在2017-03-02之后删除。
说明更新:使用tf.global_variables_initializer
代替
千辛万苦:
In [20]: import tensorflow as tf
In [21]: g1=tf.Graph()
In [22]: with g1.as_default():
...: v = tf.get_variable("v", shape=[1], initializer=tf.zeros_initializer)
...:
In [23]: with tf.Session(graph=g1) as sess:
...: tf.global_variables_initializer().run()
...: with tf.variable_scope("",reuse=True):
...: print(sess.run(tf.get_variable("v")))
...:
[ 0.]
tensorflow的计算图可以用来隔离张量和计算,也提供了管理和计算张量的机制。
tf.Graph.device函数指定计算设备
g=tf.Graph()
with g.device('/gpu:0');
result=a+b
需要理解的是 张量并不是保存真实的数字 而是可以看作保存 三个属性的多维数组,但也并不是多维数字
1、名字 2、维度 3、类型
In [24]: import tensorflow as tf
In [25]: a=tf.constant([1.0,2.0],name="a")
In [26]: b=tf.constant([2.0,3.0],name="b")
In [27]: result=tf.add(a,b,name="add")
In [29]: print(result)///这里有一个坑,因为版本的升级,这里应该是print(内容)加上括号!
/*********Tnsor("add:0", shape=(2,), dtype=float32)******************/
1、名字 张量的命名通过“A:B“ A 代表节点的名称,B代表节点的第几个输出 这里add:0 ‘0’代表节点的第一个输出
2、shape=(A,B)维度 shape=(2,)代表有数组长度为2的一维数组
3、dtype= 张量都有唯一的类型,当计算时发现类型不匹配时就会报错。
张量的使用
1、用于计算中间结果的引用
2、用于获得计算结果
如:tf.Session().run(result)
Tensorflow 运行模型 ---------会话
会话拥有并管理Tensorflow程序运行的所有资源。
notice! 当计算完成后需要关闭会话来帮助系统回收资源,否则可能出现资源泄露的问题!
两种使用会话的模式
1、需要明确调用会话生成函数和关闭会话函数
创建一个会话 sess=tf.Session()
使用这个会话调用需要关心的结果------> sess.run(result)
关闭会话 使得本次运行中使用的资源可以释放
sess.close()
为了避免异常退出时资源释放的问题,tensorflow使用python上下文管理器 来使用会话
代码:
with tf.Session() as sess:
............通过上下文管理器机制,只有将所有的计算放在with的内部
sess.run(result)
不再需要调用sess.close(),上下文退出后会话关闭和资源额释放自动完成
Tensorflow不会自动生成会话,需要手动指定,可以通过tf.Tensor.eval来计算张量的取值
使用InteractiveSession()这个函数会自动将生成的会话注册为,默认会话
sess= tf.InteractiveSession()
print(result.eval())
sess.close()
通过ConfigProto配置需要i生成的会话
ConfigProto 可以配置并行的线程数 GPU分配策略 等
allow_soft_placement参数设置为True。 GPU 可以灵活分配
神经网络的前向传播 神经网络的后向传播