首页 > 其他 > 详细

TensorFlow基础知识(二)

时间:2019-11-20 18:42:26      阅读:80      评论:0      收藏:0      [点我收藏+]

摘要:本文是TensorFlow基础知识的第二部分。

1、张量的典型应用

1.1 标量

一般用来进行误差值的表示、各种测量指标的表示,例如:准确率、精度、召回率等。下面举例:

技术分享图片

1.2 向量

在神经网络当中,向量更是十分的常见,例如神经元的偏置值b一般就要用向量来表示,这里的向量就是【b1,b2】T

技术分享图片

例如我们现在要创建一个输入为5个结点,输出层为4个结点的线性网络层,那么此时创建的网络偏置值应该就是4维的,并且在TensorFlow中默认初始值为0:

技术分享图片

1.3 矩阵

很多情况下会用到矩阵,最典型的就是权重的表示。例如我们创建一个线性网络层:

  1. 输入:【2,4】,也就是输入特征的长度为4,样本数为2;
  2. 输出:【3,2】,也就是有三个输出,两个样本;
  3. 权值:【4,3】

具体如下:

技术分享图片

再例如,我们可以通过Dence方法创建一个网络层,然后通过kernel属性可以直接查看权重矩阵的形式,我们设计如下的网络层:输入4个结点,输出3个结点:

技术分享图片

1.4 三维张量和四维张量

一般来讲:语义信息用三维张量表示,第一位表示句子个数,第二位表示句子的长度,第三位表示句子中单词的编码;图像信息用四维张量表示:第一位表示图像的数目,第二位、第三位表示图像的宽和高、第四位表示图像的通道数。

2、索引和切片

2.1 索引

所谓索引就是获取某一个层面的张量的信息。有两种方式:

  • 中括号法下标法【】【】【】...
  • 逗号隔开法【,,,】

举例:我们对一张图像进行索引

第一种方法:

技术分享图片

 技术分享图片

技术分享图片

 第二种方法:

技术分享图片

2.2 切片

所谓切片就是获取张量中某一个小部分的信息:

方法:通过【??????????: ??????: ????????】切片方式可以方便地提取一段数据,其中start 为开始读取位置的索引,end 为结束读取位置的索引(不包含end 位),step 为读取步长,步长为负数,表示逆序。

例如:现在获取某一图像张量的第2,3张图像的信息:

技术分享图片

另外除了上面最标准的格式之外,我们还可以采用省略的方式,总结如下:

技术分享图片

举例:

  1. 读取第一张图像的全部信息:x[0,::]
  2. 读取所有图像所有通道的偶数行和偶数列:x[:,0:28:2,0:28:2,:]

还有一种省略的写法如下:

现在我们想要获取所有图像中的G通道的图像信息,可以采用【:,:,:,1】这样的形式,也就看出来如果数据的维度太多,那么就会比较麻烦,写很多的冒号,因此出现省略号的写法,总结如下:

技术分享图片

 举例:

  1. 获取第2,3张图像的G/B通道的数据:x[0:2,...,1:]
  2. 读取最后两张图像的信息:x[2:,...]
  3. 读取RG两个通道的数据:x[...,:2]

 3、维度变换

在神经网络当中有时我们需要将两个不同形状的张量进行加减操作,这个时候就要用到维度的变换。在TensorFlow当中,有改变视图reshape,插入新维度expand_dims,删除维度squeeze,交换维度transpose,复制数据tile等几种维度变换的方式。具体介绍如下:

3.1 改变视图reshape

这里主要是举例一个四维张量【2,4,4,3】的变化,特别需要注意的是我们可以改变张量的维度,但是有时候为了复现和数据还原等工作,我们必须考虑到不能随意改变内存当中张量的存储顺序,这一点应该尤其注意。

转换为【2,48】或者【2,-1】

技术分享图片

转换为【2,4,12】

技术分享图片

转换为【2,16,3】

技术分享图片

3.2 增删维度

3.2.1增加维度

通过tf.expand_dims(x, axis)可在指定的axis轴前(注意当axis为正时表示在该轴之前,如果为负时表示在该轴之后)可以插入一个新的维度:

技术分享图片

技术分享图片

3.2.2 删除维度

通过tf.squeeze(x, axis)函数,axis参数为待删除的维度的索引号(注意如果不指定索引号,默认删除大小为1的维度):

技术分享图片

总结:上面谈到的维度变换的方法本质上是不改变数据的存储方式,但是会改变计算机对数据的理解方式,是对同样一堆有序列的数据的不同组织。

3.3 交换维度

有时候为了适应某些以后的数据的组织形式,需要进行维度变换。

通过tf.transpose(x, perm)函数完成维度交换操作,其中perm 表示新维度的顺序List。

举例:考虑图片张量shape 为[2,4,4,3],图片数量、行、列、通道数的维度索引分别为0,1,2,3,如果需要交换为[??, ??, ?, ]格式,则新维度的排序为图片数量、通道数、行、列,对应的索引号为[0,3,1,2]:

技术分享图片

3.4 数据复制

通过tf.tile(x, multiples)函数完成数据在指定维度上的复制操作,multiples 分别指定了每个维度上面的复制倍数,对应位置为1 表明不复制,为2 表明新长度为原来的长度的2 倍,即数据复制一份,以此类推。

技术分享图片

4、Broadcasting

Broadcasting是TensorFlow中设计好的一种维度扩张机制,在上面的操作中,我们有时候为了可以实现相同shape的加减操作,我们需要将不符合要求的维度进行改变(主要就是维度插入和维度复制)后再进行操作,这是有些麻烦的,并且增加了计算量,于是产生了Broadcasting机制。

实现的步骤如下:

技术分享图片

解释:

首先将2 个shape 靠右对齐,对于通道维度c,张量的现长度为1,则默认此数据同样适合当前维度的其他位置,将数据逻辑上复制?? − 1份,长度变为c;对于不存在的b 和h 维度,则自动插入新维度,新维度长度为1,同时默认当前的数据普适于新维度的其他位置,即对于其它的图片、其他的行来说,与当前的这一行的数据完全一致。这样将数据b,h 维度的长度自动扩展为b,h。

举例:

技术分享图片

 从上面的例子可以看出:Broadcasting机制的核心思想是普适性,即同一份数据能普遍适合于其他位置(原始A的第二个维度为1,结合上面的图理解也就是c=1)。

举一个不能适应的例子:

技术分享图片

 可能会想到,靠右对齐之后2可以扩张成4,但是2并不具备普适性,当要求的对象是3时则无法完成,所以体现了核心思想——普适性。

有了Broadcasting以后,那么下面的式子就可以直接运算,其中缘由也就理解了,纬度不同却可以正常相加:

技术分享图片

原理图如下:

技术分享图片

TensorFlow基础知识(二)

原文:https://www.cnblogs.com/lzy820260594/p/11896711.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!