TensorFlow基本概念

一、计算图

TensorFlow中两个最重要的概念,一个是Tensor,一个是Flow。Tensor就是张量,Flow就是计算流。计算图中的每个节点就是一个张量,而张量之间的依赖关系就是计算流,也就是在计算图中从一个Tensor通过计算流到另一个Tensor。

import tensorflow as tf
a = tf.constant([1.0,2.0], name='a')
b = tf.constant([3.0,4.0], name='b')
result = a + b
在上述代码中,TensorFlow会自动将定义的计算a和b转化为计算图中的节点。在TensorFlow中,系统会自动维护一个默认的计算图。不同计算图上的张量和运算都不会共享,这里我们可以简单的将其理解为作用域的概念

通过tf.get_default_graph函数可以获取当前默认的计算图,通过tf.Graph()定义一个计算图。计算图除了可以用来隔离张量和计算,也可以在某个计算图中单独定义使用某个GPU设备。

在计算图中,可以通过集合collection来管理不同类别的资源,比如通过tf.add_to_collection函数可以将资源加入一个或多个集合中,然后通过tf.get_collection获取一个集合里面的所有资源。这里的资源可以是张量、变量或者运行TensorFlow程序所需要的队列资源等。

为了方便使用,TensorFlow也自动管理了一些最常用的集合:

 

二、张量(Tensor)

从TensorFlow的名字中就可以看出张量(Tensor)是一个很重要的概念,可以说tensorflow中的最基本单元。通俗理解就是在TensorFlow中都以Tensor为基本单元计算流的。也可以被理解为多维数组。在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程,需要通过会话session的run才能得到具体数字。

一个张量主要保存了三个属性:名字:name,维度:shape,类型:type。

 

 三、会话

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

在TensorFlow中,有两种用于运行计算图(graph)的会话(session)

  • tf.Session( )

  • tf.InteractivesSession( )

1)tf.Session( )

import tensorflow as tf

# 构建graph
a = tf.add(3, 5) 

# 运行graph
sess = tf.Session()  # 创建tf.Session的一个对象sess
print(sess.run(a)) 

sess.close()         # 关闭sess对象
#一个session可能会占用一些资源,比如变量、队列和读取器(reader)。我们使用sess.close()关闭会话或者使用上下文管理器释放这些不再使用的资源。

建议的写法:

import tensorflow as tf  

# 构建graph
matrix1 = tf.constant([[3., 3.]])  
matrix2 = tf.constant([[2.], [2.]])  

product = tf.matmul(matrix1, matrix2)  

# 运行graph
with tf.Session() as sess:          # 使用"with"语句,自动关闭会话
    print(sess.run(product))  

2) tf.InteractivesSession( )

当python编辑环境是shell、IPython等交互式环境时,我们使用类tf.InteractiveSession代替类tf.Session,用方法tensor.eval( ),operation.run( ) 代替sess.run( ),这样可避免用一个变量sess来持有会话。其中更多地使用 tensor.eval(),所有的表达式都可以看作是tensor。
// 进入python3交互式环境
# python3

>>> import tensorflow as tf  

// 进入一个交互式会话
>>> sess = tf.InteractiveSession()

>>> a = tf.constant(5.0)
>>> b = tf.constant(6.0)
>>> c = a * b

// We can just use 'c.eval()' without passing 'sess'
>>> print(c.eval()) 

>>> sess.close()   // 关闭交互式会话

>>> exit()        // 退出python3交互式环境

 四、变量

在TensorFlow中变量tf.Variable的作用就是保存和更新神经网络中的参数的,和其它编程语言类似,TensorFlow中的变量也需要指定初始值。变量也是张量

weights=tf.Variable(tf.random_normal([2,3],stddev=2))
#初始化变量,变量的初始值可以设置成随机数,常数或者通过其它变量的初始值计算得到。
#tf.random_normal([2,3],stddev=2)会产生一个2x3的矩阵,矩阵中的元素是均值为0,标准差为2的正态分布生成的随机数。
通过其它变量来初始化
w2=tf.Variable(weights.initialized_value())

TensorFlow随机数生成函数

TensorFlow常数生成函数

 要使用变量,首先要通过session的run运行初始化变量,因为变量也是一个张量,上面的只是定义了计算过程,并没有真正执行:

 

sess.run(w2.initializer)#初始化w2真正赋值
#一次初始化所有变量
init_op=tf.initialize_all_variables()
sess.run(init_op)

 

五、placeholder

变量主要针对的神经网络中的参数,placeholder主要针对的样本中的输入数据X及其对应的Y。因为如果每轮迭代中输入数据都都以 x=tf.constant([[3., 3.]])形式输入的话(必须转换成张量),计算图将会非常之大,这是因为每生成一个常量,都会在计算图中增加一个节点,如果经过成千上万次的迭代的话,那就会生成非常多的节点,利用率也比较低。TensorFlow提供了placeholder机制来解决了这个问题,placeholder相当于定义了一个位置,这个位置中的数据在运行时再指定。这样程序中就不需要生成大量的常量来提供输入数据,而只需要将数据通过placeholder传入Tensorflow计算图。

import tensorflow as tf
import numpy as np

x = np.ones((2, 3))
y = np.ones((3, 2)) 

input1 = tf.placeholder(tf.int32)
input2 = tf.placeholder(tf.int32)

output = tf.matmul(input1, input2)

with tf.Session() as sess:
    print(sess.run(output, feed_dict = {input1:x, input2:y}))

使用tf.placeholder( ),为某些操作的输入创建占位符,其中feed_dict是一个字典,在字典中需要给出每个用到的placeholder的取值,如果某个需要的placeholder没有被指定取值程序就会报错。注意,feed注入的值不能是tf的tensor对象,应该是Python常量、字符串、列表、numpy ndarrays,或者TensorHandles。

 

posted @ 2019-11-17 19:03  光彩照人  阅读(1048)  评论(0编辑  收藏  举报