TensorFlow进阶(一)
摘要:本文将继续讲解张量的合并与分割,范数统计,张量填充,限幅等进阶操作。
1、合并与分割
1.1 合并
合并就是将若干个张量在某一个维度上组合成一个张量。例如【2,5,8】和【3,5,8】组合成为【5,5,8】。合并的方式有两种拼接和堆叠,前者不会产生新的维度,后者会产生新的维度。
1.1.1 拼接
通过tf.concat(tensors, axis),其中tensors 保存了所有需要合并的张量List,axis 指定需要合并的维度。举例如下:
注意:非合并维度的长度应该长度一致。
1.1.2 堆叠
使用 tf.stack(tensors, axis)可以合并多个张量tensors,其中axis 指定插入新维度的位置,axis 的用法与tf.expand_dims 的一致,当axis ≥ 0时,在axis 之前插入;当axis < 0时,在axis 之后插入新维度。具体示意图如下:
注意:tf.stack 也需要满足张量堆叠合并条件,它需要所有合并的张量shape 完全一致才可合并。
1.2 分割
分割是合并的逆操作,就是将一个张量分成若干个张量。利用tf.split(x, axis, num_or_size_splits)可以完成张量的分割操作。
- x:待分割张量
- axis:分割的维度索引号
- num_or_size_splits:切割方案。当num_or_size_splits 为单个数值时,如10,表示切割为10 份;当num_or_size_splits 为List 时,每个元素表示每份的长度,如[2,4,2,2]表示切割为4 份,每份的长度分别为2,4,2,2
举例:
另外:如果希望在某个维度上全部按长度为1 的方式分割,还可以直接使用tf.unstack(x,axis)。这种方式是tf.split 的一种特殊情况,切割长度固定为1,只需要指定切割维度即可。
2、数据统计
在神经网络的计算当中经常需要计算数据的最大值、均值、范数等统计量。在TensorFlow当中为张量提供了相应的统计方法。
2.1 向量范数
常用的向量范数有绝对值求和型、平方和开方型、最大值型:
![]() |
![]() |
![]() |
可以通过tf.norm(x, ord)求解张量的L1, L2, ∞等范数,其中参数ord指定为1,2 时计算L1, L2 范数,指定为np.inf 时计算∞ −范数。举例如下:
2.2 求最大值最小值、均值、和
通过 tf.reduce_max, tf.reduce_min, tf.reduce_mean, tf.reduce_sum 可以求解张量在某个维度上的最大、最小、均值、和,也可以求全局最大、最小、均值、和信息。
2.2.1 求取最大值和最小值
2.2.2 求取均值、和
同样不指定维度,就会统计全局的均值、和
2.2.3 应用
线性规划的时候,求取平均误差:
softmax方法:
通过 tf.argmax(x, axis),tf.argmin(x, axis)可以求解在axis 轴上,x 的最大值、最小值所在的索引号:
3、张量比较
将真实值和预测值进行比较,这个时候就要用到张量的比较,多用来进行精度的计算。举例如下:
除了上面的tf.equal(a, b)函数之外,常用的函数还有这些:
4、填充与复制
4.1 填充
所谓的填充也是为了更方便、更准确和更合理的进行数据的计算,例如对图像进行卷积操作的时候就需要对图像的边缘进行填充,再例如对数据进行标准格式化的编码的时候也会常常用到填充。
填充操作可以通过tf.pad(x, paddings)函数实现,paddings 是包含了多个[𝐿𝑒𝑓𝑡 𝑃𝑎𝑑𝑑𝑖𝑛𝑔, 𝑅𝑖𝑔ℎ𝑡 𝑃𝑎𝑑𝑑𝑖𝑛𝑔]的嵌套方案List,如[[0,0], [2,1], [1,2]]表示第一个维度不填充,第二个维度左边(起始处)填充两个单元,右边(结束处)填充一个单元,第三个维度左边填充一个单元,右边填充两个单元。
4.2 复制
通过 tf.tile 函数(前面已经介绍过这个函数,现在是一个补充)可以在任意维度将数据重复复制多份,如shape 为[4,32,32,3]的数据,复制方案multiples=[2,3,3,1],即通道数据不复制,高宽方向分别复制2 份,图片数再复制1 份:
5、数据限幅
数据限幅的目的主要是实现ReLU函数,在TensorFlow中,可以通过tf.maximum(x, a)实现数据的下限幅:𝑥 ∈ [𝑎, +∞);可以通过tf.minimum(x, a)实现数据的上限幅:𝑥 ∈ (−∞, 𝑎],举例如下:
另外,两者还可以组合起来:
我们还可以使用tf.clip_by_value 实现上下限幅: