TensorFlow基础知识:计算图中的Op,边,和张量

tensorflow是一个深度学习的开源工具,它的设计理念主要有以下两点:
  1.计算图的定义和图的运算是分开的.tensorflow是一个’符号主义的库’.编程模式分为两类,命令式(imperative style)和符号式(symbolic style).命令式的程序很容易理解和调试,它按照原有的逻辑运行.符号式则相反,在现有的深度学习框架中,torch是命令式的,Caffe,Mxnet是两种模式的混合,tensorflow完全采用符号式.符号式编程,一般先定义各种变量,然后建立一个计算图(数据流图),计算图指定了各个变量之间的计算关系,此时对计算图进行编译,没有任何输出,计算图还是一个空壳,只有把需要运算的输入放入后,才会在模型中形成数据流.形成输出.
  2.tensorflow中的运算都要放在图中,图中的运算进行发生在回话启动后(session),给节点填充数据,进行运算,关闭会话,结束运算.

# 命令式
c = 1 + 2
print (c)
3
# 符号式
import tensorflow as tf
d = tf.add(1, 2)
print (d)
Tensor("Add:0", shape=(), dtype=int32)

上面输出的结果是一个张量d的信息
张量的三个属性,name,shape,dtype.
1.name第一个属性是张量的一个标识符name=’参数为字符串类型’,如果没有指定,会根据张量是通过什么操作(运算)自动添加,后面的0表示张量d是计算节点add的第一个输出.
2.shape,描述张量的维度信息
3.dtype,张量的类型,tensorflow会对参与计算张量的类型进行检查,不匹配会报错

在命令式编程中,运行即输出结果,在tensorflow中,加法运算并没有发生.tf.add(1, 2)只是定义了一个操作.操作要在session,开启后,才会执行.print(d)只是将节点d添加到了计算图当中.

# 创建图
a = tf.constant(1, name='input_a')
b = tf.constant(2, name='input_b')
f = tf.add(a,b, name='add_ab')

  上面创建的每一个节点(比如a这个节点),都被称为一个Operation(Op),每个Op都可以接受/输出0个或多个tensor对象.上面的例子中,tf.constant()创建了一个常量,也就是一个Op,该函数会自动把一个标量转换为一个tensor对象.此外还传入了一个可选的字符串参数name,对节点(Op)进行标识,除了name属性,还有dtype属性,指定数据类型,(dtype=tf.int32).如果在创建节点时,没有指定dtype,没有小数点的数默认为tf.int32,有小数点的默认为tf.float32

# 创建会话
sess = tf.Session()
# 计算f这个张量(对应Op:tf.add())
print sess.run(f)
# 关闭会话
sess.close()
3

计算图中的边

计算图中的边包含这两种关系:数据依赖和控制依赖.(不需要对计算图中的边进行定义,因为在tensorflow中创建节点是已包含了相应的Op完成计算所需的全部输入,tensorflow会自动绘制必要的连接)
实线的边代表着数据依赖.标识连接的两个节点之间有tensor的流动(传递)
虚线的边代表着控制依赖.用于控制操作的运行,确保happens-before关系,连接的节点之间间没有tensor的传递,但是源节点必须在目的节点执行前完成执行.

tensorflow中的节点(Op)

  在上面创建图中,每一个节点代表着一个操作(operation,Op),一般用来表示施加的的数学运算,也可以表示数据输入的起点以及输出的终点,或者是读取/写入持久变量(persistent veriable)的终点,Op也可用于状态初始化的任务.tensorflow中的其他数学运算tf.mul(),tf.sub,tf.div,tf.mod分别是乘法,减法,除法,取模. tf.div()执行的除法取决于提供的数据类型,如果要使用浮点数除法,可以使用:tf.truediv()
Tensorflow中还有很多操作函数,与之相关的代码都在tensorflow/python/ops/目录下的文件中

 
tensorflow中的张量(tensor):
在tensorflow中所有的数据都是以张量的形式来表示的,张量可以理解为多维数组,零阶张量表示标量(一个数),一阶张量就是一个向量类似一维数组,二阶张量相当于二维数组.但是张量在tensorflow中并不是直接采用数组的形式,在tensorflow中张量不用来保存结果,它是对计算结果的引用,保存的是得到计算结果的计算过程.
仍以上面例子:
 

a = tf.constant(1, name='input_a')
b = tf.constant(2, name='input_b')
f = tf.add(a,b, name='add_ab')
print (a)
print (b)
print (f)

从输出的结果可以发现a,b是对生成常量(零阶张量)这个运算结果的引用(生成张量运算过程保存),f是对两个常量求和运算的引用
Tensor(“input_a_5:0”, shape=(), dtype=int32)
Tensor(“input_b_6:0”, shape=(), dtype=int32)
Tensor(“add_ab_5:0”, shape=(), dtype=int32)

sess = tf.Session()
# 通过张量获取计算结果
print sess.run(a)
print sess.run(f)
sess.close()

 
张量两个用途:
1.对节点计算结果的引用,(计算过程的保存)
2.通过张量来或去计算结果
 
在tensorflow中Op接受标准的Python数据类型,整数,浮点数,字符串,并将它们转换为张量
手工创建tensor的方式:
1.Python原生数据类型
  tensorflow接收,python数值,布尔值,字符串或构成的列表.单个数值被转换为0阶张量,列表转换为1阶张量,列表构成的列表转换为二阶张量.tensorflow中支持tf.float32和tf.float64浮点数类型,和tf.int8~int64的有符号整数类型,tf.uint8八位无符号整数,tf.string字符串,tf.bool布尔型,tf.complex64复数(实部和虚部分别为32为浮点型)还有用于量化Op的:tf.qint8,tf.qint16,tf.qunit8在tf中整数的数据类型很多,但是Python中所有的整数具有相同的类型,因此在Python原生数据类型传入是,tensorflow需要对数据类型进行推断,推断结果不一定靠谱.所以尽量不用Python原生数据类型.

2.Numpy数组

  numpy中的数据类型跟tensorflow中的数据类型是完全兼的,np.int32=tf.int32,所以任何的numpy数组都可以传递给tf的Op(Operation/节点) 建议显式声明对象类型
a = np.array([1, 2], dtype=np.int32)
b = np.array([3, 4], dtype=np.int32)
c = tf.add(a, b)

3.张量的shape

  每个张量对象都有一个属性shape,在计算图中可以通过tf.shape()函数来获取张量的形.这个获取张量shape的操作跟计算图中的其他Op是一样的,通过session对象得到

shape = tf.shape(a, name='tensor_a_shape')
print sess.run(shape)

在tensorflow中也支持和Python中一样的运算符重载


a = tf.constant(1, name='input_a')
b = tf.constant(2, name='input_b')
f = tf.add(a,b, name='add_ab') #与 f = a + b 是一样的
# 只不过使用运算符是,无法给Op的name属性指定值

注意:在tensorflow中 == 运算符不会返回一个布尔型的tensor对象,它判断的是两个tensor对象名是否引用了同一个对象,是返回True,否返回False.所以在判断两个张量的值是否相同的时候,使用tf.equal()和tf.not_equal()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值