精华内容
下载资源
问答
  • 二维卷积定理的验证(上)
    千次阅读
    2021-12-01 11:23:41

    二维卷积定理的验证(上)

    0. 写在前面

    在进行图像处理时,我们经常会用到卷积计算,但是当卷积核较大时,卷积计算将相当耗时。

    事实上,可以通过卷积定理,来使用傅里叶变换手段实现卷积计算。也即是卷积定理。

    即本文要探讨和验证的内容。

    1. 二维卷积定理

    卷积定理是傅里叶变换满足的一个重要性质。函数卷积的傅里叶变换是函数傅里叶变换的乘积。本文验证二维卷积定理,用于处理图像。

    图像的二维卷积定理表达式如下
    F ( f ( x , y ) ∗ g ( x , y ) ) = F ( f ( x , y ) ) ⋅ F ( g ( x , y ) ) F(f(x,y)*g(x,y)) = F(f(x,y))·F(g(x,y)) F(f(x,y)g(x,y))=F(f(x,y))F(g(x,y))
    其中, F F F 表示傅里叶变换操作, ∗ * 表示卷积操作。

    式(1)中的两侧结果皆为复数,不利于展现,因此将上述等式变换如下
    f ( x , y ) ∗ g ( x , y ) = F − 1 [ F ( f ( x , y ) ) ⋅ F ( g ( x , y ) ) ] f(x,y)*g(x,y) = F^{-1}[F(f(x,y))·F(g(x,y))] f(x,y)g(x,y)=F1[F(f(x,y))F(g(x,y))]
    此时,等式左侧和右侧结果皆可以用图像来展现。

    本文的目标是验证二维卷积定理,即验证等式(2)成立

    2. 名词说明

    2.1 卷积

    根据 padding 的类型,可以将卷积分为

    • ‘full‘。滑动步长为 1,图片尺寸大小为 w × h w\times h w×h ,卷积核尺寸大小为 m × n m\times n m×n,卷积后图像大小为 ( w + m − 1 ) × ( h + n − 1 ) (w+m-1)\times (h+n-1) (w+m1)×(h+n1)

    • ’same’。滑动步长为 1,图片尺寸大小为 w × h w\times h w×h,卷积核尺寸大小为 m × n m\times n m×n,卷积后图像大小为 w × h w\times h w×h

    • ‘valid’。滑动步长为 s s s,图片尺寸大小为 w × h w\times h w×h,卷积核尺寸大小为 m × n m\times n m×n,卷积后图像大小为 ( w − m s + 1 ) × ( h − n s + 1 ) (\frac{w-m}{s}+1)\times (\frac{h-n}{s}+1) (swm+1)×(shn+1)

    卷积的具体实现步骤为:

    1. 对图片进行 padding 操作。通常是根据选择的卷积类型进行补零操作,即在第一行之前和最后一行之后、第一列之前和最后一列之后进行补零,以满足卷积的尺寸要求。
    2. 将卷积核绕其中心旋转180度。
    3. 在图像上滑动旋转后的卷积核,卷积核与图像进行逐项乘积求和,最终得到全图的卷积结果。

    2.2 傅里叶变换与反变换

    需要注意的是,因为图像的大小为 w × h w\times h w×h ,而卷积核的大小为 m × n m\times n m×n。 因此在进行傅里叶变换操作时,需要将两者大小统一,且跟前述卷积结果的图片尺寸大小相统一时,最终结果才有可能是相等的。

    举例说明:

    如果图片大小为 w × h w\times h w×h , 卷积核大小为 m × n m\times n m×n

    对于等式左侧,进行卷积时,采用 “full” 方式,则卷积后 f ( x , y ) ∗ g ( x , y ) f(x,y)*g(x,y) f(x,y)g(x,y) 的结果尺寸大小即为 ( w + m − 1 ) × ( h + n − 1 ) (w+m-1)\times (h+n-1) (w+m1)×(h+n1);因此,对于等式右侧,在进行傅里叶变换前,就需要对图像和卷积核进行补零填充操作,以使得其最终结果尺寸也为 ( w + m − 1 ) × ( h + n − 1 ) (w+m-1)\times (h+n-1) (w+m1)×(h+n1)

    3. 验证实现

    3.1 使用 ”full“ 卷积

    代码如下

    import numpy as np
    from scipy import signal
    
    # 原始图像 f(x)
    gray = np.uint16(np.random.randint(100, size=(7,7)))
    
    # 卷积核 g(x)
    kenel = np.ones((3,3))/9
    
    # ----- Conv = f(x)*g(x) ----- #
    # f(x)*g(x)
    Conv = signal.convolve2d(gray, kenel, mode='full') # 使用full卷积类型,得到(M+N-1)X(M+N-1)大小
    
    
    #--------- ifft{ F(f(x))·F(g(x)) } ---------#
    # 傅里叶变换前进行 padding 填充,图像和卷积核都补零到 (M+N-1)x(M+N-1)大小。
    img_pad = np.pad(gray, ((1, 1),(1, 1)), 'constant')
    kenel_pad = np.pad(kenel, ((3, 3),(3, 3)), 'constant')
    
    # F(f(x))
    img_fft = np.fft.fftshift(np.fft.fft2(img_pad))
    
    # F(g(x))
    kenel_fft = np.fft.fftshift(np.fft.fft2(kenel_pad))
    
    # ifft( F(f(x))·F(g(x)) )
    FFT = np.fft.ifftshift(np.fft.ifft2(np.fft.fftshift(img_fft*kenel_fft)))
    
    
    
    #--------- 打印结果 ---------#
    print(" f(x) ↓")
    print(gray)
    print(" g(x) ↓")
    print(kenel)
    
    print("\n\n f(x)*g(x) ↓")
    print(np.uint8(Conv))
    
    print("\n ifft[F·G] ↓")
    print(np.uint8(np.abs(FFT)))
    

    结果如下

    在这里插入图片描述

    从(c)和(d)的数值结果可以看出,两者结果完全一致,也即 f ( x ) ∗ g ( x ) = i f f t ( F ⋅ G ) f(x)*g(x)=ifft(F·G) f(x)g(x)=ifft(FG) 。二维卷积定理成立。

    3.2 使用“same”卷积

    代码如下

    import numpy as np
    from scipy import signal
    
    # 原始图像 f(x)
    gray = np.uint16(np.random.randint(100, size=(7,7)))
    
    # 卷积核 g(x)
    kenel = np.ones((3,3))/9
    
    # ----- Conv = f(x)*g(x) ----- #
    # f(x)*g(x)
    Conv = signal.convolve2d(gray, kenel, mode='same') # 使用full卷积类型,得到(M+N-1)X(M+N-1)大小
    
    
    #--------- ifft{ F(f(x))·F(g(x)) } ---------#
    # 傅里叶变换前进行 padding 填充,图像和卷积核都补零到 (M+N-1)x(M+N-1)大小。
    img_pad = np.pad(gray, ((0, 0),(0, 0)), 'constant')
    kenel_pad = np.pad(kenel, ((2, 2),(2, 2)), 'constant')
    
    # F(f(x))
    img_fft = np.fft.fftshift(np.fft.fft2(img_pad))
    
    # F(g(x))
    kenel_fft = np.fft.fftshift(np.fft.fft2(kenel_pad))
    
    # ifft( F(f(x))·F(g(x)) )
    FFT = np.fft.ifftshift(np.fft.ifft2(np.fft.fftshift(img_fft*kenel_fft)))
    
    
    
    #--------- 打印结果 ---------#
    print(" f(x) ↓")
    print(gray)
    print(" g(x) ↓")
    print(kenel)
    
    print("\n\n f(x)*g(x) ↓")
    print(np.uint8(Conv))
    
    print("\n ifft[F·G] ↓")
    print(np.uint8(np.abs(FFT)))
    

    结果如下

    在这里插入图片描述

    根据(c)和(d)的数值结果,在橘色方框内两者保持完全一致,而框外由于受到傅里叶变换时补零的影响,所以数值会出现不同的情况。

    4. 结论

    从上述实验中,可以看出:

    • padding 使用 “full” 方式时,等式左右两侧矩阵数值完全一致。但该种方式缺点是卷积图像结果矩阵尺寸发生改变。
    • padding 使用 “same” 方式时,等式左右两侧矩阵在一定范围内完全一致。但该种方式缺点是卷积图像结果中有部分不与傅里叶方式计算下等价。

    但我们可以得到一个结论是,padding 的方式影响着最终结果

    于是就发现了一个新的问题:即是否存在着某种边界处理方式,使得卷积图像结果矩阵尺寸没有变化,且所有值都可以与傅里叶方式计算下等价。

    事实上,是存在的,因为cv2.filter2D() 便是解决这一问题进而实现的。

    至于,如何设置 padding 方式来解决这一问题,也即是下一篇博文的内容二维卷积定理的验证(下,cv2.filter2D())

    更多相关内容
  • 使用一维卷积 conv1D 和二维卷积 Conv2D 两种方法实现 MNIST 数据集分类,准确率达到 97.91%、 98.74%
  • 基于 FFT 的卷积。 有关更多信息,请参阅 readme.txt。 如果你觉得这个软件有用,请贡献。 向 luigi.rosa@tiscali.it 报告错误 路易吉·罗莎通过中央 27 67042 Civita di Bagno 拉奎拉 --- 意大利电子邮件 luigi....
  • 自己编写的关于二维卷积的matlab代码,没有调用系统函数,可以直接使用
  • 卷积定理指出,时域或空间域的卷积等效于频域的乘法。 因此可以使用 ifft2(fft(x) .* fft(m)) 来实现卷积,其中 x 和 m 是要卷积的数组。 最繁琐的部分是让数组定位和填充正确,以便结果与传统的卷积函数 CONV2 ...
  • Speech_Denoising_with_CNN 使用一维和二维卷积神经网络(CNN)消除语音中的噪声
  • 卷积神经网络包括一维卷积神经网络、二维卷积神经网络以及三维卷积神经网络。一维卷积神经网络常应用于序列类的数据处理;二维卷积神经网络常应用于图像类文本的识别;三维卷积神经网络主要应用于医学图像以及视频类...
  • 这个函数需要一个图片矩阵和一个过滤矩阵计算二维卷积。 边缘由镜像原始数据。 卷积矩阵是返回并具有与图片相同的大小和格式矩阵。
  • 目录概述一维卷积二维卷积二维单通道卷积二维多通道卷积三维卷积三维单通道卷积三维多通道卷积深度可分离卷积常规卷积深度可分离卷积参考链接 概述 不同维度的卷积实际上是卷积核的自由度不同,一维卷积卷积核只能在...

    概述

    不同维度的卷积实际上是卷积核的自由度不同,一维卷积卷积核只能在长度方向上进行滑窗操作,二维卷积可以在长和宽方向上进行滑窗操作,二维卷积可以在长、宽以及channel方向上进行滑窗操作。
    一个卷积核运算一次得到一个值,output channel取决于卷积核的个数。

    一维卷积

    二维卷积

    在卷积操作中我们只能限制卷积核的维度,卷积核的参数均是根据网络自主学习到的。
    在这里插入图片描述

    二维单通道卷积

    在这里插入图片描述

    二维多通道卷积

    在这里插入图片描述

    三维卷积

    三维单通道卷积

    这里的三维输出不是多通道导致的,而是由于卷积核在第三个维度上进行滑窗得到的(对于视频信号可能是视频的长度)。
    在这里插入图片描述

    三维多通道卷积

    三维多通道的卷积核也是三维的,因此三维数据不同channel上权重是相同的,这点和二维多通道卷积不同。

    在这里插入图片描述

    深度可分离卷积

    常规卷积

    在这里插入图片描述

    深度可分离卷积

    在这里插入图片描述
    在这里插入图片描述
    参数对比
    回顾一下,常规卷积的参数个数为:
    N_std = 4 × 3 × 3 × 3 = 108

    Separable Convolution的参数由两部分相加得到:
    N_depthwise = 3 × 3 × 3 = 27
    N_pointwise = 1 × 1 × 3 × 4 = 12
    N_separable = N_depthwise + N_pointwise = 39

    相同的输入,同样是得到4张Feature map,Separable Convolution的参数个数是常规卷积的约1/3。因此,在参数量相同的前提下,采用Separable Convolution的神经网络层数可以做的更深

    参考链接

    理解卷积
    深度可分离卷积

    展开全文
  • 二维卷积与一维卷积区别

    千次阅读 2019-05-14 14:09:49
    卷积神经网络常用在图像处理与语音识别领域,它与全连接网络不同的是,网络结构中加入了卷积层和池化层,并且神经元之间是局部连接,即每个神经元只与上一层的部分神经元相连,这样就减少了许多权重和偏置参数。...

    卷积神经网络常用在图像处理与语音识别领域,它与全连接网络不同的是,网络结构中加入了卷积层和池化层,并且神经元之间是局部连接,即每个神经元只与上一层的部分神经元相连,这样就减少了许多权重和偏置参数。其次,它遵循权值共享机制,即一组连接可以共享同一个权重,而不是每个连接有不同权重。再次,卷神经网络可以采用下采样或者池化层来减少每层样本数,剔除与样本无关的特征信息,进一步减少了网络参数。所以综合卷积神经网络的这三个特性,卷积网络在模型训练速度上快于全连接网络,且能更好的处理时序特征。

    卷积网络和全连接网络也存在一定联系,卷积网络经过一层或多层的卷积、池化操作后,通常会连接一个或多个隐藏层,用以抓取更深层次特征,且隐藏层还可以将最后的输出映射到线性可分空间,配合输出层进行分类或预测,获得更强的识别能力。可以发现,卷积网络中的隐藏层和最后输出层的组合其实就是除去输入层的全连接网络。

    卷积网络中的常用参数有kernel_size,stride,filters,pooling_type,padding等,其中kernel_size表示的是卷积核的大小,stride表示卷积核移动的步长,filters表示的是滤波器的个数也叫卷积核个数,pooling_type指的是池化类型,通常有平均池化(average pooling)和最大池化(max pooling)。以二维卷积(conv2d)为例,如公式4.6所示。

                                                                                          (4.6)

    其中为给定矩阵的大小, 为卷积核尺寸。

    二维卷积和池化的过程如图4.4所示。

                                                                            图4.4二维卷积和池化过程

    图中kernel_size是(2×2) 的卷积核,第一个卷积核权重为W1W2W3W4 ,一共有k个卷积核即filters=k,每个卷积核对应的偏置为b1b2bk ,输入input为(3×4) 的矩阵,其中宽度width=4,height=3。stride为1表示卷积核每次在width方向和height方向移动1步。以第一个卷积核为例,则输入类型为(3×4) 的矩阵经过二维卷积后变成了一个(2×3) 的特征矩阵(feature map),矩阵中每个元素的值为:

                                                        

                                                              

    由此可见,输出值是共享了第一个卷积核的权重和偏置,而k个卷积核的权重和偏置可能不同,所以k个卷积核产生k个不同的feature map。

    池化过程则是进一步减少特征值的过程,池化包括最大池化(max pooling)和平均池化(average pooling),如图4.4所示,假设池化类型是(2×2)的max pooling,stride=1,则上一层的feature map经过池化后变成了一个(1×2)的feature map,且每个元素的值为:

                                                           

    若是经过(2×2) 的average pooling,则每个元素的值为:

                   

    Padding参数的意义在于控制feature map的尺寸,在CNN中它有两种方式,valid和same。在卷积核进行滑窗操作的时候,经常会出现数据的width和height达不到卷积核的大小的情况,当padding=’valid’时,处理这种情况是直接将达不到卷积核大小的数据舍弃掉,而padding=’same’时,则是将0填充到卷积核中以达到卷积核尺寸从而继续进行卷积操作。可以看出padding=’valid’时,数据尺寸明显减少。

    综上,输入特征经过卷积和池化后,feature map维度明显减少,得到更有效的特征值,一定程度上缓解了过拟合,这也说明了卷积网络训练速度之快。经过若干卷积层和池化层后,会将输出向量(二维)平摊(flatten)成一个一维向量,然后再送入到若干隐藏层并配合输出层进行识别。后续的计算原理与全连接网络一样,不再赘述。

    以上是二维卷积网络结构,输入的是二维矩阵,这种结构经常用在图像识别上,因为图像有宽(width)和高(height)两个像素,但是对于语音这种时序信号,二维卷积网络往往不是很友好,所以通常采用一维卷积网络进行训练。一维卷积(conv1d)的过程是卷积核只在一个方向上进行滑窗操作,即在width方向或height方向上进行加权求和。一维卷积网络的卷积和池化过程如图4.5所示。

                                                                         图4.5一维卷积和池化过程

    首先输入数据input仍然是为(3×4)的矩阵,卷积核大小kernel_size为2,即它的高(height)为2,stride为1,卷积核个数为k。conv1d滑窗操作实际上是一个以kernel_size为高,输入数据维度为宽的卷积核向height方向加权求和的过程,如图,当输入数据经过第一个卷积核的滑窗操作后转变成了一个(2×1)的列向量,其中:

                                                 

    同理,k个卷积核进行滑窗操作形成k个(2×1)的列向量,即形成(2×k)的feature map(k维矩阵)。

    池化过程的滑窗操作与卷积类似,假设pool_size为2,即相当于一个height为2,width为经过一个卷积核卷积后的数据维度即为1,所以经过最大池化和平均池化后,分别形成了一个(1×1)的向量:

                                                                                                    

    一维卷积输出k个(2×1)的列向量经过池化后也会形成k个列向量,将这k个列向量拼接在一起,所以最大池化和平均池化最后形成的矩阵尺寸是(1×k) 。

    展开全文
  • 什么是卷积,一维卷积,二维卷积,三维卷积

    千次阅读 多人点赞 2019-11-17 21:32:17
    1、二维卷积 将各个位置上滤波器的元素和输入的对应元素相乘,然后再求和(有时将这个计算称为乘积累加运算)。 输出维度=(输入维度-滤波器维度)/步长+1 2、一维卷积 3、通道 3.1若输入数据的通道数为3则 3.2...

    1、二维卷积
    在这里插入图片描述
    将各个位置上滤波器的元素和输入的对应元素相乘,然后再求和(有时将这个计算称为乘积累加运算)。
    在这里插入图片描述
    输出维度=(输入维度-滤波器维度)/步长+1

    2、一维卷积
    在这里插入图片描述

    3、通道
    3.1若输入数据的通道数为3则
    三通道一维卷积

    3.2三通道二维卷积
    在这里插入图片描述
    在这里插入图片描述

    4、多个滤波器

    在这里插入图片描述
    5、三维卷积
    在这里插入图片描述
    6、一维卷积用于:
    自然语言处理(近义词反义词个数channel,词向量大小size,(chanel,size))
    二维卷积用于:
    图片处理(图通道数channel,图长Height,图宽weight,(channel,height,weight))
    三维卷积用于:视频处理(帧通道数channel,帧数frame,图长Height,图宽weight,(channel,frame,height,weight))

    展开全文
  • PyTorch 的一维卷积和二维卷积的输入都可以是多维的 默认情况下,一维卷积只对输入的最后一维进行操作,二维卷积只对输入的最后两维进行操作; 如果想要对输入的倒数第二维度进行一维卷积,那么必须使用二维卷积进行...
  • 一维卷积,二维卷积,三维卷积

    千次阅读 2020-09-17 16:09:30
    二维卷积常用在计算机视觉、图像处理领域(在视频的处理中,是对每一帧图像分别利用CNN来进行识别,没有考虑时间维度的信息); 假设原始图像 shape 为(其中3为3个通道),使用32个大小为(其中3为深度,与通道...
  • 【一维卷积】【二维卷积】一维卷积物理意义数学意义二维卷积二维卷积的实现预处理滚动卷积运算Matlab代码 一维卷积 物理意义 这里主要参考b站《「珂学原理」No. 28「卷积为谁而生?」》,这里就直接放推导过程了。 ...
  • 二维卷积计算方式

    千次阅读 2022-03-10 10:54:13
    二维卷积计算方式 以keras构建的模型为例 输入的图像shape为 (28, 28, 3),分别表示 (H, W, channels)。 注:pytorch的输入shape为 (3,28, 28),分别表示 (channels,H, W)。 各层输出 各层计算结果: 卷积层包含...
  • 二维卷积运算之C语言实现二维卷积运算之C语言实现 二维卷积运算之C语言实现二维卷积运算之C语言实现
  • 一维卷积只在一个维度上进行卷积操作,而二维卷积会在二个维度上同时进行卷积操作。 一维卷积常用于序列数据,如自然语言处理领域NLP;包含的参数有:tf.layers.conv1d() inputs:[batch, width, length] filters...
  • 1. 二维卷积 图中的输入的数据维度为14×1414×14,过滤器大小为5×55×5,二者做卷积,输出的数据维度为10×1010×10(14−5+1=1014−5+1=10)。如果你对卷积维度的计算不清楚,可以参考我之前的博客吴恩达...
  • 在看这两个函数之前,我们需要先了解一维卷积(conv1d)和二维卷积(conv2d),二维卷积是将一个特征图在width和height两个方向进行滑动窗口操作,对应位置进行相乘求和;而一维卷积则只是在width或者height方向上进行...
  • 在学习机器学习和图像处理的过程中,经常会遇到卷积这个概念。我每次遇到这个概念都有点似懂非懂的样子。有时候清楚它的直观解释,但又搞不清公式中是如何体现的。...一、一维卷积 1.1 数学定义 维基百科上,...
  • C#简单实现的二维卷积算法,可以直接使用, double[] conv2(double[] X, double[] Y)
  • 二维卷积的动手实现

    千次阅读 2021-11-20 14:49:56
    二维互相关运算中,卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组中相应位置的...
  • 一维卷积、二维卷积

    千次阅读 2019-08-29 10:47:43
    对于如下的二维矩阵,做卷积,相当于直接乘以2,貌似看上去没什么意义。 但是,对于下面这种32通道的数据,如果我用1个1x1x32的卷积核与其做卷积运算,得到的就是1个6x6的矩阵。 在这个过程中,发生了如下的事情:...
  • 一维卷积、二维卷积与三维卷积的区别
  • 基于CUDA编程二维卷积(Conv2)实现

    千次阅读 2021-11-24 13:43:01
    1. 二维卷积如下,便不多做解释(图片来自网络,侵权请联系删除) 2. CPU串行实现代码 void Conv2(float** filter, float** arr, float** result, int filter_size, int arr_size) { float .
  • 一维卷积和二维卷积的维度是指,输入数据的维度,比如一维的只有长度(如文本,第一个单词第二个单词),二维的有长宽(如图像,横纵分布的像素矩阵)。 一维卷积的卷积核在一维方向上移动 (如文本,第一个单词第...
  • 最终解决:还是使用二维卷积函数(CONV2D),只是将输入reshape成了[-1,1,129,1]的一帧长 注意: 在卷积层后,要接全连接层时,需要先reshape成[-1, 13164]的形式,-1会由batch_size代替;1为height;31为weight;64...
  • 1. 二维卷积 图中的输入的数据维度为14×1414×14,过滤器大小为5×55×5,二者做卷积,输出的数据维度为10×1010×10(14−5+1=1014−5+1=10)。如果你对卷积维度的计算不清楚,可以参考我之前的博客吴恩达...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,413
精华内容 29,365
关键字:

二维卷积