本文适用于TensorFlow2.0版本。
TensorFlow内部数据保存在张量(Tensor)对象上,所有运算也基于张量对象。复杂神经网络算法本质上就是各种张量相乘、相加等基本运算操作的组合。
数据类型
数值类型
- 标量
- 向量
- 矩阵
- 张量(Tensor)
必须通过TensorFlow规定的方式去创建张量,不能使用Python语言的标准向量创建方式。
aa = tf.constant(1.2) # 创建标量
与标量不同,向量的定义须通过 List 类型传给 tf.constant()。
创建一个元素的向量:
a = tf.constant([1.2])
创建 2 个元素的向量:
a = tf.constant([1,2, 3.])
字符串类型
a = tf.constant(‘Hello, Deep Learning.’)
在 tf.strings 模块中,提供了常见的字符串型的工具函数,如拼接 join(),长度 length(),切
分 split()等等。
深度学习算法主要还是以数值类型张量运算为主,字符串类型的数据使用频率较低。
布尔类型
布尔类型的张量只需要传入 Python 语言的布尔类型数据,转换成 TensorFlow 内部布尔型即可:
a = tf.constant(True)
TensorFlow 的布尔类型和 Python 语言的布尔类型并不对等,不能通用。
数值精度
常用的精度类型有 tf.int16, tf.int32, tf.int64, tf.float16, tf.float32,tf.float64,其中 tf.float64 即为 tf.double。
在创建张量时,可以指定张量的保存精度:
tf.constant(123456789, dtype=tf.int32)
保存精度过低时,数据 123456789 发生了溢出, 得到了错误的结果,一般使用tf.int32, tf.int64 精度。对于浮点数, 高精度的张量可以表示更精准的数据,例如采用
tf.float32 精度保存。
对于大部分深度学习算法,一般使用 tf.int32, tf.float32 可满足运算精度要求,部分对精度要求较高的算法,如强化学习,可以选择使用 tf.int64, tf.float64 精度保存张量。
读取精度
1 | In [15]: |
类型转换
系统的每个模块使用的数据类型、 数值精度可能各不相同, 对于不符合要求的张量的类型及精度, 需要通过 tf.cast 函数进行转换:
1 | In [16]: |
布尔型与整形之间相互转换也是合法的。
待优化张量
为了区分需要计算梯度信息的张量与不需要计算梯度信息的张量, TensorFlow 增加了一种专门的数据类型来支持梯度信息的记录: tf.Variable。
tf.Variable 类型在普通的张量类型基础上添加了 name, trainable 等属性来支持计算图的构建。
通过 tf.Variable()函数可以将普通张量转换为待优化张量:
1 | In [20]: |
除了通过普通张量方式创建 Variable, 也可以直接创建:
1 | In [21]: |
创建张量
在 TensorFlow 中,可以通过多种方式创建张量,如从 Python List 对象创建,从Numpy 数组创建,或者创建采样自某种已知分布的张量等。
从 Numpy, List 对象创建
通过 tf.convert_to_tensor 可以创建新 Tensor,并将保存在 Python List 对象或者 Numpy Array 对象中的数据导入到新 Tensor 中:
1 | In [22]: |
创建全0、全1张量
通过 tf.zeros()和 tf.ones()即可创建任意形状全 0 或全 1 的张量。例如,创建为 0 和为 1 的标量张量:
1 | In [24]: tf.zeros([]),tf.ones([]) |
创建全 1 的矩阵:
1 | In [27]: tf.ones([3,2]) |
创建自定义数值张量
全部初始化为某个自定义数值的张量,比如将张量的数值全部初始化为-1 等。
通过 tf.fill(shape, value)可以创建全为自定义数值 value 的张量。 例如,创建元素为-1的标量:
发布时间: 2019-11-21
最后更新: 2020-01-03
本文链接: https://juoyo.github.io/posts/a574e330.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!