1,傅里叶变换
1,振幅、周期、频率、相位定义及相互关系
2,时域,空域,频域
- 时域: 自变量是时间,因变量是振幅; 描述的是时间与振幅的关系. 时域是真实世界,是惟一实际存在的域。
- 频域: 自变量是频率,因变量是振幅; 描述的是频率与振幅的关系. 频域不是真实的,而是一个数学构造。频域实际上是时域信号进 行傅立叶变换的数学结果。
- 空域: 自变量是空间坐标, 因变量是该做表对应的信号值(如像素灰度值); 描述的是距离(坐标)与振幅的关系.
一幅数字图像可定义为一个二维函数f(x,y),其中x和y是空间(平面)坐标,而在空间坐标(x,y)处的幅值f(x,y)称为图像在该点处的灰度值。图像的频率是表征图像中灰度值变化剧烈程度的指标.
对图像而言,图像的边缘部分是灰度值突变部分,因此反应在频域上是高频分量;图像的噪声大部分情况下是高频部分;图像平缓变化部分则为低频分量。
傅立叶变换提供另外一个角度来观察图像,可以将图像从空间灰度值分布(空域)转化到频率分布(频域)上来观察图像的特征。
图像的主要成分是低频信息,它形成了图像的基本灰度等级,对图像结构的决定作用较小;中频信息决定了图像的基本结构,形成了图像的主要边缘结构;高频信息形成了图像的边缘和细节,是在中频信息上对图像内容的进一步强化。即
- 高频部分代表细节、边缘和噪声
- 低频占据绝大多少能 量,其中直流分量 (零频)能量占比最大。
有一个sin(3x)+sin(5x)的曲线, 现在需要你把sin(5x)给我从图里拿出去,看看剩下的是什么。这基本是不可能做到的。
但是在频域呢?则简单的很,无非就是几条竖线而已。
所以很多在时域看似不可能做到的数学操作,在频域相反很容易。这就是需要傅里叶变换的地方。尤其是从某条曲线中去除一些特定的频率成分,这在工程上称为滤波,是信号处理最重要的概念之一,只有在频域才能轻松的做到。
3,傅里叶级数和傅里叶变换概念
GitHub - balzer82/FFT-Python: FFT Examples in Python
傅里叶级数: 任何单变量函数都可以写成一系列正弦函数和余弦函数的加权和。
傅里叶变换: 对于自然界存在的所有波,我们都可以利用傅立叶级数展开法将它们分解为有限或无限个不同频率不同振幅的正弦波的集合.
4,时域的矩形波可以由正弦波叠加而成
下图最前面黑色的线就是所有正弦波叠加而成的总和,也就是越来越接近矩形波的那个图形。而后面依不同颜色排列而成的正弦波就是组合为矩形波的各个分量。这些正弦波按照频率从低到高从前向后排列开来,而每一个波的振幅都是不同的。
所有正弦波中上升的部分逐渐叠加让原本缓慢增加的曲线不断变陡,而所有正弦波中下降的部分又和前面波的上升部分叠加使最高处时继续上升的部分变为水平线。一个矩形就这么叠加而成了。每两个正弦波之间都还有一条直线,那并不是分割线,而是振幅为0的正弦波.
在频谱中,偶数项的振幅都是0,也就对应了图中的彩色直线,即振幅为0的正弦波。这说明特定频率的正弦波是不需要的.
注意振幅为0和频率为0并不是一回事.
频域的“0”是什么呢?cos(0t)就是一个周期无限长的正弦波,也就是一条直线!0频率也被称为直流分量,在傅里叶级数的叠加中,它仅仅影响全部波形相对于数轴整体向上或是向下而不改变波的形状。因为0频率只是在最终得到的总和波的每一个点加一个正数或负数(直线)而已.
2,卷积
卷积是对两个函数F和G进行操作以产生修改版本(滤波)的F。我们称G为过滤器,也成为卷积核。 如果f是在像x这样的空间变量上定义的,而不是在像t这样的时间变量上定义的,那么我们将这种操作称为空间卷积。
1,卷积的物理意义:
系统 t 时刻的输出是由从过去开始直到当前时刻 t 的所有输入共同作用(加权和)的结果。如下图
2,卷积计算
1,数学上的函数式卷积计算
2,数学上的图像处理使用的卷积计算
步骤:
1)将卷积核围绕其中心旋转180度
2)滑动核,将核中心放在输入图像g的要计算的(i,j)处像素上
3)用卷积核中的系数和图像中相应的像素值相乘,并求和。得到输出图像的(i,j)像素值
4)重复上面操纵,直到求出输出图像的所有像素值
注意: 图像处理时,为保证卷积运算完后得到的图像尺寸不变,会在原图像四周填充0值,当然也可以填充其他合理值(如直接利用边界像素值)
例子:
3,深度学习中的卷积计算-卷积核不翻转
深度学习中一般卷积核不翻转,原因是:
- 数学中卷积,主要是为了诸如信号处理、求两个随机变量和的分布等而定义的运算,所以需要“翻转”是根据问题的需要而确定的
- 卷积神经网络中“卷积”,是为了提取图像的特征,其实只借鉴了卷积“加权求和”的特点
- 还有一点一定要说的是:数学中的“卷积核”都是已知的或者给定的,卷积神经网络中“卷积核”本来就是trainable的参数,不是给定的,根据数据训练学习的,那么翻不翻转还有什么关系呢?因为无论翻转与否对应的都是未知参数!
- 在没有深度学习的时代,图像处理卷积核是通过人为设计计算出来的。到了有深度学习的时代,卷积核里面的参数就不是人为设计的了,变成了靠深度网络的优化器 通过反向传播算法来学习调整卷积核里面的参数。
- 深度学习中的卷积核参数是不断学习更新,因此有没有翻转并没有性质上的影响。
深度学习中输入矩阵和卷积核的按位点乘操作,实际上是互相关(cross-correlation),而卷积需要把卷积核顺时针旋转180度然后再做点乘。
在卷积层的反向传播中,其实是需要对前一层的误差(也叫敏感度sensitivity)做padding(补零)然后再和卷积核做真正的卷积操作,也就是需要把卷积核顺时针翻转180度。
卷积神经网络中经常出现的两种技巧:
- Padding 有的时候对于给定输入矩阵的大小,我们需要得到特定大小的输出。这时候,我们可以通过给矩阵的边缘增加0值得方法获得。这个0值区域的大小,我们一般称之为padding。见左图Padding为1×1的卷积操作.
- Stride 在一般的卷积过程中,我们使用步长为1进行卷积核在图像上的滑动;但是有时候出于缩小输出矩阵尺寸(即获得尺寸小于输入矩阵的输出矩阵)的原因,我们也会采用大于1的步长。卷积核每次滑动的步长,我们称之为stride。见右图Stride为2的卷积操作.
4,卷积的三种计算模式---根据输出的矩阵大小来划分
参考:
卷积的三种模式:full、same、valid + 卷积输出size的计算 - 午夜稻草人 - 博客园
- SAME 模式---输入和输出的矩阵大小一致,都是5x5
卷积核的中心与输入矩阵的第一个点进行对齐作为卷积起始位置. 左图淡灰色为Padding(一般填 0); 右图橙色部分为输入矩阵, 蓝色部分为卷积核,白色部分为Padding, K表示卷积核中心.
- VALID 模式---输入矩阵大于输出的矩阵
在整个卷积核都在输入矩阵内部进行卷积操作,因此不需要 padding,输出的尺寸也最小.
- FULL 模式---输入矩阵小于于输出的矩阵
卷积核右下角与输入矩阵左上角重合处开始卷积.
-
卷积输出矩阵size的计算公式
先定义几个参数
- 输入图片大小 W×W
- Filter大小 F×F×D
- 一个Filter的通道数(channel)是D
- 步长 S
- padding的像素数 P
于是我们可以得出
N = (W − F + 2P )/S+1; 则输出矩阵大小为 N×N
注意,整个输出矩阵的size都没用到D通道数,也就是输出矩阵size和一个Filter的通道数D无关.
下面是一个考虑输出矩阵含通道的情况,此时输出矩阵尺寸就是,其中通道数D2等于卷积核的个数
3,感受野(Receptive Field)
1,定义:
感受野用来表示网络内部的不同神经元对原图像的感受范围的大小,或者说,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.
2. 感受野的计算
- 第一层卷积层的输出特征图像素的感受野的大小等于滤波器的大小;
- 深层卷积层的感受野大小和它之前所有层的滤波器大小和步长有关系;
- 计算感受野大小时,忽略了图像边缘的影响,即不考虑padding的大小。
- 此外,关于每一层的strides的说明,这个strides是之前所有层stride的乘积,即
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层卷积核大小。
感受野大小的计算感受野的详细介绍_Liam_Fang_的博客-CSDN博客_图像的感受野
参考:
https://theonegis.github.io/dl/一文详解卷积和逆卷积/
如果看了这篇文章你还不懂傅里叶变换,那就过来掐死我吧 傅里叶分析之掐死教程(完整版)更新于2014.06.06 - 知乎
Kaixiang Wang的卷积回答 如何通俗易懂地解释卷积? - 知乎
图像处理-线性滤波-1 基础(相关算子、卷积算子、边缘效应) - Tony Ma - 博客园
卷积计算卷积矩阵及其运算实例_sumx2015的博客-CSDN博客_二维卷积计算举例
Convolutional Neural Networks - Basics · Machine Learning Notebook
Receptive field(感受野)Receptive field(感受野) - 简书
关于感受野的理解与计算关于感受野的理解与计算 - 简书