引言
大家都知道卷积神经网络被称作为卷积神经神经网络主要是因为其包含卷积层,那么本文会为大家介绍什么是卷积,以及卷积层的主要工作原理。
本文概要
1
如何计算卷积?
2
卷积在图像中的简单应用
3
本文小结
4
参考文献
正文开始
1
如何计算卷积
二维卷积其实就是一个二维数组和一个二维核(kernel)数组之间的互相关运算,然后得到一个新的二维数组的过程。废话不多说,举个例子你就理解了。
如上图所示,输入是一个3x3的二维数组,卷积使用的核采用的是一个2x2的数组,该数组在卷积计算中,又被称为卷积核或者过滤器,它的大小主要取决于这个数组的行数和列数。上图中阴影部分为第一个输出元素及其计算所使用的输入和核数组元素,即:0×0+1×1+3×2+4×3=19。
在上述计算过程中,卷积核从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组中相应位置的元素。对于输出数组的主要计算过程如下图所示:
在pytorch中主要实现代码如下:
import torch
from torch.autograd import Variable
input=Variable(torch.tensor([[[[0, 1, 2], [3, 4, 5], [6, 7, 8]]]]).type(torch.FloatTensor))
print(input)
kenal=Variable(torch.tensor([[[[0, 1], [2, 3]]]]).type(torch.FloatTensor))
out=torch.nn.functional.conv2d(input,kenal)
print(out)
输出为:
tensor([[[[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]]]])
tensor([[[[19., 25.],
[37., 43.]]]])
注:这里使用pytorch做卷积运算要遵守pytorch一些函数的规则,所以你会看到,上面一个数组会多出很多的[],不明白的小伙伴可以上网查一下资料。
2
卷积在图像中的简单应用
检测图像中物体的边缘,即找到像素变化的位置。首先我们构造一张6×86×8的图像(即高和宽分别为6像素和8像素的图像)。它中间4列为黑(0),其余为白(1)。如下所示:
[[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.]]) #输入图像
然后我们构造一个高和宽分别为1和2的卷积核K。当它与输入做互相关运算时,如果横向相邻元素相同,输出为0;否则输出为非0。
[[1, -1]] #卷积核K
将输入X和我们设计的卷积核K做互相关运算。可以看出,我们将从白到黑的边缘和从黑到白的边缘分别检测成了1和-1。其余部分的输出全是0。
[[[[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.]]]]
由此,我们可以看出,卷积层可通过重复使用卷积核有效地表征局部空间。
3
本文小结
1、 二维卷积层的核心计算是二维互相关运算。在最简单的形式下,它对二维输入数据和卷积核做互相关运算然后加上偏差。
2、可以设计卷积核来检测图像中的边缘。
5
参考文献
[1]http://www.hankcs.com/nlp/word-vector-representations-word2vec.html
[2]http://zh.d2l.ai/chapter_convolutional-neural-networks/conv-layer.html