1运算操作的相关知识点
一个运算操作代表了一种类型的抽象运算,比如矩阵乘法或者向量加法。
一个运算操作可以有自己的属性,但是所有属性都必须被预先设置,或者能够在创建计算图时根据上下文推断出来。
通过设置运算操作的属性可以用来支持不同的tensor元素类型,比如让向量加法支持浮点或者整数。
运算核(kernel)是一个运算操作在某个具体的硬件(比如cpu或者gpu中)的实现。
在TensorFlow中,可以通过注册机制加入新的运算操作或者为已有的运算操作添加新的计算核。
与操作相关的API均位于tf.Operation类中
操作 | 描述 |
---|---|
tf.Operation.name | 操作的名称 |
tf.Operation.type | 操作的类型,如MatMul |
tf.Operation.inputs | 操作的输入 |
tf.Operation.outputs | 操作的输出 |
tf.Operation.run | 在会话中运行该操作 |
tf.Operation.get_attr | 获取操作的属性值 |
TensorFlow内建运算操作
运算类型 | 运算示例 |
---|---|
标量运算 | add、sub、mul、div、exp、log、greater、less、equal |
向量运算 | concat、slice、split、constant、rank、shape、shuffle |
矩阵运算 | matmul、matricinverse、matrixdeterminant |
带状态的运算 | variable、assign、assignadd |
神经网络组件 | softmax、sigmoid、relu、convolution2D、maxpooling |
储存,恢复 | save、restore |
队列及同步运算 | enqueue、dequeue、mutexAcquire、mutexrelease |
控制流 | merge、switch、enter、leave、nextInteration |
2操作的使用
下图显示了一个数据流图:
根据数据流图写出代码如下:
import tensorflow as tf
a = tf.constant(5, name="input_a")
b = tf.constant(3, name="input_b")
c = tf.multiply(a, b, name="mul_c")
d = tf.add(a, b, name="add_d")
e = tf.add(c, d, name="add_e")
通过会话运行最后结果e
sess = tf.Session()
sess.run(e)
输出:23
a = tf.constant(5, name="input_a")
b = tf.constant(3, name="input_b")
节点a和b,引用了Operation:tf.constant()。在TensorFlow中,数据流图中的每个节点都被称为一个Operation(简记Op)
c = tf.multiply(a, b, name="mul_c")
节点c使用了tf.multiply Op,节点c接收两个输入a和b,然后将它们的乘积输出。
3运算符重载
运算符重载
TensorFlow还对常见数学运算符进行了重载,以使乘法、加法、减法及其他常见运算更加简洁。如果运算符有一个或多个参数(操作对象)为Tensor对象,则会有一个TensorFlow Op被调用,并被添加到数据流图中。例如,可按照下列方式轻松地实现两个张量的加法:
假设a和b均为Tensor对象,且形状匹配
下面给出可用于张量的重载运算符的完整清单。
一元运算符
运算符 | 相关TensorFlow运算 | 描述 |
---|---|---|
-x | tf.neg() | 返回x中每个元素的相反数 |
~x | tf.logical_not() | 返回x中每个元素的逻辑非。只适用于dtype为tf.bool的Tensor对象 |
abs(x) | tf.abs() | 返回x中每个元素的绝对值 |
二元运算符
运算符 | 相关TensorFlow运算 | 描述 |
---|---|---|
x+y | tf.add() | 将x和y逐元素相加 |
x-y | tf.sub() | 将x和y逐元素相减 |
x*y | tf.mul() | 将x和y逐元素相乘 |
x/y(Python2.x) | tf.div() | 给定整数张量时,执行逐元素的整数除法;给定浮点型张量时,将执行浮点数(“真正的”)除法 |
x/y(Python3.x) | tf.truediv() | 逐元素的浮点数除法(包括分子分母为整数的情形) |
x//y(Python3.x) | tf.floordiv() | 逐元素的向下取整除法,不返回余数 |
x%y | tf.mod() | 逐元素取模 |
x**y | tf.pow() | 逐一计算x中的每个元素为底数,y中相应元素为指数时的幂 |
x | tf.less() | 逐元素地计算x<y的真值表 |
x<=y | tf.less_equal() | 逐元素地计算x≤y的真值表 |
x>y | tf.greater() | 逐元素地计算x>y的真值表 |
x>=y | tf.greater_equal() | 逐元素地计算x≥y的真值表 |
x&y | tf.logical_and() | 逐元素地计算x & y的真值表,每个元素的dtype属性必须为tf.bool |
x|y | tf.logical_or() | 逐元素地计算x|y的真值表,每个元素的dtype属性必须为tf.bool |
x^y | tf.logical_xor() | 逐元素地计算x^y的真值表,每个元素的dtype属性必须为tf.bool |
利用这些重载运算符可快速地对代码进行整合,但却无法为这些Op指定name值。如果需要为Op指定name值,请直接调用TensorFlow Op。
从技术角度讲,==运算符也被重载了,但它不会返回一个布尔型的Tensor对象。它所判断的是两个Tensor对象名是否引用了同一个对象,若是,则返回True,否则,返回False。这个功能主要是在TensorFlow内部使用。如果希望检查张量值是否相同,请使用tf.equal()和tf.not_equal()。
参考:
http://blog.csdn.net/linuxwindowsios/article/details/60571577
http://blog.csdn.net/linuxwindowsios/article/details/60571577