{eval=Array;=+count(Array);}
我们通常看到的卷积过滤器示意图是这样的:
(图片来源:cs231n)
这其实是把卷积过滤器“压扁”了,或者说“拍平”了。比如,上图中粉色的卷积过滤器是3x3x3,也就是长3宽3深3,但是示意图中却画成二维——这是省略了深度(depth)。
实际上,卷积过滤器是有深度的,深度值和输入图像的深度相同。也正因为卷积过滤器的深度和输入图像的深度相同,因此,一般在示意图中就不把深度画出来了。如果把深度也画出来,效果大概就是这样:
(图片来源:mlnotebook)
如前所述,卷积过滤器的深度和输入图像的深度相同,都是3。
顺便说下,输入图像深度为3,是因为输入图像是彩色图像,深度为3,分别为R、G、B值。
作为对比,灰度图像的卷积过滤器是这样的(真2D):
(图片来源:mlnotebook)
总之,卷积过滤器的深度和输入数据的深度保持一致就可以了。
滤波器是一种3维结构(滤波器的概念其实就是层),它由多个卷积核组成,所以具有深度。这里的深度是对于通道而言,比如彩色图像是3通道,黑白图像是1通道,所以彩色图像的深度是3,黑白是1。当输入C*H*W的图像时(H:长,W:宽,C:通道数),那么滤波器如何对这张图像进行特征提取呢?就是用每个卷积核和图像的每个通道的空域进行计算。由于输入了C通道的图像,所以为了所有通道都能参与进来,所以需要C个卷积核,也就是说1个滤波器的深度和输入图像的深度是相同的。C个卷积核一一对应着C个通道,计算出了C个结果后,通过一定的机制融合,最终1个滤波器输出了1个结果。当然,卷积操作会有多个滤波器参与,这样就可以提取到不同尺度的特征。
简单来说,滤波器的深度就是卷积核的数量,值相等于输入数据的通道数。
谢邀!
什么是卷积神经网络?
它们基本上只是使用卷积层的神经网络,即基于卷积数学运算的Conv层。 Conv图层由一组滤镜组成,你可以将其看作是数字的二维矩阵。 这里有一个例子3x3过滤器:
我们可以使用一个输入图像和一个过滤器通过将过滤器与输入图像进行卷积来生成一个输出图像。这包括
旁注:我们(以及许多CNN实现)实际上在技术上使用的是互相关而不是卷积,但它们做的几乎是一样的。我不会在这篇文章中详细讨论它们之间的区别,因为这并不重要。
这四步描述有点抽象,我们来做个例子。看下这个微小的4x4灰度图像和这个3x3滤镜:
图像中的数字表示像素强度,其中0为黑色,255为白色。我们将卷积输入图像和过滤器产生一个2x2输出图像:
首先,让我们将滤镜叠加在图片的左上角:
接下来,我们在重叠图像值和过滤器值之间执行逐元素乘法。 以下是结果,从左上角开始向右,然后向下:
接下来,我们总结所有的结果。这是很容易:
最后,我们将结果放入输出图像的目标像素中。由于我们的过滤器覆盖在输入图像的左上角,我们的目标像素是输出图像的左上角像素:
我们做同样的事情来生成输出图像的其余部分:
3.1这有什么用?
让我们缩小一下,在更高的层次上看这个。将图像与过滤器进行卷积会做什么?我们可以从我们一直使用的例子3x3过滤器开始,它通常被称为垂直Sobel过滤器:
下面是一个垂直Sobel过滤器的例子:
同样,还有一个水平Sobel过滤器:
看发生了什么?Sobel过滤器是一种边缘检测器。垂直Sobel过滤器检测垂直边缘,水平Sobel过滤器检测水平边缘。输出图像现在很容易解释:输出图像中的亮像素(高值像素)表示在原始图像中有一个强边缘。
你能看出为什么边缘检测图像可能比原始图像更有用吗? 回想一下我们的MNIST手写数字分类问题。 在MNIST上训练的CNN可以寻找数字1,例如,通过使用边缘检测过滤器并检查图像中心附近的两个突出的垂直边缘。 通常,卷积有助于我们查找特定的本地化图像特征(如边缘),我们可以在以后的网络中使用。
3.2填充
还记得以前将4x4输入图像与3x3滤波器卷积得到2x2输出图像吗?通常,我们希望输出图像与输入图像的大小相同。为此,我们在图像周围添加零,这样我们就可以在更多的地方覆盖过滤器。一个3x3的过滤器需要1像素的填充:
这称为"相同"填充,因为输入和输出具有相同的尺寸。 不使用任何填充,这是我们一直在做的,并将继续为这篇文章做,有时被称为"有效"填充。
3.3 Conv层(Conv Layers)
现在我们知道了图像卷积是如何工作的以及它为什么有用,让我们看看它在CNN中的实际应用。如前所述,CNN包括conv层,它使用一组过滤器将输入图像转换为输出图像。conv层的主要参数是它拥有的过滤器的数量。
对于MNIST CNN,我们将使用一个带有8个过滤器的小conv层作为网络的初始层。这意味着它将把28x28的输入图像转换成26x26x8的容量:
提醒:输出是26x26x8,而不是28x28x8,因为我们使用了有效的填充,这将输入的宽度和高度降低了2。
conv层中的4个过滤器每个都产生一个26x26的输出,因此它们叠加在一起构成一个26x26x8。所有这些都是因为3×3(过滤器大小) × 8(过滤器数量)= 72个权重!
3.4实施卷积
是时候把我们学到的东西写进代码里了!我们将实现conv层的前馈部分,它负责将过滤器与输入图像进行卷积以生成输出卷。为了简单起见,我们假设过滤器总是3x3(这并不是真的,5x5和7x7过滤器也很常见)。
让我们开始实现一个conv层类:
Conv3x3类只接受一个参数:过滤器的数量。在构造函数中,我们存储过滤器的数量,并使用NumPy的randn()方法初始化一个随机过滤器数组。
注意:如果初始值过大或过小,训练网络将无效。
接下来,实际的卷积:
iterate_regions()是一个辅助发生器的方法,收益率为我们所有有效3 x3的图像区域。这对于以后实现该类的向后部分非常有用。
上面突出显示了实际执行卷积的代码行。让我们来分解一下:
对输出中的每个像素执行上面的序列,直到得到最终的输出卷为止!让我们测试一下我们的代码:
目前看起来不错。
注意:在Conv3x3实现中,为了简单起见,我们假设输入是一个2d numpy数组,因为MNIST图像就是这样存储的。这对我们有用,因为我们使用它作为我们网络的第一层,但大多数cnn有更多的Conv层。如果我们要构建一个更大的网络,需要多次使用Conv3x3,那么我们必须将输入设置为3d numpy数组。
更多有关人工智能的资讯、深度报道、采访欢迎关注AI中国,无论你是小白还是大神,你想要的这里都有!
3
回答0
回答0
回答0
回答0
回答9
回答0
回答0
回答0
回答5
回答