TensorFlow初学(一)

来源:互联网 发布:淘宝信誉查询网站 编辑:程序博客网 时间:2024/06/07 03:18

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 可以灵活分配

神经网络的前向传播  神经网络的后向传播







































原创粉丝点击