深度学习之tensorflow计算图

之前的章节说到使用计算图可以很方便地计算偏导数,可大大加快神经网络逆传播地速度,tensorflow作为常用地深度学习库,本质上来说也是一个构建计算图与执行计算图的过程,下面我们将来学习在tensorflow中如何构建计算图。

图的节点

节点的初始化

计算图分为节点与操作2部分,其中节点对应为变量(如常量、矢量、矩阵、张量等),而在tensorflow中,我们可以通过 constantvariable 来建立节点。(注意:节点中并不保存数据,而是保存运算结果的引用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 节点的初始化
tf.constant(
value,
dtype=None,
shape=None,
name='Const',
verify_shape=False
)
tf.Variable(
initial_value=None,
trainable=True,
collections=None,
validate_shape=True,
caching_device=None,
name=None,
variable_def=None,
dtype=None,
expected_shape=None,
import_scope=None,
constraint=None
)

其中constant用于生成常数张量,而Variable生成变量张量,Variable()时需要指定初始值(也可指定初始形状),初始化后变量的形状和类型是固定的,如要更改形状,则必须使用assign操作且validate_shape=False,在运行其他操作前,必须对变量初始化,最简单的操作是使用tf.global_variables_initializer()进行全局初始化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 初始化变量
a = np.array([1, 2], dtype=np.int32)
w = tf.Variable([1,2])
y = tf.add(w,a)
init_op = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init_op)
w_new = tf.assign(w,y) # 将y的值赋给w
sess.run(w_new)
# tensorflow中有很多辅助函数来创建高阶张量
# 参考https://www.tensorflow.org/versions/master/api_guides/python/constant_op#Constant_Value_Tensors
# 2x2 全零矩阵
tf.zeros([2, 2])
# 为1的向量
tf.ones([6])
# 3x3x3张量,服从0~10的均匀分布
tf.random_uniform([3,3,3], minval=0, maxval=10)
# 服从0均值,标准差为2的正太分布
tf.random_normal([3,3,3], mean=0, stddev=2.0)

节点的数据类型

创建节点时,如果未显示指定节点数据类型,则tf会根据python原生数据类型进行推断,推断过程不一定靠谱,建议自行指定数据类型。tf中的数据类型与numpy中的数据类型是兼容的,可以直接将np数组传入tf的计算图进行计算。

1
2
3
4
5
6
>>> a = np.array([1, 2], dtype=np.int32)
>>> b = np.array([3, 4], dtype=np.int32)
>>> c = tf.add(a, b)
>>> sess = tf.Session()
>>> sess.run(c)
array([4, 6])

tf中常用的数据类型如下:

图的操作

操作代表张量的计算,它以零或更多张量对象作为输入,并产生零或多个张量对象作为输出。该类型将由python节点构造器产生(比如tf.matmul )或 tf.Graph.create_op,并且需要使用tf.Session.run 来执行操作。

tf中常用的算术运算符如下:

另外tf也进行了运算符的重载,如tf.add(a,b)a+b等价。

图与会话

包含一组tf操作对象,它们代表计算单元、张量对象、表示操作之间流动的数据单元。

在tensorflow库在被加载的时候,它会自动创建一个Graph对象,并把它作为默认的数据流图。我们也可以通过tf.Graph()创建新图,不同图是数据隔离的哦。

1
2
3
4
5
6
7
8
9
10
11
g = tf.Graph()
with g.as_default():
# Define operations and tensors in `g`.
# 向指定图添加张量或运算
c = tf.constant(30.0)
assert c.graph is g
##也可以使用tf.get_default_graph()获得默认图,也可在基础上加入节点或子图
g1 = tf.get_default_graph()
c = tf.constant(4.0)
assert c.graph is tf.get_default_graph()

会话

会话对象(tf.Session)封装执行操作对象的环境。Session.run()后需要使用Session.close()释放会话关联的所有资源

1
2
3
4
5
6
7
8
9
10
11
12
13
# Using the `close()` method.
sess = tf.Session()
sess.run(...)
sess.close()
# Using the context manager.
with tf.Session() as sess:
sess.run(...)
# 以下命令等价
result = tf.add(a,b)
result.eval(session=sess)
sess.run(result)

本文标题:深度学习之tensorflow计算图

文章作者:微石

发布时间:2018年07月27日 - 10:07

最后更新:2018年07月29日 - 17:07

原始链接:akihoo.github.io/posts/847b3d41.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。