11. CNN Flatten Operation Visualized - Tensor Batch Processing For Deep Learning
这一节课我们将形象的对一个灰度图像张量进行flatten操作,并将展示如何在一个张量中flatten特定的轴。由于我们的张量是成批的,所以经常需要这种选择性的flatten操作。其实flatten操作是一种特殊的reshape操作,即将所有的轴都被挤压在 一起。
如果我们想把一个张量flatten,我们需要至少两个轴,这就使得我们从一个还没有平的东西开始。
下面是把这个18×18的图像压平成324的轴
这个就是flatten的输出,他的结果就是324,边缘的白色对应于图像的底部、顶部的白色。
在全连接层中的每个节点接受到这个被flatten的输出作为输入。
下面是代码实现flatten
我们有三个tensor,形状都是4×4的,秩为2的。我们可以把这个tensor看作是三张图片,他们被用来创建一个批次来传入CNN,记住,这里用一个张量来表示一个完整的批次,所以我们需要把这三个张量合成一个大的张量,它的轴是三个而不是两个
我们使用一个堆栈函数将三个张量的序列连接到一个新的轴上面
因为新的轴上有三个张量,所以我们知道这个新的轴的长度是3,实际上我们可以看到我们有三个张量,他们的高度和宽度都是4,第一个3代表批大小(batchsize),后面两个4代表的是高和宽,下面这个t就是一个批的张量表示的输出
我们想要做的就是把这个张量变成一个CNN期望的形式,为彩色通道增加一个轴,对于每个图像张量,我们基本上都有一个隐式的单色通道,所以实践中这些都是灰度图像,CNN将会看到一个显示的彩色通道轴,让我们重塑这个张量来增加一个。
我们在批大小后面增加了一个轴,长度为1的额外轴不会改变张量中元素的数量
或者以这种形式来看
第一个轴有三个元素,第一个轴的每个元素代表一个图像,对于每个图像,我们有一个包含单个通道的彩色通道轴,在每个通道轴中我们有四个数组,其中包含四个数字或张量的标量分量
让我们用索引再看一下这个张量
第一张图像
第一张图像的第一个通道
在第一个图像的第一个颜色通道中有第一行像素
第一行像素的第一个像素值
下面就是让这批图像变平,记住,整批是一个单独的张量,它将被传递给CNN,所以我们不想让整个变平,我们只要把这张批量的图像张量变平,我们先把整个都flatten,下面是四种方法
我们看这个变平的结果,我们把所有的图像都映射到了一个单独的轴上面,1代表第一张图的像素,2代表第二张图的像素,3代表第三张图的像素,4代表第四张图的像素,这个flatten的效果不太好,因为所有的图像都被压缩成一个,我们需要对每一个图像进行单独预测,这里的解决方法就是保持批轴的同时使每个图像都变平
这意味着我们只想把张量的一部分变平,我们想要用高度和宽度轴来压平颜色通道轴,可以使用flatten来解决
这里start_dim参数这个告诉了flatten方法当他开始flatten操作的时候应该从哪个轴开始,这里的1是一个索引,所以是第二个轴,也就是颜色通道轴,我们跳过了批轴,我们看形状可以看出我们有一个秩为2的张量,有三个单独的彩色通道图像,他们被压平成一个包含16像素值的单轴