发布网友 发布时间:2022-04-22 19:15
共1个回答
热心网友 时间:2023-10-25 22:55
神经网络的基础是仿射变换:一个向量作为输入被接收,然后与一个矩阵相乘产生一个输出(通常在通过非线性传递结果之前加上一个偏置向量)。这适用于任何类型的输入,无论是图像、声音片段还是无序的特征集合:无论它们的维数是多少,它们的表示都可以在转换之前展平为向量。
图像、声音片段和许多其他类似类型的数据具有内在的结构。更正式地说,它们共享这些重要的属性:
但是当应用仿射变换时,这些性质不会被利用;事实上,所有的轴都被以相同的方式处理,并且不考虑拓扑信息。但是,利用数据的隐式结构可能在解决计算机视觉问题或语音识别等问题时非常方便,在这些情况下,最好保留它。这就是离散卷积发挥作用的地方。
离散卷积是一种线性变换,它保留了排序的概念。它是稀疏的(只有少数输入单元对给定的输出单元有贡献)并且重用参数(相同的权重应用于输入中的多个位置)。
下面就是一个离散卷积的示例
左边图中,浅蓝色的网格称为输入的特征图(feature map), 阴影部分称为卷积核(kernel)或滤波器(filter),卷积核的形状如下:
卷积核在输入特征图上沿着从左到右,从上到下的方式滑动。在每个位置,计算卷积核的每个元素与其重叠的输入元素之间的乘积,并将结果相加以获得当前位置的输出。这个过程的最终输出是一个称为输出特征映射(feature map)的矩阵(右边绿色矩阵)。
在神经网络中,每一层的输入和输出称为特征图(feature map)或特征(feature)。卷积神经网络的设计和构建过程中,我们必须要知道网络中每一层的输入和输出的特征尺寸大小。对于二维卷积为例, 特征尺寸的形式为 , 依次代表批次大小,高度, 宽度和通道数。那么,我们如何准确计算输出特征尺寸的大小就成为一个关键的问题。
tf.pad 实现对输入的tensor进行扩展操作的, paddings控制各个维度扩展的大小,constant_values 表示填充的数值, 默认为0。
填充是在输入特征图的每一边添加适当数目的行和列,使得每个输入方块都能作为卷积窗口的中心。
下图表示 输入特征图大小 , 卷积核大小 ,填充补丁大小 , 步幅 的卷积操作的过程
关于输出特征尺寸的计算,我们常见的有如下两种计算公式:
很多博客在介绍卷积层输出特征图大小的时候,都会引用上述两个公式中的一个或者同时引用。但是,往往都没有解释两种计算公式有什么区别,这导致了一些问题问题,这两个公式有什么差别,这两种公式的适用于什么情况。为了解决这个问题,我们必须首先知道,这两个公式分别出自哪里。
这里最明显的区别就是,对于theano公式来说,在SAME模式时需要首先计算补丁(padding)的大小, 再利用公式得到输出特征的尺寸。而对于tensorflow公式而言,不论时VALID模式,还是SAME模式,我们都不需要计算补丁(padding)大小,直接计算输出特征图尺寸大小。
这里我们会很困惑,通过这两种公式进行卷积操作,最后得到的输出特征结果是一样的么?经过计算,可以得到如下结论:
结论:theano公式适用于theano框架计算,当padding模式为VALID和padding模式为SAME且卷积核尺寸为奇数时,也适用于tensorflow 框架计算;同理,tensorflow公式适用于tensorflow框架计算,当padding模式为VALID和padding模式为SAME且卷积核尺寸为奇数时,也适用于theano框架计算。
接下来我们通过奇偶两种类型的卷积核尺寸,验证上述结论。
关于VALID模式和SAME模式的卷积操作的步骤如下:
VALID模式:直接利用卷积核平滑输入特征图,完成卷积操作
SAME模式: 大致可以分为两步,首先,进行padding操作,扩张输入特征图尺寸;然后再利用卷积核平滑扩张后的特征图,完成卷积操作
为了验证上述的推断,接下来分别使用自定义的卷积操作方法,与调用tensorflow卷积操作接口的结果进行对比。对于VALID 模式,卷积操作过程是卷积核遵循从左到右,从上到下的的方向在输入特征图进行滑动, 如果剩余的尺寸不能够满足卷积核的尺寸和步幅要求,则采用丢弃策略,得到最终的卷积操作结果。由于VALID模式没有补丁(padding)操作,卷积操作的结果都相同。这里使用SAME模式,通过对比自定义的卷积操作在SAME模式的结果与tensorflow接口的结果,进行验证
这里再次说明SAME模式的操作步骤,主要分为两步:
自定义SAME模式卷积操作分为以下四步: