卷积神经网络

来源:互联网 发布:淘宝上怎么评价不了了 编辑:程序博客网 时间:2024/05/27 09:48

1.什么是卷积

在通常形式中,卷积是对两个实变函数的一种数学运算。在百度百科中是这样说明的:在泛函分析中,卷积、旋积或摺积(英语:Convolution)是通过两个函数f 和g 生成第三个函数的一种数学算子,表征函数f 与g经过翻转和平移的重叠部分的面积。
使用数学表达式如下
设:f(x),g(x)是R1上的两个可积函数,作积分:
h(x) =+h(x)u(x-τ)d(τ)
具体这个表达式什么意思呢?其实我也不是特别明白,有兴趣的同学可以自己找资料学习一下,或者参考下面的几个回答。
http://blog.sina.com.cn/s/blog_7445c2940102wmrp.html
https://www.zhihu.com/question/21686447
总之需要明白一点的就是卷积神经网络之所以叫做卷积神经网络,是因为该网络中使用了卷积这种运算。

2.使用卷积核的意义

我们如果了解卷积就会知道有卷积核这么一个概念,那么卷积核有什么作用呢?比如下面的几张图片。(图片来源http://blog.csdn.net/zouxy09/article/details/49080029)
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
其实从这些图片里面我们就可以看到,卷积可以用来提取图片中的特征值。不同的卷积核凸显出来的图片效果不同,就可以得到自己感兴趣的一些特征。那么为什它能提取我们感兴趣的特征
假设我们设计的滤波器和想要识别的曲线如下:
这里写图片描述
假设上面的核(滤波器)按照卷积顺序沿着下图移动:
这里写图片描述
当移动到对应位置时,按照矩阵操作,将这个地方对应的像素址与卷积核相乘,那么我们就可以得到一个较大的值(6600)
这里写图片描述
而移动到其它区域就得到较小的值
这里写图片描述
因此我们就能通过卷积核凸显出我们的特征出来(以上部分参考https://www.zhihu.com/question/39022858)
3.卷积神经网络
我们知道卷积神经网络在做图形识别方面比较好,那么它又是怎么识别的呢?可以举一个简单的例子来说明(以下例子来源于《Neural Network and Deep Learning》)
如果要判断图片中是否是张人脸,也行可以这样
这里写图片描述
你可能觉得还不够具体,那么我可以继续的加隐藏层,让描述更加具体一点
这里写图片描述
上面特征提取需要用到卷积核,不同的卷积核就可以提取上面提到的眼睛、鼻子等特征。然后通过一系列多层结构来完成, 在前面的网络层,它回答关于输入图像非常简单明确的问题,在后面的网络层,它建立了一个 更加复杂和抽象的层级结构。

卷积神经网络的三个概念:局部感受野(local receptive fields),共享权重(shared weights),和池化(pooling)
在全连接的神经网络中我们会使用这样的结构
这里写图片描述
一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。所以全连接不仅参数多而且没必要。我们只需要使用卷积核对提取局部特征就可以了。

局部感受野

对于一张图片我们的输入是一张二维像素组成的数组,然后我们把输入像素连接到一个隐藏神经元层,但是我们不会把每个输入像素连接到每个隐藏神经元。相反,我们只是把输入图像进行小的,局部区域的连接。说的确切一点,第一个隐藏层中的每个神经元会连接到一个输入神经元的一个小区域,例如, 一个 5 × 5 的区域,对应于 25 个输入像素。所以对于一个特定的隐藏神经元,我们可能有看起 来像这样的连接:

这里写图片描述
这个输入图像的区域被称为隐藏神经元的局部感受野。它是输入像素上的一个小窗口。每个 连接学习一个权重。而隐藏神经元同时也学习一个总的偏置。你可以把这个特定的隐藏神经元 看作是在学习分析它的局部感受野。
我们然后在整个输入图像上交叉移动局部感受野。对于每个局部感受野,在第一个隐藏层中有一个不同的隐藏神经元。为了正确说明,请看下面的动态图
这里写图片描述
如此重复,构建起第一个隐藏层。注意如果我们有一个 28 × 28 的输入图像,5 × 5 的局部感 受野,那么隐藏层中就会有 24 × 24 个神经元。这是因为在抵达右边(或者底部)的输入图像之 前,我们只能把局部感受野横向移动 23 个神经元(或者往下 23 个神经元)。
我显示的局部感受野每次移动一个像素。实际上,有时候会使用不同的跨距。例如,我可以往右(或下)移动 2 个像素的局部感受野,这种情况下我们使用了 2 个跨距。

共享全值和偏置

    其实从上一副动态图中可以看出来,当我由第一副图变为第二幅图(也就是输入到隐藏层的过程),我是对第一副图使用了一个卷积核,然后不断移动卷积核得到第二幅图。也就是我们打算对隐藏神经元中的每一个使用相同的权重和偏置。换句话说,对第j,k个隐藏神经元,输出为:
σ(b+4l=04m=0wl,maj+l,k+m)
    这里 σ是神经元的激活函数 —— 可以是我们在前面章里使用过的 S 型函数。b 是偏置的共享 值。wl,m是一个共享权重的 5 × 5 数组(这里主要看你选取的卷积核是多大)。最后,我们使用 ax,y 来表示位置为 x, y 的输入激活值
    这意味着第一个隐藏层的所有神经元检测完全相同的特征,只是在输入图像的不同位置。比如我这个卷积核就是用来检测眼睛的,当卷积核不断移动的时候就能够把所有眼睛的特征提取出来了。用稍微更抽象的术语,卷积网络能很好地适应图像的平移不变性:例如稍稍移动一幅猫的图像,它仍然是一幅猫的图像。
因为这个原因,我们有时候把从输入层到隐藏层的映射称为一个特征映射。我们把定义特征映射的权重称为共享权重。我们把以这种方式定义特征映射的偏置称为共享偏置。共享权重偏置经常被称为一个卷积核或者滤波器。
    目前我描述的网络结构只能检测一种局部特征的类型。为了完成图像识别我们需要超过一个的特征映射。所以一个完整的卷积层由几个不同的特征映射组成:
这里写图片描述
为了让上面的图示简单些,我仅仅展示了 3 个特征映射。每个特征映射定义为一个 5 × 5 共享权重和单个共享偏置 的集合。其结果是网络能够检测 3 种不同的特征,每个特征都在整个图像中可检测。共享权重和偏置的一个很大的优点是,它大大减少了参与的卷积网络的参数。

池化

池化可以不按字面理解,把它理解成下采样(subsampling)。池化分为最大值池化和平均值池化,和卷积差不多,也是取一小块区域,比如一个2*2的方块,如果是最大值池化,那就选这4个像素点最大的那个输出,如果是平均值池化,就把4个像素点取平均输出。比如下面的最大化池
这里写图片描述
池化理论在于,图像中相邻位置的像素是相关的。对一幅图像每隔一行采样,得到的结果依然相差不会很大。
很显然使用池化能的简化从输出层输出的信息
这里写图片描述
比如上图从卷积层有 24 × 24 个神经元输出,池化后我们得到 12 × 12 个神经元。

对于卷积的输入一般是像素,对于卷积核的选取一般是随机选取,然后训练的时候通过BP算法来调节参数(具体怎么调节有兴趣自己可以查看一些资料)

对于代码的实现,你可以从https://github.com/mnielsen/neural-networks-and-deep-learning/blob/master/src/network3.py 下载作为一个库函数,使用这个库函数我们就可以构建如下浅层架构:
它仅仅使用一个隐藏层,包含 100 个隐藏 神经元。我们会训练 60 迭代期,使用学习速率为:η = 0.1,小批量数据 大小为 10,没有规范化。代码如下 :

import network3
from network3 import Network
from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer
training_data, validation_data, test_data = network3.load_data_shared()
mini_batch_size = 10
net = Network([
FullyConnectedLayer(n_in=784, n_out=100),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
net.SGD(training_data, 60, mini_batch_size, 0.1,
validation_data, test_data)

原创粉丝点击