目录
tf.expand_dims() 和 tf.squeeze()
前言
这一篇文章主要分两部分讲解张量之间的数据处理,第一部分主要是张量的维度变换,包括张量形状的改变、维度的增加和删除、转置以及张量的拼接;第二部分是数据的采样,主要以鸢尾花数据为例讲解特定行、列的选取
函数表
将全文讲解过的函数归纳于此表,便于参考和查询
形状处理部分 | 解释 |
tf.reshape(tensor,shape) | 改变形状 |
tf.concat(tensors,axis) | 张量拼接 |
tf.expand_dims(input,axis) | 增加维度 |
tf.squeeze(input,axis) | 删除维度 |
tf.transpose(a,perm) | 转置 |
数据取样(张量以tf1为例) | 解释 |
tf.gather(params,axis,indices) | 按索引值取值 |
维度变换
在讲解函数之前,为了更好的理解“维”这个概念,这里有必要做出个人对TensorFlow中的“维”的看法,首先这个维度最初的定义是为了咱们更好地去理解数据间的各种排列组合而人为定义的,比如我们习惯说的零维数据就是一个点,一维数据就是一条线,二维数据就是一个面,三维便是一个体;每多一个维度,数据就会多向着某个方向展开;而张量中也谈及维度的概念,我们说三维张量其实就是三维数组的意思,但是有时候也会习惯性将数据的行数和列数称之为“维”,比如三行两列的二维张量,其在行上面(从上往下看)就有三个维(三行),显然依次类推,在列上面(左右看)就有两个维(两列);其实也是一种叫法的不统一,大家在理解这些概念的时候就见仁见智了。
-
tf.reshape()
tf.reshape(tensor,shape);第一个参数tensor是传入的张量,第二个参数shape是将张量重组成需要的形状。对于shape这个参数,作者略微提及几点:1、形状改变后,数据填入新形状的顺序是按照“从左至右、从上至下”的顺序从原张量中取出数据然后按照这个原则将数据填入新张量;2、新张量形状维度参数的乘积必须等于原数据维度参数的乘积,比如一个4X4的二维张量,其两个维度参数的乘积是16,那么新张量的维度参数的乘积必须也是16,比如这组数据可以填入一个2X2X4的三维张量
- 将 1X16 的张量形状改变成 2X8
import tensorflow as tf
tf1 = tf.range(16) # 创建从0到15的张量
tf2 = tf.reshape(tf1,[2,8]) # 将其改变成一个 2 X 8 的二维数组,数据排序规则是从左往右,排满之后从上向下排
output:
>>>print(tf1)
tf.Tensor([ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15], shape=(16,), dtype=int32)
>>>print(tf2)
tf.Tensor(
[[ 0 1 2 3 4 5 6 7]
[ 8 9 10