Tensor是什么

1593005657857

张量的维度也称作 (Axis)

一般把标量、向量、矩阵也统称为张量

TF中的数据类型

数值,布尔,字符串

1593005815473

1.数值类型

  • 在tf中创建标量

1593007641502

使用.numpy可以返回Numpy.array类型的数据

1593007850367

  • 在tf中创建向量

此时,必须使用List容器传值

1593008167211

  • 在tf中创建矩阵

1593008321293

  • 在tf中创建三维张量

1593008451041

2.字符串类型

1593008677010

不怎么用,Python内置的字符串方法已经足够

3.布尔类型

1593008933611

tf的布尔类型和Python内置的布尔类型不等价

1593009057564

类型转换

numpy ==> tensor

1593010178992

一般的,使用cast函数可完成不同数据类型,数据精度之间的转换

int ==> bool

1593010394808

bool ==> int

1593010461311

待优化的张量

对于一些需要训练优化的参数,可设置tf.Variable类型

比如神经网络中,输入的X不需要包装成该类型,而w和b需要

1593010655325

name和trainable是Variable特有的属性

创建张量

从数组,列表中创建

convert_to_tensorconstant作用一样,都是创建张量

1593094389804

创建全0或全1的张量

标量

1593094723419

向量

1593094808610

矩阵

1593094882676

可以使用tf.zeros_like()tf.ones_like()创建一个与某张量维度一样的新的张量

1593095032875

创建自定义张量

1593095172020

创建服从标准正态分布的张量

1593095284062

创建服从普通正态分布的张量

1593095347895

创建服从均匀分布的张量

1593095553585

创建序列

和Python内置的range()很相似

1593095679152

索引

创建一个张量:4张32*32的彩色图片

1
x=tf.random.normal([4,32,32,3])

取第一张图片的数据

1593266008264

取第一张图片的第2行

1593266059691

取第 1 张图片,第 2 行,第 3 列的数据

1593266120721

取第 3 张图片,第 2 行,第 1 列的像素, B 通道(第 2 个通道)颜色强度值

1593266191901

切片

和Python自带的切片方法很相似,只不过维度较高

选取前两张图片

1593266406409

读取第一张图片

1593266627930

::可以省略为一个:

1593266720266

切片方法汇总

1593266512050

和Python一样,step可为负

1
x=tf.range(9)

1593266885835

间隔选取与逆序间隔选取

1593266944606

行列逆序间隔选取第1张图片

1593267047589

取G通道数据

1593267109700

这样也可以取到G通道数据

1593267165176

读取第 1~2 张图片的 G/B 通道数据

1593267278544

读取最后两张图片

1593267317724

1593267344439

selective indexing

更灵活的切片方式

tf.gather

假设是4个班级,每个班级35个学生,每个学生有8门课的成绩

这里只是做演示,所以使用了随机生成的数据

1
a=tf.random.normal([4,35,8])

选取第2和3班所有学生的所有成绩

1593267830711

它等价于

1
a[2:4]

选取每个班级中第2,3,7,9个学生的所有成绩

1593268055234

维度变换

改变视图

1593269142426

ndim ==> 查看张量的维数

shape ==> 查看张量的形状列表

1593269216141

当不确定某一维度大小时,可以写-1,会自动推导出其值(类似numpy)

1593269320622

增删维度

注意,增删维度并不会改变存储的数据,只会改变数据的视图, 增加( 删除)维度只能增加(删除)长度为 1 的维度

增加维度

增加通道维度

1593269486416

增加图片数量维度

1593269764102

删除维度

删除图片数量维度

1593269867160

删除图片通道维度

1593269908585

交换维度

使用transpose

假设图片张量shape为[2,32,32,,3],分别代表[b,h,w,c]

现在想要改为[b,c,h,w]

则新的维度的索引号分别对应旧维度的[0,3,1,2]

所以perm=[0,3,1,2]

1593270347042

看,此时shape已经改变

复制数据

使用tf.tile()

复制向量

1593270778754

复制矩阵

1593270950423

但这种方式计算开销大,所以有了广播机制

Broadcasing(广播机制、自动扩展机制)

在逻辑上扩展张量数据的形状, 但是只会在需要时才会执行实际存储复制操作

效果同tf.tile()

该操作对用户透明:

1593271236867

在上面的操作中,b的维度和x@w的维度不一样,但是却能做运算

原因就是广播机制的存在

tf中的数学运算

矩阵乘法

在tf中,当张量维度大于2时,TF会选择两个张量的最后两个维度做矩阵乘法

A和B能够做矩阵相乘的条件是,A的倒数第一个维度长度(列)和B的倒数第二个维度长度(行)必须相等

比如张量 a shape:[4,3,28,32]可以与张量 b shape:[4,3,32,2]可以进行矩阵相乘 ,因为[28,32]与[32,2]的矩阵可以做矩阵乘法

1593271674800

也支持广播机制

1593271753487

上述运算前,先将b扩展为shape:[4,32,16],再与a做批量形式的矩阵乘法