基本的数值计算相关操作
摘自 https://blog.csdn.net/zywvvd/article/details/78593618
一般前提条件为参与运算的数据类型相同。这些操作可以直接在tensorflow.Session
中执行。
# 常量的定义
# 其中若data为浮点数,而不显式声明dtype的话,dtype将被隐式地设定为tf.float32
tf.constant(data, dtype)
# 变量类型转换
tf.cast(data, dtype)
# 算术操作符:+ - * / %
tf.add(x, y, name=None) # 加法(支持广播)
tf.subtract(x, y, name=None) # 减法
tf.multiply(x, y, name=None) # 元素级乘法 -> 矩阵乘法为tf.matmul()
tf.divide(x, y, name=None) # 浮点除法, 返回浮点数
tf.mod(x, y, name=None) # 取余
# 幂指对数操作符:^ ^2 ^0.5 e^ ln
tf.pow(x, y, name=None) # 幂次方
tf.square(x, name=None) # 平方
tf.sqrt(x, name=None) # 开根号,必须传入浮点数或复数
tf.exp(x, name=None) # 计算 e 的次方
tf.log(x, name=None) # 以 e 为底,必须传入浮点数或复数
# 取符号、负、倒数、绝对值、近似、两数中较大/小的
tf.negative(x, name=None) # 取负(y = -x)
tf.sign(x, name=None) # 返回 x 的符号
tf.reciprocal(x, name=None) # 取倒数
tf.abs(x, name=None) # 求绝对值
tf.round(x, name=None) # 四舍五入
tf.ceil(x, name=None) # 向上取整
tf.floor(x, name=None) # 向下取整
tf.rint(x, name=None) # 取最接近的整数
tf.maximum(x, y, name=None) # 返回两tensor中的最大值 (x > y ? x : y)
tf.minimum(x, y, name=None) # 返回两tensor中的最小值 (x < y ? x : y)
# 三角函数和反三角函数
tf.cos(x, name=None)
tf.sin(x, name=None)
tf.tan(x, name=None)
tf.acos(x, name=None)
tf.asin(x, name=None)
tf.atan(x, name=None)
# 其它
tf.div(x, y, name=None) # python 2.7 除法, x/y-->int or x/float(y)-->float
tf.truediv(x, y, name=None) # python 3 除法, x/y-->float
tf.floordiv(x, y, name=None) # python 3 除法, x//y-->int
tf.realdiv(x, y, name=None)
tf.truncatediv(x, y, name=None)
tf.floor_div(x, y, name=None)
tf.truncatemod(x, y, name=None)
tf.floormod(x, y, name=None)
tf.cross(x, y, name=None)
tf.add_n(inputs, name=None) # inputs: A list of Tensor objects, each with same shape and type
tf.squared_difference(x, y, name=None)
需要注意的一点是,由于TensorFlow的编程模型为流图模式,实际上在运行过程中每个张量都只会被计算一次,因而每次定义新Tensor的时候,只是会把旧Tensor的引用去除,旧Tensor的操作还是会在流图中运行。因而,若是定义了一个语法错误的Tensor的话就麻烦了,会直接报错。。。(惨痛的教训)
20190724 目前还没发现Python可以从流图中删除Tensor的方法,StackOverflow和GitHub上都说没有可行的办法,“没有办法干净利落地从流图中删除一个结点”。因而只有另一个方法:在必要情况下换用新图。使用tf.reset_default_graph()
也没有用,根据实测,它只会“清空”默认图,可以定义新变量,但是只能运行旧的流图。也就是说实际上鸟用没有
变量与作用域
改编自https://www.jianshu.com/p/2061b221cd8f , https://www.cnblogs.com/esCharacter/p/7872064.html
根据定义,tensorflow.Variable
可以用于定义一个变量。变量之间的运算被定义为Tensor,中文名称为张量,是物理学中一种不随坐标系改变而发生变化的物理量,在TensorFlow中为运算操作的表达方式。(然而由于在下数学能力实在缺乏,只能Python编程中近似将其理解为多维矩阵)使用Variable
类的构造函数进行变量定义要求非空的初始化值。对应有一个方法可以达到相似的目的:tensorflow.get_variable()
。两者的联系与区别如下:
|
tensorflow.Variable() |
tensorflow.get_variable() |
命名重复 |
新变量自动重命名 |
报错 |
对象引用 |
每次调用创建新对象 |
在同一作用域下可以引用同名对象 |
根据作者描述,在通过tensorflow.variable_scope()
定义作用域后,可以通过tensorflow.get_variable()
进行变量的重用。其意义在于,可以通过作用域的临时定义(with tf.Graph().as_default():
)进行上下文的切换,提供了便捷的变量存取方法。
tensorflow.Variable
(tensorflow.Tensor
)语句只会构建计算图。这些tensorflow.Tensor
对象仅代表将要运行的操作的结果,是一种流图语言的定义语句,因而并不可以直接输出,需要在tensorflow.Session
里运行后获得结果。返回值为numpy.ndarray
格式。
部分代码如下:
a = tf.Variable([[1,2],[3,4]], name='a')
sess.run(a)
完整执行过程将于下一节 [tensorflow“执行器” session
] 中讲述。
tensorflow“执行器” Session
根据字面意义上理解,session可以理解为会话,也就是说相当于启动了一个“执行器”。以我初学者的个人简介来看,就像是一套净化水装置的入口开关开启,接下来就可以装入数据进行处理了。上一节 [变量与作用域] 中的sess
就是这里的tensorflow.Session
。sess的创建方式很简单:
import tensorflow as tf
sess = tf.Session()
但是若是在创建完Session
之后将上一节的代码复制粘贴入运行,会出现这么一个问题:
tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value Variable
根据字面意思,显然是变量未初始化。若是需要使用tensorflow.Variable
一类的对象变量的话,需要先在Session
中进行初始化:
sess.run(tf.global_variables_initializer())
然后可以获得结果:
>>> sess.run(a)
array([[1, 2],
[3, 4]])
可以使用sess.close()
手动关闭Session
。虽然GPU指示器显示Python仍然在占用cpu,但是重新建立会话
摘自官方文档:
可以将多个张量传递给tf.Session.run
。run
方法以透明方式处理元组或字典的任何组合,如下例所示:
print(sess.run({'ab':(a, b), 'total':total}))
它返回的结果拥有相同的布局结构:
{'total': 7.0, 'ab': (3.0, 4.0)}
因为字典没有排序规则,所以实际上对于使用影响不大。
限制运行时GPU内存占用的方法:
import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.3
sess = tf.Session(config=config)
通过设置per_process_gpu_memory_fraction
来限制GPU内存的使用比例。