一幅数字图像可定义为一个二维函数f(x,y),其中x和y是空间(平面)坐标,而在空间坐标(x,y)处的幅值f(x,y)称为图像在该点处的灰度值。图像的频率是表征图像中灰度值变化剧烈程度的指标.
对图像而言,图像的边缘部分是灰度值突变部分,因此反应在频域上是高频分量;图像的噪声大部分情况下是高频部分;图像平缓变化部分则为低频分量。
傅立叶变换提供另外一个角度来观察图像,可以将图像从空间灰度值分布(空域)转化到频率分布(频域)上来观察图像的特征。
图像的主要成分是低频信息,它形成了图像的基本灰度等级,对图像结构的决定作用较小;中频信息决定了图像的基本结构,形成了图像的主要边缘结构;高频信息形成了图像的边缘和细节,是在中频信息上对图像内容的进一步强化。即
有一个sin(3x)+sin(5x)的曲线, 现在需要你把sin(5x)给我从图里拿出去,看看剩下的是什么。这基本是不可能做到的。
但是在频域呢?则简单的很,无非就是几条竖线而已。
所以很多在时域看似不可能做到的数学操作,在频域相反很容易。这就是需要傅里叶变换的地方。尤其是从某条曲线中去除一些特定的频率成分,这在工程上称为滤波,是信号处理最重要的概念之一,只有在频域才能轻松的做到。
傅里叶级数: 任何单变量函数都可以写成一系列正弦函数和余弦函数的加权和。
傅里叶变换: 对于自然界存在的所有波,我们都可以利用傅立叶级数展开法将它们分解为有限或无限个不同频率不同振幅的正弦波的集合.
下图最前面黑色的线就是所有正弦波叠加而成的总和,也就是越来越接近矩形波的那个图形。而后面依不同颜色排列而成的正弦波就是组合为矩形波的各个分量。这些正弦波按照频率从低到高从前向后排列开来,而每一个波的振幅都是不同的。
所有正弦波中上升的部分逐渐叠加让原本缓慢增加的曲线不断变陡,而所有正弦波中下降的部分又和前面波的上升部分叠加使最高处时继续上升的部分变为水平线。一个矩形就这么叠加而成了。每两个正弦波之间都还有一条直线,那并不是分割线,而是振幅为0的正弦波.
在频谱中,偶数项的振幅都是0,也就对应了图中的彩色直线,即振幅为0的正弦波。这说明特定频率的正弦波是不需要的.
注意振幅为0和频率为0并不是一回事.
频域的“0”是什么呢?cos(0t)就是一个周期无限长的正弦波,也就是一条直线!0频率也被称为直流分量,在傅里叶级数的叠加中,它仅仅影响全部波形相对于数轴整体向上或是向下而不改变波的形状。因为0频率只是在最终得到的总和波的每一个点加一个正数或负数(直线)而已.
卷积是对两个函数F和G进行操作以产生修改版本(滤波)的F。我们称G为过滤器,也成为卷积核。 如果f是在像x这样的空间变量上定义的,而不是在像t这样的时间变量上定义的,那么我们将这种操作称为空间卷积。
系统 t 时刻的输出是由从过去开始直到当前时刻 t 的所有输入共同作用(加权和)的结果。如下图
步骤:
1)将卷积核围绕其中心旋转180度
2)滑动核,将核中心放在输入图像g的要计算的(i,j)处像素上
3)用卷积核中的系数和图像中相应的像素值相乘,并求和。得到输出图像的(i,j)像素值
4)重复上面操纵,直到求出输出图像的所有像素值
注意: 图像处理时,为保证卷积运算完后得到的图像尺寸不变,会在原图像四周填充0值,当然也可以填充其他合理值(如直接利用边界像素值)
例子:
深度学习中一般卷积核不翻转,原因是:
深度学习中输入矩阵和卷积核的按位点乘操作,实际上是互相关(cross-correlation),而卷积需要把卷积核顺时针旋转180度然后再做点乘。
在卷积层的反向传播中,其实是需要对前一层的误差(也叫敏感度sensitivity)做padding(补零)然后再和卷积核做真正的卷积操作,也就是需要把卷积核顺时针翻转180度。
卷积神经网络中经常出现的两种技巧:
参考:
https://zhuanlan.zhihu.com/p/76606892
https://www.cnblogs.com/scarecrow-blog/p/11804306.html
卷积核的中心与输入矩阵的第一个点进行对齐作为卷积起始位置. 左图淡灰色为Padding(一般填 0); 右图橙色部分为输入矩阵, 蓝色部分为卷积核,白色部分为Padding, K表示卷积核中心.
在整个卷积核都在输入矩阵内部进行卷积操作,因此不需要 padding,输出的尺寸也最小.
卷积核右下角与输入矩阵左上角重合处开始卷积.
卷积输出矩阵size的计算公式
先定义几个参数
于是我们可以得出
N = (W − F + 2P )/S+1; 则输出矩阵大小为 N×N
注意,整个输出矩阵的size都没用到D通道数,也就是输出矩阵size和一个Filter的通道数D无关.
下面是一个考虑输出矩阵含通道的情况,此时输出矩阵尺寸就是,其中通道数D2等于卷积核的个数
感受野用来表示网络内部的不同神经元对原图像的感受范围的大小,或者说,convNets(cnn)每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。
神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次.
padding并不影响感受野,stride只影响下一层featuremap的感受野,size影响的是该层的感受野.
比如一个5*5的原始图像,经过3*3的filter进行卷积,步长为1,那么得到的特征映射为3*3,那么这个3*3的特征映射(feature map)上的一个点是由原始图像的多大区域得到的呢,很显然是3*3的区域, 因为feature map中的每个点都源自这个3*3的卷积核与原图像中3*3的区域做卷积。那如果再添加一个2*2的pool层,stride=1,那么很显然得到的是2*2的特征映射,那么这个到原始图像的感受野有多大呢?答案是4*4. 你发现原始图像的一个4*4的区域,经过3*3的filter后得到的是2*2,在经过pool层得到的是一个单映射点,也即我们pool层对原始图像的感受野大小为4*4.
如图所示的7*7原始图像,经过kernel_size=3, stride=2的卷积核Conv1,kernel_size=2, stride=1的卷积核Conv2后,输出特征映射feature map_2大小为2*2,很明显,原始输入图像的每个单元的感受野为1,Conv1所得到的特征映射(feature map_1)的每个单元的感受野为3,而由于Conv2所得到的特征映射(feature map_2)的每个单元都是由范围2*2的feature map_1经2*2的Conv2卷积得到,因此回溯到原始图像,每个单元能够看到大小5*5的区域范围。下图k,s,r分别表示分别表示第n层的kernel_size,stride,receptive_field.
strides(i)= stride(1) * stride(2) * ...* stride(i-1)
对于单层卷积网络,其feature map上每个特征点对应原图上的感受野大小等于卷积层滤波器的大小;对于多层卷积网络,可由此逐层往回反馈,通过反复迭代获得原始输入图像中感受野大小,即后面深层的卷积层感受野大小就和之前所有网络层的滤波器大小和步长有关系了,在计算的时候,忽略图像Padding的大小。使用的公式可以表示如下:
r(i) = (r(i+1) - 1) * stride(i) + c(i)
其中, r(i)表示第i层感受野大小,stride(i)表示第i层步长,c(i)表示第i层卷积核大小。
感受野大小的计算https://blog.csdn.net/weixin_39912556/article/details/78366287
参考:
https://theonegis.github.io/dl/一文详解卷积和逆卷积/
https://zhuanlan.zhihu.com/p/42090228
卷积 https://graphics.stanford.edu/courses/cs178/applets/convolution.html
https://zhuanlan.zhihu.com/p/54946461
如果看了这篇文章你还不懂傅里叶变换,那就过来掐死我吧 https://zhuanlan.zhihu.com/p/19763358
https://www.zhihu.com/question/21040374
Kaixiang Wang的卷积回答 https://www.zhihu.com/question/22298352
https://www.cnblogs.com/pegasus/archive/2011/05/19/2051416.html
卷积计算https://blog.csdn.net/sumx2015/article/details/78189983
https://mlnotebook.github.io/post/CNN1/
Receptive field(感受野)https://www.jianshu.com/p/2b968e7a1715
关于感受野的理解与计算https://www.jianshu.com/p/9997c6f5c01e