天天看点

卷积神经网络之卷积

**各位同学上一节课我们介绍了信号上面的卷积运算,并且从信号上面的一个卷积运算类推到我们这里的二维图片上面一个卷积运算,也就是说,从一个核到一个整个图片之间,一个这两个函数之间的,做一个积分,然后形成的新的函数的自变量,也就是这个和和原来的函数之间的一个偏置,

本节课我们将会详细的介绍一下卷积神经网络的运算流程,

卷积神经网络之卷积

首先我们来看一下对于2d的图片数据它是怎么进行卷积运算的?比如说对于这里的image,我们把它起了个名字叫做image函数,他俩坐标是x和y坐标分别代表了这个x点和y点的一个像素值,然后对于这个和我们把它叫做kernel也是个小窗格,这个小窗格也是一个x和y的一个函数,然后我们生成了这个新的图片,我们把它叫做feature map,其实原来的这个图片也可以叫做feature map我们能把它叫做f函数f函数,也是x和y的一个,这样的定义对不对?**

如果是28的话,大家想一下和13它会移动到26就停止了,为什么?因为26,在移动的话,他就会移出这个窗口对不对?所以的话,它的范围是0到26,然后y的范围也要是一个方向。在竖的方向,在方向上面进行移动,它的范围也是从0到26之间,然后通过移动x和y在对应的位置作为一个这样的积分操作也就做一个卷积运算,他会得到一个新的,这样的函数叫做F(x,y)。

卷积神经网络之卷积

直观理解起来也就是一个这样的新的二维的一个这样的图片的数据,只不过这个图片的数据,他可能是26×26米,原来是28×28,因为有这个kernel的存在,他会有一部分会移出去了,所以得了新的图片大小会稍微小一点点,如果我们在周围补充一些零的话,周围补充一圈零的话,那这样子他移动起来得了图片数据会多一点点,她就会变成了28,也就会变成28这个叫做padding操作,我们这里先不讲,当然理解一下,对于一个kernel函数,K(x,y)的正函数和原来的image(x,y)的函数做一个卷积运算,是不是得到一个新的F(x,y)的函数。它是某一种运算,比如说他是一个边缘检测的核,她可能就代表这个边缘的信息,对不对?然后如果你这个kernel是模糊的一个kernel的话,那一个信息是什么?它可能是一个模糊的一个权值的一个图片输出信息,因此它取决于你是一个什么呢?观察的是视角,这个kernel,我们就把他理解为是一个观察的视角,就是你通过这个观察视角移动的时候,你就会生成一个新的map,这个原来图片,我们把他叫做map,新的图片也叫一个map。原来的map和这个新的map可能有一点的类似,甚至是一样大小的都是可能的,然后这个大小类似以后,但是它的图片的数据属性就有一点变化了,比如说你原来的map是原来的原始的图片数据,然后你一个边缘检测的这个视角去观察的话,你得了这个数据,那也就是一个代表了边缘数据的一个数据。

如果你其他的不同方式,比如说你检测这个图片里面有没有轮子?你检测这个图片里面有没有人脸?那么你以这种视角去观察的时候,你得了这个feature map,它就包含了有没有人脸?有没有轮子这种数据。

卷积神经网络之卷积

我们来看一下?如果你有多个视角的话,还会得到什么?比如说你这个视角,我们就说之前的那个位置视角,那里是边缘检测视角,对不对?然后你这一个视角,这里有三个视角,这个视角叫做模糊视角就是看一下模糊信息,你看这个视角,比如说你有没有轮子啊?或者说有没有face人脸?然后这个视角是有没有警察?有没有小狗?因此你对原来的一张图片,比如说它是一个一维的黑白图片,数据,那也就是(1,28,28),因为是一个通道,对不对?会生成一个多少通道会生成一个,这里是7个通道,然后26乘以26,我们现在来看一下,如果有多个kernel的时候,他会生成什么样子,当你有多个kernel的时候,我们刚刚讲了有多少kernel带过来的就有多少观察角度。有一个就会生成一个代表你这种观察角度相当的一个信息,因此你原来的一个一通道28×28的一个这样图片经过你这个kernel的数量?你一共有七个kernel的对不对?这里一共有七张feature map,然后每个feature map的size是多少?26×26,因为我们这里没有使用padding,所以它的大小会略微的少一点。

我们来看一下具体是怎么进行运算的?

卷积神经网络之卷积

我们来看一下具体是怎么进行运算的?我们刚刚讲了,对于这个图片上的这个3×3和原始的照片,上面的3×3做一个对应位置的一个卷积运算,然后再移动生成另外一个点,在移动相乘累加生成这个点,一次一次的累加他其实就是一个完成了一个卷积运算一个这样的过程。

卷积神经网络之卷积

如果你打了padding的话,那就这种情况,那你在左边和右边都model,填充一些0的数据,这样子的话,你生成的这个图片原来是5×5,然后你因为你打了padding,这个padding的数量取决于你自己,如果你打的越多的话,他生成的图片维度就越大,这也是5×5。如果你padding是二的话,那可能生成是6×6一般来说,我们不需要更大的这样的feature map生成,我们最多是保持不变就可以了,因此我们这里上下左右各打了一行的padding,他会得到一个5×5的相同大小的feature map。

