什么是张量
TensorFlow中的Tensor表示张量,其实就是多维数组。在Python中,张量通常存储在NunPy数组中,仅作输入输出来使用;在TensorFlow中,所有的运算都是在张量之间进行。
名称 | 区别 |
---|---|
Python列表(list ) |
元素可使用不同的数据类型,可以嵌套运用;在内存中离散存放,是一个动态的指针数组,读写效率低,占用内存,且不适合做数值计算 |
NumPy数组(ndarray ) |
元素数据类型相同,在内存中连续存放,存储空间小,读写速度快 |
TensorFlow张量(Tensor ) |
高速运行于GPU和CPU上,支持CPU、嵌入式等多种计算环境,高速的实现神经网络和深度学习的复杂算法 |
张量概念的引入是为了方便数据输入,例如将字符串文本,图像、视频等数据数字化,以便后续更容易的处理。可以通俗的作如下理解:
阶 | 数学实例 | Pyhton例子 |
---|---|---|
0阶张量 | 标量 | a=512 |
1阶张量 | 矢量(大小和方向) | v = [1, 2, 3] |
2阶张量 | 矩阵 | n = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] |
3阶张量 | t = [ [ [1], [2], [3] ], [ [4], [5], [6] ], [ [7], [8], [9] ] ] | |
n阶张量 | … | … |
张量的基本操作
-
tf.constant(value,dtype,shape)
函数:创建张量
其中,value值一般是数字、Python列表和NymPy数组,也可以是布尔型等 -
tf.convert_to_tensor()
函数:将数组、列表、数字、布尔型、字符串转换为张量。 -
判断张量
tf.is_tensor()
函数:判断数据对象是否为张量(tf方法)isinstance()
函数:判断数据对象是否为张量(Python方法)
-
tf.cast(x,dtype)
函数:张量数据类型转换 -
张量元素的数据类型
数据类型 | 说明 | 数据类型 | 说明 |
---|---|---|---|
tf.int8 | 8位有符号整数 | tf.int16 | 16位有符号整数 |
tf.int32 | 32位有符号整数 | tf.int | 64位有符号整数 |
tf.unit8 | 8位无符号整数 | tf.complex64 | 复数的实部和虚部分别为32位浮点型 |
tf.float32 | 32位浮点数 | tf.float64 | 64位浮点数 |
tf.string | 字符串 | tf.bool | 布尔型 |
- 张量相关语法
函数 | 说明 |
---|---|
tf.constant(value,dtype,shape) | 创建张量 |
tf.convert_to_tensor() | 转换为张量 |
tf.zeros(shape,dtype=tf.float32) | 创建全0张量 |
tf.ones(shale,dtype=tf.float32) | 创建全1张量 |
tf.fill(shape,value) | 创建元素相同的张量 |
tf.random.normal() | 创建元素值符合正太分布的张量 |
tf.normal.trunvated_normal(shape,mean,stddev) | 创建元素值符合截取正太分布的张量 |
tf.normal.uniform(shape,minval,maxval,dtype) | 创建元素值为整数序列的张量 |
tf.random.shuffle() | 随机打乱 |
tf.range(start,limit,delta) | range函数创建序列 |
张量的维度变换
- 改变张量的形状
tf.reshape(tensor,shape)
函数
tf.reshape(tf.reshape(tf.range(24),[2,3,4]),[4,-1])
表示把0-23这24个数转换成3行4列的二维数组,[4, -1] 表示把二维数组转换成第一维长度为4,-1表示第二维长度根据张量元素总个数和其他维度长度自动推导出来
<tf.Tensor: id=7, shape=(4, 6), dtype=int32, numpy=
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])>
此操作只改变张量数组的视图,在NumPy数组中的存储数据并没有改变。
- 多维张量的轴(维度)
张量中轴的用法和NumPy数组中的一样,如图所示:
轴也可以是负数,表示往后向前索引,例如上图中三维张量的axis的值为也可以是-3,-2,-1
- 增加维度
tf.expand_dlim(tensor,axis)
,axis表示增加的维度,axis可负
x=tf.expand_dims(tf.constant([1,2]),axis=1)
x
将 shape = (2, ) 的一维张量增加1个维度后 shape = (2, 1)
<tf.Tensor: id=10, shape=(2, 1), dtype=int32, numpy=
array([[1],
[2]])>
- 删除维度
tf.squeeze(tensor,axis)
,只能删除长度为1的维度,axis省略时删除所有长度为1的维度
y=tf.squeeze(x,axis=1)
y
<tf.Tensor: id=11, shape=(2,), dtype=int32, numpy=array([1, 2])>
增加维度和删除维度只改变了张量的视图,不会改变张量的存储。
- 交换维度
tf.transpose(a,perm)
,perm表示轴的顺序,值空时表示转置。
tf.transpose(tf.reshape(tf.range(24),[2,3,4]),perm=[1,<