**今天,我们来正式讲计算机视觉里面一个非常非常广泛的网络,叫做
卷积神经网络
,可以说卷积神经网络是现在计算机视觉的一个核心的概念,再讲卷积神经网络用于图片处理之前,
首先我们来看一下图片是怎么表示的?
我们现在来看一个Minist的图片,
我们之前已经接触过了,他是一个28行乘以28列的一个这样的数据,我们用一个矩阵来表示这个矩阵的每一个元素,要么是零,要么是一。然后这个矩阵的每一个元素代表了当前这个像素点的一个数值,因为当前的minist他是一个黑白图片,因此我们只使用了一张这样的值来表达。每一张表的这个点表达了这个图片的灰度值,他是从0到255的这样一个数值,我们也可以把它变换到一个0到1的范围之内,就比如说,0代表是全白,1代表的是全黑,因此他就变成了一个0到1的,这样的浮点数数组,我们在做Deep Learning的时候,一般的是使用0到1的这个范围,但是数据存储的时候,他可能会存储到0-255,因此我们把它加载进来的时候会把它除以一个255,这样的分数会使得它的范围变到0到1的这个区间。
自然界更常见的是彩色的图片对于彩色的图片,我们如果忽略他的α通道的话,那就是一个rgb的数值,因此,我们使用三张表了存储,每一张表存储了这张图片的RGB三个通道的每个数值,每个数值也是0到255或者是0到1以后我们讲的图片都是归一化成0到1的这个区间来看, 在表达一张彩色图片的时候,我们可以分开来这么讲,
但是更多的是我们把三张图片叠加在一起,表示这张图片他有三个通道,然后这个图片的宽度和高度也非常形象的表达出来了,
现在我们来看一下,对于这种具有位置相关性的这种数据,输入我们神经网络是怎么处理的?
首先,我们之前已经非常详细地介绍了一下全连接网络在pytorch里面,它也叫做线性层,其实那个线性层,他仅仅表达的是这个全连接网络的线性部分我们线性层,后面他还会加一个非线性的单元,叫做激活函数,因此,我们不管是叫线性层还是叫全连接层,都是指的是整个东西,但是我们实现的时候就linear是没有包含激活函数这一部分的,我们来看一下对于图片中的这一个非常非常简单的,有几层,我们来数一下。
对于神经网络,我们第一层叫做输入层。对于输入层的话,我们是不把他计算在内的,因为它仅仅是一个数据的输入,然后有一个隐藏层,两个隐藏层,三个隐藏层,还有一个输出层,因此他加起来一共是有四层,如果我们问你,他有多少个隐藏层,我们一般指的是中间的这些层数,因此它是有三个隐藏层,对于某一层的话,我们一般是指这一层的权值和这一层的输出加在一起,叫做一层,因此,它的一层的概念是指这一部分,然后下一层的概念是指这一部分,如果我们要处理一个非常非常简单的minist的图片数据集的话,他的输入本来是28乘以28的一个这样的矩阵,因为要方便全连接的一个处理,我们把它打平成了一个784维的向量,然后中间节点,我们这里不取比较大的,我们全部取256
因此它一共有五层,一共有四个hidden layer对不对?然后输出的话是minist的是一共有十类,因此我们有十个这样的节点,我们来简单计算一下,对于一个这样的四个隐藏层,一个五层的非常非常简单的网络,他大概需要多少参数量?怎么计算呢 ,参数量就意味着它有多少条线,就意味着这是一个参数,这是一个参数,它有多少条线,那他就有个多少的参数量,我们现在来简单的算一下,对第一层那是784,这里是784×256,然后对于第二层呢?256×256,对于第三层也是256×256,然后最后一层呢,就是256×10,然后我们把它累加在一起,大概我已经计算过了,是390K的参数量,然后每一个参数,我们是用一个四字节的浮点数来表示,因为乘以四的话,它大概是1.6M,也就是1.6M的这样的内存存储或者是显存,如果你使用GPU的话,这个数字,我们现在看来是非常非常小的,因为它是用来处理这种简单的数字识别,但是对于当时这个minist和这个lenet是在80年代发明的,当时还是386的时代,386时代是什么概念呢?当时的处理器可能就只有几10 KB,比如说30 KB或者顶多顶多上百KB的样子,因此,对于一个非常非常简单的数字处理的识别问题,我们这些神经网络维度还只用了256,都没有用,512,如果用512的话,
那就更大了,他对于一个这样简单的网络,它也装不进内存里面,更别家说显卡了当时都没有显卡这个概念在里面,所以的话怎么办?
当时我们即使这个网络是不能直接计算的,我们也要想办法解决,所以在1986年的时代,
所以当时的计算机学家借鉴了人脸的概念,借鉴了生物学上的一个概念,就比如说这个小孩子,他一眼看到桌上的时候,他被其中的蛋糕所吸引了,因此在他的视野里面,虽然说整个视野都能看得到,但是我们一眼看到的时候,这个小朋友第一眼看到的时候,它可能是这个蛋糕,他忽略了旁边的一些东西,然后等它慢慢的回过神来以后,他才开始去关注旁边的一些事物,所以人眼的一个这样的机制,它就是一个这样的局部相关性,就好比我们去看一个风景的时候,我们并不是一瞬间把所有的风景都纳入眼底的,我们是一下子看一个部分,然后有一个这样的不自觉的扫描的一个过程在里面,只不过因为时间太短了,所以我们把这些信息综合在一起了,觉得我们看到的是所有的风景,但实际上我们是有体会的人眼他就是这样的局部相关性,这种局部相关性,我们这种局部相关性,我们把它叫做感受野,也就是感受视野的意思就是说我们的感受,他不是全局的,他是一次一个块一次一个小块的,
因此当时的计算机学家在1980年代,86年的89年代就提出了一个模仿人眼的一个局部相关性,局部感受的一个机制,提出了一个网络叫做卷积神经网络
,也就是我们这节课要讲的卷积和下一节课要讲的卷积神经网络这个卷即指的是这个局部相关性,也就是说他一次感受的是一个小方块,他不是一个整个的大区间,如果是大区间的话,那就是整个大的图片,就是784一个这样的节点,但是他一次感受是一个小视野,然后这个参数量比如说是3×3,因为它的参数量就只有一个9本来是784×256。但是我们这里只变成了9×1个输出节点,比如说10那90,而且这个小窗口他会移动,但是移动的时候她这个权值是共享的,但是这里不要觉得以后会详细讲解这个卷积的操作是具体怎么进行的?我们这里只给一个大概的一个感受,通过这种权值共享权值共享是什么意思啊?就是说这样一个小窗口,他会扫过整个的大的图片,然后扫的时候使用的是同相同的参数,也就是w参数是不变的,扫完一次以后,在返回的时候才会更新一次,因此,这种东西它就叫做weight sharing,权值共享是现在Deep learning里面用了一个非常非常多的一个,这样的概念在里面,然后我们这里不提我们以后的rnn循环神经网络也会用一个权值共享一个概念在里面,我们大概来计算一下,对于一个使用的权值共享的网络,比如说这里的网络在用来做邮编的 一个识别它的名字叫做Lenet。对于lenet5话,它的参数量大概是60k,我们之前还记得吗?是390K对不对?然后我们这里一共有多少层呢?一共有六层,或者是五层,如果你不算最后一层的五六层的样子,比之前的还要多一层,但是它的参数量却少了多少倍,是原来的1/6。所以说weight sharing也就是现在的神经网络,成就网络了一个核心的概念就是说局部相关性,通过使用局部相关性,促成了这种共享的机制。
那我们具体来看一下,这种局部相关性,他是怎么做的呢?
比如说,对于一张这里的图片,他是长和宽,分别是28×28,如果我们用一个小窗口去感受的话,比如说这个小窗口的维度是3×3,因此对于输出这个节点的值,比如说这里指的是Y 。Y就等于多少?Y,就等于只要九个参数和原来的28个参数,中间的每一个参数位置相乘就可以得到了,就比如说这个节点的值,他是这个小窗口跟大窗口一直移动中运算,移动中运算一直得到,得到的是一个什么得到的也是一个维度大小相同大小的一个这样的窗口,但是这个窗口中的每一个值使用的参数量还是这个小窗口的参数量,也就是说,他只有九个这样的参数,在中间没有增加额外的参数,在参数上大大减少了比起原来的连接线,原来连接线有多少个。讲一下,如果这个节点跟前面全部相连的话,那是不是有784条线相连接?现在我们因为使用了一个滑动的小窗口。这个小窗口只有九根线,对不对?所以我们生成一个这样的map,我们叫做一个map,map就是一个表格的意思,或者叫做feature map,feature代表了这个图片的某一种属性,所以我们把它叫做一个特征,这个就是feature map,他只有九根线连接,对吗?之前我们是有一个节点,跟前面的节点是全部相连接的有784,我们来看一下之前是怎么连接的?对于之前的某一个节点,这里她跟所有的这里28×28的所有的节点都会全部相连在一起过来看一下,把它打平了,写就这么样子写,从第零号几点到783号结点?前面的每一个节点都和 这有一个节点相连接,所以她的每一个节点的连线就有784条,但是对于我们卷积神经网络,比如说我们现在变成卷积神经网络的话,只有他跟他相关的几条线,比如,就只有九条线,跟它相关的九条线会连在一起,其他的这些都是断开的,都是断开的,看懂了吗?
就是本质区别本来有784个全连接,现在变成了九个权值,就是因为他只考虑到了跟他局部相关的一些位置的属性,跟她太远的位置,他没有考虑在里面,我们现在来看一幅示意图,
比如说对于这中间的一个爱因斯坦的一个头像,全连接的话置于中间层的每一个节点,比如说0号节点,他跟前面的784,这里说的是1000×1000,那我如果是28×28那就784条线,然后我们来看一下,如果是卷积的话,对于卷积的一个层,他也是生成了一个这样的正方形的feature map,这个feature map中将每一个点只考虑到对应点的周边的一些属性,因此他这个点的连线只有九根。对不对?如果是3×3的话,那就九根,懂吗?通过这种方式,我们的一个卷积层的,整个的权值的数量会成倍成倍的减少,但是他也同样的考虑到了整个图片的权值的信息,只是说他移动的时候,这个窗口使用的是同样的参数,使用的是这九个参数,因此它既考虑到整个的属性,但是又照顾到她跟她局部相关的一些未知性,那么对于一个3×3的一个这样的小窗口跟原来的大窗口,中间的一个对应的这个小窗口,这两个三乘3和3乘三的这个数据,它进行的是哪一种运算呢?大家想一下,它可以进行三乘3和3乘一个矩阵运算也可以进行相应元素下面的一个相乘,或者是相应元素,上面一个相乘再累加对不对?很明显这里相乘再累加他会变成一个点,因此是适合我们这里的,这种情况的,我们把那个相成相累加的操作叫做卷积操作,
首先我们来看一下对于卷积操作,在信号处理里是有一个非常正式的一个定义的,我们来看一下这幅动图,
对于这个蓝色的线,我们把它叫做x涛函数x,他还说,他是一个简单的将那个克常数,然后对于红色的这个函数,它是在移动的,我们把它叫做h涛函数,首先我们把这个函数给画出来,因此对于x 涛函数,它就是一个在坐标中心原点的x涛,然后呢?对于h涛,他有可能是在这个位置,我们先假设它在这个位置,这就叫做这种H涛,首先我们来看一下这个定义,它是乘以什么啦,x涛跟h负涛加t,她是傅涛加t,然后的一个积分,也就是他们公共部分。所以的话,h负涛那就变成了这个地方,他说,h付涛现在到h负涛对不对?如果t=0的时候,我们来看一下t=0的时候呢?就是我们这个新的卷积操作的自变量,我们新的卷积操作的自变量t=0的时候看一下,那就是这个h0-涛,也就是现在的这个位置,他们之间的积分,x涛和h负套的积分是零,对不对?所以的话,这一定函数的位置是零,如果涛等于负数的话,涛等于负多少?假设这里是这个距离是负二,因此当涛等于负二的时候,就意味着我们把ht函数往左边移动了负二格。大概是移动到这个位置,因此到了负二的时候,这个函数的值还是零,但是负二,再小一点点,他就会慢慢的重叠出来对不对?
但是慢慢重叠出来,比如说到这里的时候,哎,开始有重叠了,刚好跟这个运动是相反的,当它们重叠完全重叠的时候,就比如说h(t)到了这个位置,然后完全重叠,因此它会变成一个达到了一个重叠的最大程度,也就是积分最大的位置,然后他再慢慢的减少,他就会重叠,又会出来,因为会变成这个位置,所以他们重新的部分只有这部分了,所以他们会慢慢地减少,直到最后所以说它生成了这个新的函数,y(t)。这个t其实就是一个偏移,我们把它叫做offset,她也就是说一个一个原来的函数,h涛和新的函数和一个原来的函数h(x)涛和另外一个函数h掏一个偏移的积分运算,那么这种运算怎么对应到我们这里的图片上面的卷积运算上面来呢?
首先我们来看一下,对于对于这里的和,我们把它叫做一个名字叫做x涛,对于我们这里的原来的图片,比如说28×28,1个数字,我们把它叫做h涛,然后成的得到了新的叫做y(t),我们看一下y(t)是什么得到y(t)?也就是说,因为我们这里是二维的,是wx和y的一个这样的偏置对不对?如果yt等于0和0的时候,这意味着什么都意味着这个和和这个和的偏移是零,因此他可能是在这个位置做了一个这样的积分运算,然后积分运算在离散的上面就是一个对应的相乘对不对?所以的话,它是一个对应窗口的一个相乘,因此他会得到一个这样的窗口相乘,然后对于y(0,1)的时候,他就一动向这边移动一小格,对于y(1,0)的时候就会向下移动一窗口。
这就是卷积神经网络的一个由来,因为它模拟的这种操作,跟我们信号里面的卷积也是一样的,只不过在离散领域,所以他们的看上去可能也不太一样,然后我们生成的新的feature map的自变量是一个二维的一个数据,它的自变量分别是横坐标x和y坐标,然后横坐标和y坐标,我们刚刚讲的是一个偏置,它代表的是这个窗口,这个窗口在这个大窗口上面的一个移动的位置,也就是从这边移动的一个位置和从下移动的一个位置,
所以的话,这就是卷积神经网络的一个由来,也就是为什么这个操作,他就叫卷集操作,是因为他做的这个运算,他确实是信号上面的那个卷集运算,然后我们来看一下,采用这种矩形运算会有什么好处呢?
在信号处理领域卷积运算,他是一个非常常常见的一个概念,比如说我们对一个图片来做一个这样的sharpen操作
在信号处理领域卷积运算,他是一个非常常常见的一个概念,比如说我们对一个图片来做一个这样的sharpen操作,就是比他变得更锐利,因此我们用一个5×5的一个这样的核和这个图片做一个卷积运算,然后生成的这个feature map的维度也是原来的维度相似,只不过这个运算可能没有信号里面那个运算看起来那么直观,但是我们可以理解一下,为什么要做这么运算?因为我们本质上图片,他做的就是一个这样图片处理,然后我们通过卷积运算就可以利用我们之前图片处理的一些先验知识,就比如说我们都要做锐化的话的话的话,就可以们就可以直接给出来了,
然后除了锐化以外,还有一个叫模糊,就是取与周围一些值相乘以后在哪家一起来这样子的话?他就考虑到周围一些情况,这就是一个模糊的一个卷积核在这里
对于另外一个边缘检测,我们做一些智能小车的时候也会做这个边缘检测,它就是一个这样的,具体的,卷积核的运算,因此,我们来看一下如何利用一个现成的卷积核来得到一个新的函数,
如果我们每一次扫描的时候是使用不同的盒的话,那就会得到不同的类型的图片,就比如说我们上面讲的,如果我们扫描的时候是用的这个边缘检测的核。他因此他得了这个特征就代表边缘的特征,如果我们之前的时候是用的这个模糊核那得了这个图片得了这个数据,他也就是一个模糊图片,因此我们把它扫描以后生成的这一个map
叫做feature map,也就很好理解了,因为他是用一个具体的这样的x涛这样的盒这样得到了一个这样的feature,一个这样的特征,如果我们使用不同的核,会得到不同的特征,因此,对于每一个叫做feature map这个整个在一起就是作为边缘检测的一个代表,因为他的一个feature maps,
然后我们下一节课会详细讲解如何使用我们这一节课,讲到了这个卷积的概念来完成我们现在目前的这个非常典型的一个卷积神经网络的一个运算。**
来源:CSDN
作者:weixin_43437893
链接:https://blog.csdn.net/weixin_43437893/article/details/104355889