我们这里来区分一下概念,首先是一个input channel?是指你原始的这个函数的一个通道,比如说我们这里的是黑白照片,因此input channel是一对不对?如果你用的是彩色的图片,那input channel可能是三,然后说到kernel channel的时候,我们要区分一下一个概念,一般来说,kernel channel指的是你有多少个核。大家来看一下你有多少个盒,那我们这里如果你使用了两个盒,那这个kernel channel就是两个通道,但是kernel channel他还有另外一个容易混淆的概念,kernel channel和input channel对应在一起的一个这样的属性在里面,我们下一个节会讲,然后kernel size,大家可以看到就是代表了我们这个小窗,那应该是3×3对不对?然后stride的是指什么意思呢?我们一次移动了多长,那么这个stride就是几。因此根据这些概念,我们就可以算出来我们得到了这个输出的图片的大小,那么如果上下和左右都打了padding的话,这个怎么计算呢?比如说,原来是一个5×5的一个这样的图片大小,我们跟一个3×3 kernel的做卷积,在打上padding=1,因此他得了5×5的一个这样的feature map。

卷积神经网络之卷积

这里有意区分就是kernel他本身有一个通道,比如说我们这里使用两个kernel,一个是edge,还有一个是blur,他的就是什么?一个是检测边缘的,还有一个是模糊的,一个这样的通道,因此他是二。但是还有另外一个概念,我们会在下一节会讲。

具体的生成图片大小我们可以根据这个公式来计算,大家可以去计算一下,一般来说,我们做深度学习的时候可以根据感觉看一下,首先是padding等于零的时候,看一下输出的图片大小,如果不满意的话,我们再padding加一或者加二呀之类的,

现在我们来看一个更加常见的情况什么?

卷积神经网络之卷积

首先我们这个输入的图片大小是一张图片,然后这个图片上通道是有三个通道,图片大小是28×28,因此这个channel是指的是input channel,对不对?然后这个kernel为什么是(3,3,3)呢?对一个kernel来说,因为你一个kernel要分别对于三张图片上面的rgb通道上面多进行卷积运算,因此你这kernel的这个维度,肯定是三,然后面的维度,为什么是3×3?也就是说,一个3×3的一个这样的kernel,然后他有三个这样的kernel,懂吗?他有三个这样的kernel这三个kernel为什么是三个kernel这三个kernel是跟我们之前的R GB有三个通道,一一对应起来的,就你这个。

通道用这个kernel来,这个通道应这个kernel来,这个通道应这个kernel来,然后这三个kernel,加在一起叫做一个kernel,因为他是一个kernel的三个通道,这个kernel是指什么?这个kernel的三必须跟你这个input的通道完全匹配起来,如果你input channel不是三是16个通道的话,那你这里必须是16因为你要一个这样的map对应一个map起来。所以的话,如果你x是比如说(32,28,28),这意味着你输入32个通道,那你的一个kernel维度必须是什么的?32,28,28,因为你每一个kernel,都要对一个x上面的map做一个这样的卷积运算,这个整个加一起叫做一个channel的啊,这个概念很容易混淆起来,而且没有这么多名字,起名字就好像东西他有这么多名字给你起名字都只能够意会,大家注意一下,然后如果我们刚才讲了,你除了有一个edge kernel以外,还有一个blur kernel对不对?因此,这有两个kernel,所以的话,我们这里是多少?2,32,28,28。我们现在来把这个情况变得复杂,而且变得更加的接近于实际情况,其实际就是实际的情况就什么意思呢?我们这里输入的图片。

不再是一个通道,因为一个通道,很容易引起忽略,就是这个一维度你很容易把它去掉,我们这里是三个通道,你要有B张照片,然后每一个通道大小是28×28,因此,对于一个kernel来说,一个kernel的话,它的大小是3×3,然后他要对原来的x,他一个x,共有三个这样的feature map那里每一个feature map上面都要有一个张小窗口,大家注意啊,不是一个小窗口,对所有feature map的元素相乘,那里如果是一个小窗口,对这个所有元素相乘,那里只有三个元素,你一个小窗的只有一个元素,那所以他其实是这样子,一个看到的话,如果你input的有16个通道,那你必须带有16个这样的window,如果你input的只有一个的话,那你是一个。如果三个的话,那也是三个。

OK,因此这里的3和这里的3必须完全匹配起来,就你有多少个input channel和一个kernel,他必须匹配起来,然后这个kernel如果有多个kernel的话,这个也叫做kernel。大家注意啊,很多名字是没办法起名字的。所以的话,他有三个名字,一个叫kernel,一个叫filter,一个叫weight,大家知道以后这三个名字都是表示同一个概念,然后我们一般只这个kernel的channel,是指这个维度,你说说你有多少个channel这一位叫你有多少个kernel,然后你这个kernel的第二个维度的大小size给你channel的size只是完全匹配起来的就是这个输入的是16个channel的话,那你这里必须是16然后这个大小是由你选择的这个为了你观察的范围,3×3, 5×5呀,7×7都是可以的,然后还有一个问题就是说每一个kernel都会带一个偏置,这个偏置跟你的kernel的数量是完全匹配起来的,因此这个维度跟这个维度是匹配,然后这个维度跟input的维度是完全匹配起来得到了大小,

说什么首先第一个维度还是你有多少张照片对不对?然后得到feature map的数量,到底是input channel的数量还是kernel的数量,很明显是kernel的数量。因为一个kernel和前面的所有的channel的通道都会做一个对应的元素的卷积运算在累加起来,因此这里是16,然后大小可能是26呀26呀,取决于你有没有padding。

让我们来看一个具体的网络,也就是当时lekun做邮政编码识别的时候,一个具体的网络,

卷积神经网络之卷积

详细内容下一个博客再继续发

继续阅读