Tensorflow:张量(Tensor)的创建及其基础操作
Tensorflow版本:V2.8.0
Tensorflow中所有的运算操作都是基于张量进行的。Tensorflow中的张量Tensor是具有统一类型的多维数组。这篇博文主要介绍张量的创建及基础操作。
1. 张量的创建
Tensorflow中的数值类型数据根据其为度数划分,可以分为:标量、向量、矩阵、张量。而Tensorflow中的张量一般指维度数 > 2 >2 >2的数组(但这里不做区分)。
1.1 tf.constant()方法
tf.constant()是一种常用的张量创建方法。具体代码如下:
这里有一点要注意,不同数值精度的张量不能直接进行计算,强制转化(tf.cast)之后才可以进行计算。具体如下:
1.2 创建特殊张量
Tensorflow中有一些特殊的张量,比如全0或全1张量、自定义数值张量、符合特定分布的张量以及序列型张量。
- 创建全0、全1或自定义数值的张量。这种方法创建的张量中的元素值都是一样的。
- 创建符合特定分布的张量。
1.3 待优化张量
前述使用tf.constant()方法创建的张量其实是常量张量,是不可变的张量。但在神经网络模型的训练中,尤其是
W
W
W和
b
b
b,需求不断地调整,这个时候再使用不可变张量就不合适了,所以Tensorflow中又提出了另一类型的张量:tf.Variable。其具体定义如下:
1.4 其他tf.xx_initializer()类方法
Tensorflow中有几个以initializer结尾的方法,这几个方法的使用有一些特殊,因为这些方法得到的并不是张量,而是一个可调用对象。下面以tf.random_uniform_initializer()为例进行说明。具体如下:
1.5 其他类型的张量
除了数值型的张量外,还可以创建布尔类型和字符串类型的张量。tf.strings模块提供了常见的字符串类型的工具函数,具体如下:
2. 基础操作
Tensorflow中张量的基础操作很多都与Python中的Numpy类似,比如切片索引等。所以这里只会关注与Numpy中不同的部分。
2.1 维度变换
Tensorflow中基本的维度变换操作主要有以下几种:改变视图reshape(这里不介绍了)、插入新维度expand_dims、删除维度squeeze、交换维度transpose、复制数据tile等。具体操作如下:
- 维度变换
这里要注意,tf.expand_dims()和tf.squeeze()方法可以导致张量维度shape(又叫视图)的改变,但不会导致数据的改变(张量的总数据元素个数及数据在内存中的存储顺序都不会改变),改变的仅仅是数据的理解方式。但是tf.tanspose()方法会改变张量中数据元素的存储顺序。 - 复制数据
Tensorflow中也有类似numpy的广播机制,所以复制数据步骤一般不需要人工操作。但是广播机制并不会对数据真正对数据进行复制,节省了计算资源。
2.2 张量合并
张量的合并是指将多个张量在某个维度上合并为一个张量。Tensorflow中提供了两个方法进行张量合并。
- tf.concat()拼接方法
使用tf.concat()方法对多个张量进行合并时,除了合并维度,在非合并维度上的长度必须一致。该方法得到的合并后的张量不会产生新的维度,其在合并维度上的长度对所有张量在该维度上的长度之和。
- tf.stack()堆叠方法
使用tf.stack()方法对多个张量进行合并时,所有待合并的张量的shape必须完全相等才可以。并且该方法得到的张量会新增一个维度。tf.stack()中的参数axis可以用来制定新增维度的位置。这里的axis可以为正也可以为负。当axis ≥ 0 \geq0 ≥0时,在axis之前插入;否则在axis之后插入。
下面仅以d的计算进行就拆解,来详细看看tf.stack()的具体操作流程。具体如下:
2.3 张量分割
张量合并的逆过程即为张量分割,可以将一个张量在指定维度上分割成多个张量。具体如下:
除了使用tf.split()方法之外,若希望将张量在某个维度上全部按长度为1的方式分割,可以直接使用tf.unstack()方法。具体如下:
参考文献
- https://tensorflow.google.cn/guide/tensor
- Tensorflow深度学习
更多推荐
所有评论(0)