TensorFlow实战——入门

TensorFlow入门

计算图

TensorFlow有两个重要的概念——Tensor和Flow。Tensor是“张量”的意思,可以理解为多维数组,Flow是“流”,表达了张量之间通过计算相互转化的过程。
TensorFlow中的每一个计算都是计算图上的一个节点,节点之间的边描述了计算之间的依赖关系。

计算图的使用

TensorFlow程序一般可以分为两个阶段,第一个阶段需要定义计算图中所有的计算,第二个阶段为执行计算。
计算定义阶段的样例:

import tensorflow as tf
a = tf.constant([1.0,2.0], name="a")
b = tf.constant([2.0,3.0], name="b")
result = a + b

在TensorFlow中,系统会自动维护一个默认的计算图,通过tf.get_default_graph函数可以获取。
查看一个运算所属的计算图

print(a.graph is tf.get_dafault_graph())

除了默认的计算图,TensorFlow还支持通过tf.Graph函数来生成新的计算图,不同计算图上的张量和运算都不会共享。

import tensorflow as tf

g1 = tf.Graph()
with g1.as_default():
    #v = tf.get_variable("v", initializer=tf.zeros_initializer(shape=[1]))
    v = tf.get_variable("v", shape=[1], initializer=tf.zeros_initializer())

g2 = tf.Graph()
with g2.as_default():
    #v = tf.get_variable("v", initializer=tf.ones_initializer(shape=[1]))
     v = tf.get_variable("v", shape=[1], initializer=tf.ones_initializer())

with tf.Session(graph=g1) as sess:#运行计算图g1
     #tf.initialize_all_variables().run()
     tf.global_varialbles_initializer().run()
    with tf.variable_scope("", reuse=True):
        print(sess.run(tf.get_variable("v"))

with tf.Session(graph=g2) as sess:#运行计算图g2
# tf.initialize_all_variables().run()
    tf.global_varialbles_initializer().run()
    with tf.variable_scope("", reuse=True):
        print(sess.run(tf.get_variable("v"))

计算图还可以通过tf.Graph.device函数来指定运行计算的设备。这为TensorFlow使用GPU提供了机制。

g = tf.Graph()

with g.device('/gpu:0'):
    result = a + b

张量

张量的概念

功能上,张量可以被理解为多维数组。零阶张量表示标量,一阶张量表示向量,以此类推。但在张量中,并没有保存真正的数字,而是保存如何得到这些数字的计算过程。
以加法为例:

import tensorflow as tf
a = tf.constant([1.0,2.0], name="a")
b = tf.constant([2.0,3.0], name="b")
result = tf.add(a,b, name="add")
print result
#输出
#Tensor("add:0", shape(2,), dtype=float32)

一个张量中主要保存了三个属性:名字、维度、类型
张量的第一个属性名字不仅是张量的唯一标识符,也给出了张量是如何计算出来的,通过”node:src_output”的形式给出,node为结点名称,src_output表示当前张量来自节点的第几个输出。第二个属性是维度。第三个属性是类型,每个张量的类型是唯一的,发现类型不匹配时会报错。

会话

会话拥有并管理TensorFlow程序运行时的所有资源。当所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄漏的问题。

sess = tf.Session()#创建一个会话
sess.run(...)#使用这个创建好的会话得到关心的运算结果,比如可以sess.run(result)来得到张量result的值
sess.close()#会话使用完毕之后要关闭会话保证资源不被泄露

因为每次使用会话时都要进行关闭显得比较繁琐,就像C++内存管理一样非常麻烦,所以为了解决异常退出时资源释放的问题,TensorFlow可以通过Python上下文管理器来使用会话。

with tf.Session() as sess:
    sess.run(...)
#这样就可以了,不需要调用close来关闭会话,当上下文退出时会话关闭和资源释放也自动完成了。

TensorFlow不会自动生成默认会话,而是需要手动指定。当默认的会话被指定以后可以通过tf.Tensor.eval函数来计算一个张量的取值。

#通过设定默认会话计算张量的取值
sess = tf.Session()
with sess.as_default():
    print(result.eval())
#下面代码同样可以实现上述代码的功能
sess = tf.Session()
#下面两个命令都可以
print(sess.run(result))
print(result.eval(sessiont=sess))

在交互式环境下,通过设置默认会话的方式来获取张量的取值会更加方便,TensorFlow提供了一个函数直接构建默认会话——tf.InteractiveSession

sess = tf.InteractiveSession()
print(result.eval())
sess.close()

你可能感兴趣的:(MachineLearning,机器学习,TensorFlow)