TensorFlow中,可以通过张量的ndim和shape成员属性获得张量的维度数和形状。
函数 | 说明 | 例子 |
---|---|---|
tf.reshape(x, shape) | 改变张量的形状 | tf.reshape(x, [4,2,2]) |
tf.expand_dims(x, axis) | 增加一个长度为1的维度 | tf.expand_dims(x, 2) |
tf.squeeze(x, axis) | 删除一个长度为1的维度 | tf.squeeze(x, 1) |
tf.transpose(x, perm) | 交换张量的维度 | tf.transpose(x, perm=[0,3,1,2]) |
tf.tile(x, multiples) | 完成数据在指定维度上的复制操作,multiples分别指定了每个维度上面的复制倍数,对应位置为1表明不复制,为2表明新长度为原来长度的2倍,以此类推。注意,会创建一个新的变量来保存复制后的变量 | tf.tile(x, multiples=[2, 1]) |
tf.broadcast_to(x, new_shape) | 显示完成数据的广播操作 | x=tf.random.normal([32,1]) tf.broadcast_to(x, [2,32,32,3]) |
加、减、乘、除 tf.add() tf.subtract() tf.multiply() tf.divide()
矩阵相乘 tf.matmul(a,b)
指数 tf.pow(x,a) x**a
自然指数 tf.exp(x)
自然对数 tf.math.log(x)
平方 tf.square(x)
平方根 tf.sqrt(x)
张量的合并可以使用拼接(Concatenate)和堆叠(Stack)操作实现。
拼接操作并不会产生新的维度,仅在现有的维度上合并,而堆叠会创建新维度。
拼接可以通过tf.concat(tensor, axis)函数
堆叠可以通过tf.stack(tesnsors, axis)函数
拼接:设张量A保存了某学校4个班级的成绩册,每个班级35个学生,共8门科目成绩,这张量A的shape为[4,35,8];同样的方式,张量B保存了其他6个班级的成绩册,shape为[6,35,8]。通过拼接这2份成绩册,便可得到学校所有班级的成绩册,记为张量C,shape为[10,35,8]。
堆叠:如果在合并数据时,希望创建一个新的维度,则需要使用tf.stack操作。考虑张量A保存了某个班级的成绩册,shape为[35,8],张量B保存了另一班级的成绩册,shape为[35,8]。合并这2个班级的数据时,则需要创建一个新维度,定义为班级维度,新维度可以选择放置在任意位置,一般根据大小维度的经验法则,将较大概念的班级维度放置在学生维度之前,这合并后的张量新的shape为[2,35,8]。
import tensorflow as tf
a = tf.random.normal([4, 35, 8])
b = tf.random.normal([6, 35, 8])
c = tf.concat([a, b], axis=0)
print("拼接后的shape:", c.shape)
x = tf.random.normal([35, 8])
y = tf.random.normal([35, 8])
z = tf.stack([x, y], axis=0)
print("堆叠后的shape:", z.shape)
输出结果:
拼接后的shape: (10, 35, 8)
堆叠后的shape: (2, 35, 8)
分割:合并操作的逆过程,将一个张量分拆为多个张量
1、分割使用tf.split(x, num_or_size_splits, axis)函数,注意:切割后的shape不变
x参数:待分割的张量
num_or_size_splits参数:切割方案。当num_or_size_splits为单个数值时,表示等长切割为10份;当num_or_size_splits为List时,List的每个元素表示每份的长度,如[2,4,2,2]表示切割为4份,每份的长度一次是2,4,2,2
axis参数:指定分割的维度索引号
2、如果希望在某个维度上全部按长度为1的方式分割,还可以使用tf.unstack(x,axis)函数。这种方式是tf.split的一种特殊情况,切割长度固定为1,只需要指定切割维度的索引号即可
import tensorflow as tf
x = tf.random.normal([10, 35, 8])
y = tf.split(x, [4, 2, 4], 0)
z = tf.unstack(x, axis=0)
print("split后的shape:", y[0].shape)
print("unstack后的shape:", z[0].shape)
输出结果:
split后的shape: (4, 35, 8)
unstack后的shape: (35, 8)
统计函数
1、向量范数:tf.norm(x,ord)
2、通过tf.reduce_max、tf.reduce_min、tf.reduce_mean、tf.reduce_sum函数可以求解出张量在某个维度上的最大、最小、均值、和
3、通过tf.argmax(x,axis)和tf.argmin(x,axis)可以求解在axis轴上,x的最大值、最小值所对应的索引号
比较函数
填充
填充:tf.pad(x, paddings)函数,参数padding是包含了多个[left, right]的嵌套方案List。注意:tf.pad函数利用0进行填充。
以28×28大小的图像为例,如果网络层所接受的数据高宽为32×32,这将28×28大小填充到32×32,可以选择在图像矩阵的上下左右方向各填充2个单元
import tensorflow as tf
x = tf.random.normal([4, 28, 28, 3])
y = tf.pad(x, [[0,0], [2,2], [2,2], [0,0]])
print("填充前的shape:", x.shape)
print("填充后的shape:", y.shape)
# 输出结果
填充前的shape: (4, 28, 28, 3)
填充后的shape: (4, 32, 32, 3)
数据限幅
在TensorFlow中,可以通过tf.maximum(x,a)实现数据的下限幅,即x∈[a,+∞);可以通过tf.minimum(x,a)实现数据的上限幅,即x∈(-∞,a];通过使用tf.clip_by_value(x, min, max)函数实现上下限幅。