精华内容
下载资源
问答
  • 卷积神经网络中输入图像尺寸的确定

    在学习pytorch的过程中,看到一些代码的解释中会说这个网络的期望输入大小为32x32(也可能是其他数字),请将输入图片调整为32x32。开始的时候有一些不解,仔细看代码后明白,为代码条理清晰,一些神经网络结构事先被定义好,当卷积神经网络中包含有全连接层时,由于全连接层被设置为是固定尺寸的输入输出,全连接层的输入与输入图像尺寸息息相关,故定义好网络结构后,输入图像尺寸亦随之确定。所以在用pytorch编写神经网络结构时,尤其是卷积神经网络,要特别注意输入图像的尺寸,如果想套用某个网络结构,需要先通过网络结构计算出输入图像尺寸,将自己的图像调整为所需要的尺寸;当然还可以根据自己的图像尺寸适当调整网络结构。以下是具体操作方法。

    分析神经网络结构

    示例:

    class ConvNet(nn.Module):
        def __init__(self):
            super().__init__()
            # 1,28x28
            self.conv1=nn.Conv2d(1,10,5) # 24x24
            self.pool = nn.MaxPool2d(2,2) # 12x12
            self.conv2=nn.Conv2d(10,20,3) # 10x10
            self.fc1 = nn.Linear(20*10*10,500)
            self.fc2 = nn.Linear(500,10)
        def forward(self,x):
            in_size = x.size(0)
            out = self.conv1(x) #24
            out = F.relu(out)
            out = self.pool(out)  #12
            out = self.conv2(out) #10
            out = F.relu(out)
            out = out.view(in_size,-1)
            out = self.fc1(out)
            out = F.relu(out)
            out = self.fc2(out)
            out = F.log_softmax(out,dim=1)
            return out
    

    在写代码时,尽量将每一层的输入输出尺寸标注出来,以便后续阅读。
    首先介绍Conv2d、max_pool2d的参数:
    torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
    in_channels:输入通道数
    out_channels:输出通道数(卷积核的个数)
    kernel_size:卷积核的尺寸
    stride:卷积步长(默认值为1)
    padding:输入在每一条边补充0的层数(默认不补充)
    dilation:卷积核元素之间的间距(默认值为1)
    groups:从输入通道到输出通道的阻塞连接数(默认值是1)
    bias:是否添加偏置(默认是True)
    torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
    kernel_size:池化的窗口大小
    stride:窗口移动的步长,默认值是kernel_size
    padding:输入的每一条边补充0的层数
    dilation:一个控制窗口中元素步幅的参数
    return_indices:如果等于True,会返回输出最大值的序号,对于上采样操作会有帮助
    ceil_mode:如果等于True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作
    接下来通过网络结构分析每层输出尺寸大小:
    重要公式:边长为n的图像,经过卷积核尺寸大小为k,步长为s的卷积,得到边长为1+(n-k)/s的图像
    举例说明:
    分析一下代码的输出尺寸:

    class ConvNet(nn.Module):
        def __init__(self):
            super().__init__()
            # 1,28x28
            self.conv1=nn.Conv2d(1,10,5) # 24x24
            self.pool = nn.MaxPool2d(2,2) # 12x12
            self.conv2=nn.Conv2d(10,20,3) # 10x10
            self.fc1 = nn.Linear(20*10*10,500)
            self.fc2 = nn.Linear(500,10)
       def forward(self,x):
            in_size = x.size(0)
            out = self.conv1(x) #24
            out = F.relu(out)
            out = self.pool(out)  #12
            out = self.conv2(out) #10
            out = F.relu(out)
            out = out.view(in_size,-1)
            out = self.fc1(out)
            out = F.relu(out)
            out = self.fc2(out)
            out = F.log_softmax(out,dim=1)
            return out
    

    为了清晰分析,在编写神经网络结构的代码时,最好将会使输入输出改变的结构(例如本例的卷积层和池化层),在前面定义出来。如果读别人已写好的代码时,一定要结合前向传播的结构来分析,不能只看代码的上面部分,因为神经网络的结构中,可能还含有其他能改变图像尺寸的结构。在上述代码中,只有以下代码部分会改变输出图像尺寸大小。

            # 1,28x28
            self.conv1=nn.Conv2d(1,10,5) # 24x24
            self.pool = nn.MaxPool2d(2,2) # 12x12
            self.conv2=nn.Conv2d(10,20,3) # 10x10
            self.fc1 = nn.Linear(20*10*10,500)
            self.fc2 = nn.Linear(500,10)
    

    假设输入图像尺寸为28x28
    第一层卷积卷积核尺寸大小为5x5,步长为1。所以输出图像尺寸:1+(28-5)/1=24
    即代码第二行注释标注:经过第一层卷积层后,输出图像尺寸变为24x24
    同理,在池化层,池化窗口大小为2x2,移动步长为2,所以经过池化层后,输出图像尺寸变为12x12
    第二层卷积尺寸大小为3x3,步长为1,所以输出图像尺寸:1+(12-3)/1=10
    经过第二层卷积后,输出图像尺寸为10x10,输出维度为20,所以全连接层的输入固定为201010
    所以此网络只接受输入图像尺寸为28x28。
    如果,不想改变输入图像的尺寸,可以通过以上步骤,计算出全连接层的输入,适当改变神经网络结构,已达到理想的效果。
    现在很多卷积神经网络模型,都用卷积层替代全连接层,就是因为这个原因。因为全连接层的参数的尺寸与输入图像的尺寸有关,故输入图像尺寸改变,模型参数初始化尺寸亦改变。若采用卷积层替代全连接层,则输入图像尺寸改变,模型不用做任何改变。

    展开全文
  • 神经网络结构汇总

    千次阅读 2019-02-27 17:06:49
    本文收集了一些神经网络的架构,包含常用的一些模型。 LeNet51.Input  输入图像统一归一化为32*32。2.C1卷积层  经过(5*5*1)*6卷积核,stride=1, 生成featuremap为28*28*6。3.S2池化层  经过(2*2)采样核,...

    本文收集了一些神经网络的架构,包含常用的一些模型。

    LeNet5

    LeNet5
    1.Input
      输入图像统一归一化为32*32。
    2.C1卷积层
      经过(5*5*1)*6卷积核,stride=1, 生成featuremap为28*28*6。
    3.S2池化层
      经过(2*2)采样核,stride=2,生成featuremap为14*14*6。
    4.C3卷积层
      经过(5*5*6)*16卷积核,stride=1,生成featuremap为10*10*16。
    5.S4池化层
      经过(2*2)采样核,stride=2,生成featuremap为5*5*16。
    6.C5卷积层
      经过(5*5*16)*120卷积核,stride=1, 生成featuremap为1*1*120。
    7.F6全连接层
      输入为1*1*120,输出为1*1*84,总参数量为120*84。
    8.Output全连接层。
      输入为1*1*84,输出为1*1*10,总参数量为84*10。10就是分类的类别数。

    AlexNet

    AlexNet
    1.Input
      输入图像为227*227*3。
    2.Conv1
      经过(11*11*3)*96卷积核,stride=4, (227-11)/4+1=55,生成featuremap为55*55*96。
    3.Pool1
      经过3*3的池化核,stride=2,(55-3)/2+1=27,生成featuremap为27*27*96。
    4.Norm1
      local_size=5,生成featuremap为27*27*96。
    5.Conv2
      经过(5*5*96)*256的卷积核,pad=2,group=2,(27+2*2-5)/1+1=27,生成featuremap为27*27*256。
    6.Pool2
      经过3*3的池化核,stride=2,(27-3)/2+1=13,生成featuremap为13*13*256。
    7.Norm2
      local_size=5, 生成featuremap为13*13*256。
    8.Conv3
      经过(3*3*256)*384卷积核,pad=1, (13+1*2-3)/1+1=13,生成featuremap为13*13*384。
    9.Conv4
      经过(3*3*384)*384卷积核,pad=1,(13+1*2-3)/1+1=13,生成featuremap为13*13*384。
    10.Conv5
      经过(3*3*384)*256卷积核,pad=1,(13+1*2-3)/1+1=13,生成featuremap为13*13*256。
    11.Pool5
      经过(3*3)的池化核,stride=2,(13-3)/2+1=6,生成featuremap为6*6*256。
    12.Fc6
      输入为(6*6*256)*4096全连接,生成featuremap为1*1*4096。
    13.Dropout6
      在训练的时候以1/2概率使得隐藏层的某些神经元的输出为0,这样就丢掉了一半节点的输出,BP的时候也不更新这些节点,以下Droupout同理。
    14.Fc7
      输入为1*1*4096,输出为1*1*4096,总参数量为4096*4096。
    15.Dropout7
      生成featuremap为1*1*4096。
    16.Fc8
      输入为1*1*4096,输出为1000,总参数量为4096*1000。

    总结:

    1.网络比LeNet更深,包括5个卷积层和3个全连接层。
    2.使用relu激活函数,收敛很快,解决了Sigmoid在网络较深时出现的梯度弥散问题。
    3.加入了dropout层,防止过拟合。
    4.使用了LRN归一化层,对局部神经元的活动创建竞争机制,抑制反馈较小的神经元放大反应大的神经元,增强了模型的泛化能力。
    5.使用裁剪翻转等操作做数据增强,增强了模型的泛化能力。预测时使用提取图片四个角加中间五个位置并进行左右翻转一共十幅图片的方法求取平均值,这也是后面刷比赛的基本使用技巧。
    6.分块训练,当年的GPU没有这么强大,Alexnet创新地将图像分为上下两块分别训练,然后在全连接层合并在一起。
    7.总体的数据参数大概为240M。

    VGG

    Vgg

    1.Input层
      输入图片为224*224*3。
    2.CONV3-64
      经过(3*3*3)*64卷积核,生成featuremap为224*224*64。
    3.CONV3-64
      经过(3*3*64)*64卷积核,生成featuremap为224*224*64。
    4.Max pool
      经过(2*2)max pool核,生成featuremap为112*112*64。
    5.CONV3-128。
      经过(3*3*64)*128卷积核,生成featuremap为112*112*128。
    6.CONV3-128
       经过(3*3*128)*128卷积,生成featuremap为112*112*128。
    7.Max pool
      经过(2*2)maxpool,生成featuremap为56*56*128。
    8.CONV3-256
      经过(3*3*128)*256卷积核,生成featuremap为56*56*256。
    9.CONV3-256
      经过(3*3*256)*256卷积核,生成featuremap为56*56*256。
    10.CONV3-256
      经过(3*3*256)*256卷积核,生成featuremap为56*56*256。
    11.Max pool
      经过(2*2)maxpool,生成featuremap为28*28*256。
    12.CONV3-512
      经过(3*3*256)*512卷积核,生成featuremap为28*28*512。
    13.CONV3-512
      经过(3*3*512)*512卷积核,生成featuremap为28*28*512。
    14.CONV3-512
      经过(3*3*512)*512卷积核,生成featuremap为28*28*512。
    15.Max pool
      经过(2*2)maxpool,生成featuremap为14*14*512。
    16.CONV3-512
      经过(3*3*512)*512卷积核,生成featuremap为14*14*512。
    17.CONV3-512
      经过(3*3*512)*512卷积核,生成featuremap为14*14*512。
    18.CONV3-512
      经过(3*3*512)*512卷积核,生成featuremap为14*14*512。
    19.Max pool
      经过2*2卷积,生成featuremap为7*7*512。
    20.FC-4096
      输入为7*7*512,输出为1*1*4096,总参数量为7*7*512*4096。
    21.FC-4096
      输入为1*1*4096,输出为1*1*4096,总参数量为4096*4096。
    22.FC-1000
      输入为1*1*4096,输出为1000,总参数量为4096*1000。

    总结:

    1. 共包含参数约为550M。
    2. 全部使用3*3的卷积核和2*2的最大池化核。
    3. 简化了卷积神经网络的结构。

    展开全文
  • 为了克服神经网络在基本算法上存在收敛精度低、收敛慢、不收敛和网络结构难以确定等缺陷,采用常用的8种智能算法对故障样本进行诊断性能对比实验,得出网络最优结构的设计步骤和较好的6种智能算法。用这6种智能算法对...
  • 卷积神经网络结构相关

    千次阅读 2018-04-28 13:20:05
     本文将详细介绍卷积神经网络以及它的训练算法,以及动手实现一个简单的卷积神经网络。 一个新的激活函数:Relu 最近几年卷积神经网络中,激活函数往往不选择sigmoid或tanh函数,而是选择relu函数。R...

    PART 1


    针对conv层、全连接层、pooling层,另外稍带介绍了CNN中的激活函数Relu。文章主要参考了零基础入门深度学习(4)中的内容,并根据本人对于CNN的理解进行了部分修改。

     

    本文将详细介绍卷积神经网络以及它的训练算法,以及动手实现一个简单的卷积神经网络。

     

      一个新的激活函数:Relu  

     

    最近几年卷积神经网络中,激活函数往往不选择sigmoid或tanh函数,而是选择relu函数。Relu函数的定义是:

     

    Relu函数图像如下图所示:

     

    Relu函数作为激活函数,有下面几大优势:

     

     

     

    • 稀疏性 通过对大脑的研究发现,大脑在工作的时候只有大约5%的神经元是激活的,而采用sigmoid激活函数的人工神经网络,其激活率大约是50%。有论文声称人工神经网络在15%-30%的激活率时是比较理想的。因为relu函数在输入小于0时是完全不激活的,因此可以获得一个更低的激活率。

     

      全连接网络 VS 卷积网络  

     

    全连接神经网络之所以不太适合图像识别任务,主要有以下几个方面的问题:

     

    • 参数数量太多

     

    考虑一个输入1000*1000像素的图片(一百万像素,现在已经不能算大图了),输入层有1000*1000=100万节点。假设第一个隐藏层有100个节点(这个数量并不多),那么仅这一层就有(1000*1000+1)*100=1亿参数,这实在是太多了!我们看到图像只扩大一点,参数数量就会多很多,因此它的扩展性很差。

     

    • 没有利用像素之间的位置信息 

     

    对于图像识别任务来说,每个像素和其周围像素的联系是比较紧密的,和离得很远的像素的联系可能就很小了。如果一个神经元和上一层所有神经元相连,那么就相当于对于一个像素来说,把图像的所有像素都等同看待,这不符合前面的假设。当我们完成每个连接权重的学习之后,最终可能会发现,有大量的权重,它们的值都是很小的(也就是这些连接其实无关紧要)。努力学习大量并不重要的权重,这样的学习必将是非常低效的。

     

    • 网络层数限制 

     

    我们知道网络层数越多其表达能力越强,但是通过梯度下降方法训练深度全连接神经网络很困难,因为全连接神经网络的梯度很难传递超过3层。因此,我们不可能得到一个很深的全连接神经网络,也就限制了它的能力。

     

    那么,卷积神经网络又是怎样解决这个问题的呢?主要有三个思路:

     

    • 局部连接:这个是最容易想到的,每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连。这样就减少了很多参数。

    • 权值共享:一组连接可以共享同一个权重,而不是每个连接有一个不同的权重,这样又减少了很多参数。

    • 下采样:可以使用Pooling来减少每层的样本数,进一步减少参数数量,同时还可以提升模型的鲁棒性。

     

    对于图像识别任务来说,卷积神经网络通过尽可能保留重要的参数,去掉大量不重要的参数,来达到更好的学习效果。

     

    接下来,我们将详述卷积神经网络到底是何方神圣。

     

      卷积神经网络是啥  

     

    首先,我们先获取一个感性认识,下图是一个卷积神经网络的示意图:

     


     

    网络架构

     

    如图1所示,一个卷积神经网络由若干卷积层、Pooling层、全连接层组成。你可以构建各种不同的卷积神经网络,它的常用架构模式为:

     

    INPUT -> [[CONV]*N -> POOL?]*M -> [FC]*K

     

    也就是N个卷积层叠加,然后(可选)叠加一个Pooling层,重复这个结构M次,最后叠加K个全连接层。

     

    对于图1展示的卷积神经网络:

    INPUT -> CONV -> POOL -> CONV -> POOL -> FC -> FC

     

    按照上述模式可以表示为:

    INPUT -> [[CONV]*1 -> POOL]*2 -> [FC]*2

     

    也就是:N=1, M=2, K=2。

     

    三维的层结构

     

    从图1我们可以发现卷积神经网络的层结构和全连接神经网络的层结构有很大不同。全连接神经网络每层的神经元是按照一维排列的,也就是排成一条线的样子;而卷积神经网络每层的神经元是按照三维排列的,也就是排成一个长方体的样子,有宽度、高度和深度。

     

    对于图1展示的神经网络,我们看到输入层的宽度和高度对应于输入图像的宽度和高度,而它的深度为1。接着,第一个卷积层对这幅图像进行了卷积操作(后面我们会讲如何计算卷积),得到了三个Feature Map。这里的"3"可能是让很多初学者迷惑的地方,实际上,就是这个卷积层包含三个Filter,也就是三套参数,每个Filter都可以把原始输入图像卷积得到一个Feature Map,三个Filter就可以得到三个Feature Map。至于一个卷积层可以有多少个Filter,那是可以自由设定的。也就是说,卷积层的Filter个数也是一个超参数我们可以把Feature Map可以看做是通过卷积变换提取到的图像特征,三个Filter就对原始图像提取出三组不同的特征,也就是得到了三个Feature Map,也称做三个通道(channel)。

     

    继续观察图1,在第一个卷积层之后,Pooling层对三个Feature Map做了下采样(后面我们会讲如何计算下采样),得到了三个更小的Feature Map。接着,是第二个卷积层,它有5个Filter。每个Fitler都把前面下采样之后的3个Feature Map卷积在一起,得到一个新的Feature Map。这样,5个Filter就得到了5个Feature Map。接着,是第二个Pooling,继续对5个Feature Map进行下采样,得到了5个更小的Feature Map。

     

    图1所示网络的最后两层是全连接层。第一个全连接层的每个神经元,和上一层5个Feature Map中的每个神经元相连,第二个全连接层(也就是输出层)的每个神经元,则和第一个全连接层的每个神经元相连,这样得到了整个网络的输出。

     

    至此,我们对卷积神经网络有了最基本的感性认识。接下来,我们将介绍卷积神经网络中各种层的计算和训练。

     

      卷积神经网络输出值的计算  

     

    卷积层输出值的计算

     

    我们用一个简单的例子来讲述如何计算卷积,然后,我们抽象出卷积层的一些重要概念和计算方法。

     

    假设有一个5*5的图像,使用一个3*3的filter进行卷积,想得到一个3*3的Feature Map,如下所示:

     

     

    为了清楚的描述卷积计算过程,我们首先对图像的每个像素进行编号,用Xi,j表示图像的第行第列元素;对filter的每个权重进行编号,用Wm,n表示第m行第n列权重,用Wb表示filter的偏置项;对Feature Map的每个元素进行编号,用ai,j表示Feature Map的第i行第j列元素;用f表示激活函数(这个例子选择relu函数作为激活函数)。然后,使用下列公式计算卷积:

     

     

    例如,对于Feature Map左上角元素来说,其卷积计算方法为:

     

     

    计算结果如下图所示:

     

     

    接下来,Feature Map的元素的卷积计算方法为:

     

     

    计算结果如下图所示:

     

     

    可以依次计算出Feature Map中所有元素的值。下面的动画显示了整个Feature Map的计算过程:

     

    上面的计算过程中,步幅(stride)为1。步幅可以设为大于1的数。例如,当步幅为2时,Feature Map计算如下:

     

     

     

    我们注意到,当步幅设置为2的时候,Feature Map就变成2*2了。这说明图像大小、步幅和卷积后的Feature Map大小是有关系的。事实上,它们满足下面的关系:

     

     

    在上面两个公式中,W2是卷积后Feature Map的宽度;W1是卷积前图像的宽度;F是filter的宽度;P是Zero Padding数量,Zero Padding是指在原始图像周围补几圈0,如果P的值是1,那么就补1圈0;S是步幅;H2是卷积后Feature Map的高度;H1是卷积前图像的宽度。式2和式3本质上是一样的。

     

    以前面的例子来说,图像宽度W1=5,filter宽度F=3,Zero PaddingP=0,步幅S=2,则

     

     

    说明Feature Map宽度是2。同样,我们也可以计算出Feature Map高度也是2。

     

    前面我们已经讲了深度为1的卷积层的计算方法,如果深度大于1怎么计算呢?其实也是类似的。如果卷积前的图像深度为D,那么相应的filter的深度也必须为D。我们扩展一下式1,得到了深度大于1的卷积计算公式:

     

     

    在式4中,D是深度;F是filter的大小(宽度或高度,两者相同);Wd,m,n表示filter的第层第m行第n列权重;ad,I,j表示图像的第d层第i行第j列像素;其它的符号含义和式1是相同的,不再赘述。

     

    我们前面还曾提到,每个卷积层可以有多个filter。每个filter和原始图像进行卷积后,都可以得到一个Feature Map。因此,卷积后Feature Map的深度(个数)和卷积层的filter个数是相同的。

     

    下面的动画显示了包含两个filter的卷积层的计算。我们可以看到7*7*3输入,经过两个3*3*3filter的卷积(步幅为2),得到了3*3*2的输出。另外我们也会看到下图的Zero padding是1,也就是在输入元素的周围补了一圈0。Zero padding对于图像边缘部分的特征提取是很有帮助的。

     

     

    以上就是卷积层的计算方法。这里面体现了局部连接和权值共享:每层神经元只和上一层部分神经元相连(卷积计算规则),且filter的权值对于上一层所有神经元都是一样的。对于包含两个3*3*3的fitler的卷积层来说,其参数数量仅有(3*3*3+1)*2=56个,且参数数量与上一层神经元个数无关。与全连接神经网络相比,其参数数量大大减少了。

     

    用卷积公式来表达卷积层计算

     

    不想了解太多数学细节的读者可以跳过这一节,不影响对全文的理解。

     

    式4的表达很是繁冗,最好能简化一下。就像利用矩阵可以简化表达全连接神经网络的计算一样,我们利用卷积公式可以简化卷积神经网络的表达。

     

    下面我们介绍二维卷积公式。

     

    设矩阵A,B,其行、列数分别为ma、na、mb、nb,则二维卷积公式如下:

     

    且s,t满足条件:

     

    我们可以把上式写成

     

    如果我们按照式5来计算卷积,我们可以发现矩阵A实际上是filter,而矩阵B是待卷积的输入,位置关系也有所不同:

     

     

    从上图可以看到,A左上角的值a0,0与B对应区块中右下角的值b1,1相乘,而不是与左上角的相乘。因此,数学中的卷积和卷积神经网络中的『卷积』还是有区别的,为了避免混淆,我们把卷积神经网络中的『卷积』操作叫做互相关(cross-correlation)操作。

     

    卷积和互相关操作是可以转化的。首先,我们把矩阵A翻转180度,然后再交换A和B的位置(即把B放在左边而把A放在右边。卷积满足交换率,这个操作不会导致结果变化),那么卷积就变成了互相关。

     

    如果我们不去考虑两者这么一点点的区别,我们可以把式5代入到式4:

     

     

    其中,A是卷积层输出的feature map。同式4相比,式6就简单多了。然而,这种简洁写法只适合步长为1的情况。

     

    Pooling层输出值的计算

     

    Pooling层主要的作用是下采样,通过去掉Feature Map中不重要的样本,进一步减少参数数量。Pooling的方法很多,最常用的是Max Pooling。Max Pooling实际上就是在n*n的样本中取最大值,作为采样后的样本值。下图是2*2 max pooling:

     

     

    除了Max Pooing之外,常用的还有Mean Pooling——取各样本的平均值。

     

    对于深度为D的Feature Map,各层独立做Pooling,因此Pooling后的深度仍然为D。

     

    全连接层

     

    原作者在这里对于全连接层并没有进行介绍,只是说参考全连接网络当中的layer。我个人理解全连接层和卷积层比较相似,但全连接层的输出是一个n*1大小的向量,并通过几个全连接层对向量进行降维操作,与class进行对应

    PART 2

    从神经网络到卷积神经网络(CNN)
    我们知道神经网络的结构是这样的:

    那卷积神经网络跟它是什么关系呢?
    其实卷积神经网络依旧是层级网络,只是层的功能和形式做了变化,可以说是传统神经网络的一个改进。比如下图中就多了许多传统神经网络没有的层次。

     


    卷积神经网络的层级结构
          • 数据输入层/ Input layer
      • 卷积计算层/ CONV layer
      • ReLU激励层 / ReLU layer
      • 池化层 / Pooling layer
      • 全连接层 / FC layer

     

    1.数据输入层
    该层要做的处理主要是对原始图像数据进行预处理,其中包括:
      • 去均值:把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上。
      • 归一化:幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。
      • PCA/白化:用PCA降维;白化是对数据各个特征轴上的幅度归一化

     

    去均值与归一化效果图:

     

    去相关与白化效果图:

     

     

    2.卷积计算层
    这一层就是卷积神经网络最重要的一个层次,也是“卷积神经网络”的名字来源。
    在这个卷积层,有两个关键操作:
      • 局部关联。每个神经元看做一个滤波器(filter)
      • 窗口(receptive field)滑动, filter对局部数据计算

     

    先介绍卷积层遇到的几个名词:
      • 深度/depth(解释见下图)
      • 步长/stride (窗口一次滑动的长度)
      • 填充值/zero-padding

     

    填充值是什么呢?以下图为例子,比如有这么一个5*5的图片(一个格子一个像素),我们滑动窗口取2*2,步长取2,那么我们发现还剩下1个像素没法滑完,那怎么办呢?



    那我们在原先的矩阵加了一层填充值,使得变成6*6的矩阵,那么窗口就可以刚好把所有像素遍历完。这就是填充值的作用。



    卷积的计算(注意,下面蓝色矩阵周围有一圈灰色的框,那些就是上面所说到的填充值)


    这里的蓝色矩阵就是输入的图像,粉色矩阵就是卷积层的神经元,这里表示了有两个神经元(w0,w1)。绿色矩阵就是经过卷积运算后的输出矩阵,这里的步长设置为2。

     

    蓝色的矩阵(输入图像)对粉色的矩阵(filter)进行矩阵内积计算并将三个内积运算的结果与偏置值b相加(比如上面图的计算:2+(-2+1-2)+(1-2-2) + 1= 2 - 3 - 3 + 1 = -3),计算后的值就是绿框矩阵的一个元素。

     

    下面的动态图形象地展示了卷积层的计算过程:

     


    参数共享机制
      • 在卷积层中每个神经元连接数据窗的权重是固定的,每个神经元只关注一个特性。神经元就是图像处理中的滤波器,比如边缘检测专用的Sobel滤波器,即卷积层的每个滤波器都会有自己所关注一个图像特征,比如垂直边缘,水平边缘,颜色,纹理等等,这些所有神经元加起来就好比就是整张图像的特征提取器集合。
      • 需要估算的权重个数减少: AlexNet 1亿 => 3.5w
      • 一组固定的权重和不同窗口内数据做内积: 卷积

     


    3.激励层
    把卷积层输出结果做非线性映射。

    CNN采用的激励函数一般为ReLU(The Rectified Linear Unit/修正线性单元),它的特点是收敛快,求梯度简单,但较脆弱,图像如下。

     

    激励层的实践经验:
      ①不要用sigmoid!不要用sigmoid!不要用sigmoid!
      ② 首先试RELU,因为快,但要小心点
      ③ 如果2失效,请用Leaky ReLU或者Maxout
      ④ 某些情况下tanh倒是有不错的结果,但是很少


    4.池化层
    池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。
    简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。

     

    这里再展开叙述池化层的具体作用。

    1. 特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。

    2. 特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。

    3. 在一定程度上防止过拟合,更方便优化。


    池化层用的方法有Max pooling 和 average pooling,而实际用的较多的是Max pooling。

    这里就说一下Max pooling,其实思想非常简单。

    对于每个2*2的窗口选出最大的数作为输出矩阵的相应元素的值,比如输入矩阵第一个2*2窗口中最大的数是6,那么输出矩阵的第一个元素就是6,如此类推。


    5.全连接层
    两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的:


    一般CNN结构依次为
      1. INPUT
      2. [[CONV -> RELU]*N -> POOL?]*M 
      3. [FC -> RELU]*K
      4. FC


    卷积神经网络之训练算法
      1. 同一般机器学习算法,先定义Loss function,衡量和实际结果之间差距。
      2. 找到最小化损失函数的W和b, CNN中用的算法是SGD(随机梯度下降)。


    卷积神经网络之优缺点
    优点
      • 共享卷积核,对高维数据处理无压力
      • 无需手动选取特征,训练好权重,即得特征分类效果好
    缺点
      • 需要调参,需要大样本量,训练最好要GPU
      • 物理含义不明确(也就说,我们并不知道没个卷积层到底提取到的是什么特征,而且神经网络本身就是一种难以解释的“黑箱模型”)


    卷积神经网络之典型CNN
      • LeNet,这是最早用于数字识别的CNN
      • AlexNet, 2012 ILSVRC比赛远超第2名的CNN,比
      • LeNet更深,用多层小卷积层叠加替换单大卷积层。
      • ZF Net, 2013 ILSVRC比赛冠军
      • GoogLeNet, 2014 ILSVRC比赛冠军
      • VGGNet, 2014 ILSVRC比赛中的模型,图像识别略差于GoogLeNet,但是在很多图像转化学习问题(比如object detection)上效果奇好


    卷积神经网络之 fine-tuning
    何谓fine-tuning?
    fine-tuning就是使用已用于其他目标、预训练好模型的权重或者部分权重,作为初始值开始训练。

    那为什么我们不用随机选取选几个数作为权重初始值?原因很简单,第一,自己从头训练卷积神经网络容易出现问题;第二,fine-tuning能很快收敛到一个较理想的状态,省时又省心。

    那fine-tuning的具体做法是?
      • 复用相同层的权重,新定义层取随机权重初始值
      • 调大新定义层的的学习率,调小复用层学习率


    卷积神经网络的常用框架

    Caffe
      • 源于Berkeley的主流CV工具包,支持C++,python,matlab
      • Model Zoo中有大量预训练好的模型供使用
    Torch
      • Facebook用的卷积神经网络工具包
      • 通过时域卷积的本地接口,使用非常直观
      • 定义新网络层简单
    TensorFlow
      • Google的深度学习框架
      • TensorBoard可视化很方便
      • 数据和模型并行化好,速度快

     

    总结
    卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。

    CNN一个非常重要的特点就是头重脚轻(越往输入权值越小,越往输出权值越多),呈现出一个倒三角的形态,这就很好地避免了BP神经网络中反向传播的时候梯度损失得太快。

    卷积神经网络CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。

     


    以下是我自己在学习CNN的时候遇到的一些困惑,以及查阅一些资料后得到的一些答案。

    第一个问题:为什么不用BP神经网络去做呢?
    1.全连接,权值太多,需要很多样本去训练,计算困难
      • 应对之道:减少权值的尝试,局部连接,权值共享

      卷积神经网络有两种神器可以降低参数数目。
      第一种神器叫做局部感知野,一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。
      第二级神器,即权值共享。

     


    2.边缘过渡不平滑
      • 应对之道:采样窗口彼此重叠

     


    第二个问题:LeNet里的隐层的神经元个数怎么确定呢?
    它和原图像,也就是输入的大小(神经元个数)、滤波器的大小和滤波器在图像中的滑动步长都有关!

    LeNet-5共有7层,不包含输入,每层都包含可训练参数(连接权重)。输入图像为32*32大小。

    例如,我的图像是1000x1000像素,而滤波器大小是10x10,假设滤波器没有重叠,也就是步长为10,这样隐层的神经元个数就是(1000x1000 )/ (10x10)=100x100个神经元了。

    那重叠了怎么算?比如上面图的C2中28*28是如何得来的?这里的步长就是1,窗口大小是5*5,所以窗口滑动肯定发生了重叠。下图解释了28的由来。

     

     

    第三个问题:S2层是一个下采样层是干嘛用的?为什么是下采样?
    也就是上面所说的池化层,只是叫法不同而已。这层利用图像局部相关性的原理,对图像进行子抽样,可以减少数据处理量同时保留有用信息,相当于图像压缩。

    PART3

      (一)卷积神经网络CNN原理详解(一)——基本原理

    二)卷积神经网络的前向传播

    PART4

    机器视角:长文揭秘图像处理和卷积神经网络架构

    目录

    1.机器如何看图?

    2.如何帮助神经网络识别图像?

    3.定义卷积神经网络


    • 卷积层

    • 池化层

    • 输出层


    4.小结

    5.使用 CNN 分类图像


    1. 机器如何看图?


    人类大脑是一非常强大的机器,每秒内能看(捕捉)多张图,并在意识不到的情况下就完成了对这些图的处理。但机器并非如此。机器处理图像的第一步是理解,理解如何表达一张图像,进而读取图片。


    简单来说,每个图像都是一系列特定排序的图点(像素)。如果你改变像素的顺序或颜色,图像也随之改变。举个例子,存储并读取一张上面写着数字 4 的图像。


    基本上,机器会把图像打碎成像素矩阵,存储每个表示位置像素的颜色码。在下图的表示中,数值 1 是白色,256 是最深的绿色(为了简化,我们示例限制到了一种颜色)。




    一旦你以这种格式存储完图像信息,下一步就是让神经网络理解这种排序与模式。


    2. 如何帮助神经网络识别图像?


    表征像素的数值是以特定的方式排序的。




    假设我们尝试使用全连接网络识别图像,该如何做?


    全连接网络可以通过平化它,把图像当作一个数组,并把像素值当作预测图像中数值的特征。明确地说,让网络理解理解下面图中发生了什么,非常的艰难。




    即使人类也很难理解上图中表达的含义是数字 4。我们完全丢失了像素的空间排列。


    我们能做什么呢?可以尝试从原图像中提取特征,从而保留空间排列。

     

    案例 1


    这里我们使用一个权重乘以初始像素值。




    现在裸眼识别出这是「4」就变得更简单了。但把它交给全连接网络之前,还需要平整化(flatten) 它,要让我们能够保留图像的空间排列。




    案例 2


    现在我们可以看到,把图像平整化完全破坏了它的排列。我们需要想出一种方式在没有平整化的情况下把图片馈送给网络,并且还要保留空间排列特征,也就是需要馈送像素值的 2D/3D 排列。


    我们可以尝试一次采用图像的两个像素值,而非一个。这能给网络很好的洞见,观察邻近像素的特征。既然一次采用两个像素,那也就需要一次采用两个权重值了。




    希望你能注意到图像从之前的 4 列数值变成了 3 列。因为我们现在一次移用两个像素(在每次移动中像素被共享),图像变的更小了。虽然图像变小了,我们仍能在很大程度上理解这是「4」。而且,要意识到的一个重点是,我们采用的是两个连贯的水平像素,因此只会考虑水平的排列。


    这是我们从图像中提取特征的一种方式。我们可以看到左边和中间部分,但右边部分看起来不那么清楚。主要是因为两个问题:


    1. 图片角落左边和右边是权重相乘一次得到的。

    2. 左边仍旧保留,因为权重值高;右边因为略低的权重,有些丢失。


    现在我们有两个问题,需要两个解决方案。


    案例 3


    遇到的问题是图像左右两角只被权重通过一次。我们需要做的是让网络像考虑其他像素一样考虑角落。我们有一个简单的方法解决这一问题:把零放在权重运动的两边。




    你可以看到通过添加零,来自角落的信息被再训练。图像也变得更大。这可被用于我们不想要缩小图像的情况下。


    案例 4


    这里我们试图解决的问题是右侧角落更小的权重值正在降低像素值,因此使其难以被我们识别。我们所能做的是采取多个权重值并将其结合起来。


    (1,0.3) 的权重值给了我们一个输出表格




    同时表格 (0.1,5) 的权重值也将给我们一个输出表格。




    两张图像的结合版本将会给我们一个清晰的图片。因此,我们所做的是简单地使用多个权重而不是一个,从而再训练图像的更多信息。最终结果将是上述两张图像的一个结合版本。


    案例 5


    我们到现在通过使用权重,试图把水平像素(horizontal pixel)结合起来。但是大多数情况下我们需要在水平和垂直方向上保持空间布局。我们采取 2D 矩阵权重,把像素在水平和垂直方向上结合起来。同样,记住已经有了水平和垂直方向的权重运动,输出会在水平和垂直方向上低一个像素。




    特别感谢 Jeremy Howard 启发我创作了这些图像。


    因此我们做了什么?


    上面我们所做的事是试图通过使用图像的空间的安排从图像中提取特征。为了理解图像,理解像素如何安排对于一个网络极其重要。上面我们所做的也恰恰是一个卷积网络所做的。我们可以采用输入图像,定义权重矩阵,并且输入被卷积以从图像中提取特殊特征而无需损失其有关空间安排的信息。


    这个方法的另一个重大好处是它可以减少图像的参数数量。正如所见,卷积图像相比于原始图像有更少的像素。


    3.定义一个卷积神经网络


    我们需要三个基本的元素来定义一个基本的卷积网络


    1. 卷积层

    2. 池化层(可选)

    3. 输出层


    卷积层


    在这一层中,实际所发生的就像我们在上述案例 5 中见到的一样。假设我们有一个 6*6 的图像。我们定义一个权值矩阵,用来从图像中提取一定的特征。




    我们把权值初始化成一个 3*3 的矩阵。这个权值现在应该与图像结合,所有的像素都被覆盖至少一次,从而来产生一个卷积化的输出。上述的 429,是通过计算权值矩阵和输入图像的 3*3 高亮部分以元素方式进行的乘积的值而得到的。




    现在 6*6 的图像转换成了 4*4 的图像。想象一下权值矩阵就像用来刷墙的刷子。首先在水平方向上用这个刷子进行刷墙,然后再向下移,对下一行进行水平粉刷。当权值矩阵沿着图像移动的时候,像素值再一次被使用。实际上,这样可以使参数在卷积神经网络中被共享。


    下面我们以一个真实图像为例。




    权值矩阵在图像里表现的像一个从原始图像矩阵中提取特定信息的过滤器。一个权值组合可能用来提取边缘(edge)信息,另一个可能是用来提取一个特定颜色,下一个就可能就是对不需要的噪点进行模糊化。


    先对权值进行学习,然后损失函数可以被最小化,类似于多层感知机(MLP)。因此需要通过对参数进行学习来从原始图像中提取信息,从而来帮助网络进行正确的预测。当我们有多个卷积层的时候,初始层往往提取较多的一般特征,随着网络结构变得更深,权值矩阵提取的特征越来越复杂,并且越来越适用于眼前的问题。


    步长(stride)和边界(padding)的概念


    像我们在上面看到的一样,过滤器或者说权值矩阵,在整个图像范围内一次移动一个像素。我们可以把它定义成一个超参数(hyperparameter),从而来表示我们想让权值矩阵在图像内如何移动。如果权值矩阵一次移动一个像素,我们称其步长为 1。下面我们看一下步长为 2 时的情况。



    你可以看见当我们增加步长值的时候,图像的规格持续变小。在输入图像四周填充 0 边界可以解决这个问题。我们也可以在高步长值的情况下在图像四周填加不只一层的 0 边界。




    我们可以看见在我们给图像填加一层 0 边界后,图像的原始形状是如何被保持的。由于输出图像和输入图像是大小相同的,所以这被称为 same padding。




    这就是 same padding(意味着我们仅考虑输入图像的有效像素)。中间的 4*4 像素是相同的。这里我们已经利用边界保留了更多信息,并且也已经保留了图像的原大小。


    多过滤与激活图


    需要记住的是权值的纵深维度(depth dimension)和输入图像的纵深维度是相同的。权值会延伸到输入图像的整个深度。因此,和一个单一权值矩阵进行卷积会产生一个单一纵深维度的卷积化输出。大多数情况下都不使用单一过滤器(权值矩阵),而是应用维度相同的多个过滤器。


    每一个过滤器的输出被堆叠在一起,形成卷积图像的纵深维度。假设我们有一个 32*32*3 的输入。我们使用 5*5*3,带有 valid padding 的 10 个过滤器。输出的维度将会是 28*28*10。


    如下图所示:




    激活图是卷积层的输出。


     池化层


    有时图像太大,我们需要减少训练参数的数量,它被要求在随后的卷积层之间周期性地引进池化层。池化的唯一目的是减少图像的空间大小。池化在每一个纵深维度上独自完成,因此图像的纵深保持不变。池化层的最常见形式是最大池化。




    在这里,我们把步幅定为 2,池化尺寸也为 2。最大化执行也应用在每个卷机输出的深度尺寸中。正如你所看到的,最大池化操作后,4*4 卷积的输出变成了 2*2。


    让我们看看最大池化在真实图片中的效果如何。




    正如你看到的,我们卷积了图像,并最大池化了它。最大池化图像仍然保留了汽车在街上的信息。如果你仔细观察的话,你会发现图像的尺寸已经减半。这可以很大程度上减少参数。


    同样,其他形式的池化也可以在系统中应用,如平均池化和 L2 规范池化。


    输出维度


    理解每个卷积层输入和输出的尺寸可能会有点难度。以下三点或许可以让你了解输出尺寸的问题。有三个超参数可以控制输出卷的大小。


    1. 过滤器数量-输出卷的深度与过滤器的数量成正比。请记住该如何堆叠每个过滤器的输出以形成激活映射。激活图的深度等于过滤器的数量。

    2. 步幅(Stride)-如果步幅是 1,那么我们处理图片的精细度就进入单像素级别了。更高的步幅意味着同时处理更多的像素,从而产生较小的输出量。

    3. 零填充(zero padding)-这有助于我们保留输入图像的尺寸。如果添加了单零填充,则单步幅过滤器的运动会保持在原图尺寸。


    我们可以应用一个简单的公式来计算输出尺寸。输出图像的空间尺寸可以计算为([W-F + 2P] / S)+1。在这里,W 是输入尺寸,F 是过滤器的尺寸,P 是填充数量,S 是步幅数字。假如我们有一张 32*32*3 的输入图像,我们使用 10 个尺寸为 3*3*3 的过滤器,单步幅和零填充。


    那么 W=32,F=3,P=0,S=1。输出深度等于应用的滤波器的数量,即 10,输出尺寸大小为 ([32-3+0]/1)+1 = 30。因此输出尺寸是 30*30*10。


    输出层


    在多层卷积和填充后,我们需要以类的形式输出。卷积和池化层只会提取特征,并减少原始图像带来的参数。然而,为了生成最终的输出,我们需要应用全连接层来生成一个等于我们需要的类的数量的输出。仅仅依靠卷积层是难以达到这个要求的。卷积层可以生成 3D 激活图,而我们只需要图像是否属于一个特定的类这样的内容。输出层具有类似分类交叉熵的损失函数,用于计算预测误差。一旦前向传播完成,反向传播就会开始更新权重与偏差,以减少误差和损失。


    4. 小结


    正如你所看到的,CNN 由不同的卷积层和池化层组成。让我们看看整个网络是什么样子:




    • 我们将输入图像传递到第一个卷积层中,卷积后以激活图形式输出。图片在卷积层中过滤后的特征会被输出,并传递下去。

    • 每个过滤器都会给出不同的特征,以帮助进行正确的类预测。因为我们需要保证图像大小的一致,所以我们使用同样的填充(零填充),否则填充会被使用,因为它可以帮助减少特征的数量。

    • 随后加入池化层进一步减少参数的数量。

    • 在预测最终提出前,数据会经过多个卷积和池化层的处理。卷积层会帮助提取特征,越深的卷积神经网络会提取越具体的特征,越浅的网络提取越浅显的特征。

    • 如前所述,CNN 中的输出层是全连接层,其中来自其他层的输入在这里被平化和发送,以便将输出转换为网络所需的参数。

    • 随后输出层会产生输出,这些信息会互相比较排除错误。损失函数是全连接输出层计算的均方根损失。随后我们会计算梯度错误。

    • 错误会进行反向传播,以不断改进过滤器(权重)和偏差值。

    • 一个训练周期由单次正向和反向传递完成。


    5. 在 KERAS 中使用 CNN 对图像进行分类


    让我们尝试一下,输入猫和狗的图片,让计算机识别它们。这是图像识别和分类的经典问题,机器在这里需要做的是看到图像,并理解猫与狗的不同外形特征。这些特征可以是外形轮廓,也可以是猫的胡须之类,卷积层会攫取这些特征。让我们把数据集拿来试验一下吧。


    以下这些图片均来自数据集。




    我们首先需要调整这些图像的大小,让它们形状相同。这是处理图像之前通常需要做的,因为在拍照时,让照下的图像都大小相同几乎不可能。


    为了简化理解,我们在这里只用一个卷积层和一个池化层。注意:在 CNN 的应用阶段,这种简单的情况是不会发生的。


    
     

    #import various packagesimport osimport numpy as npimport pandas as pdimport scipyimport sklearnimport kerasfrom keras.models import Sequentialimport cv2from skimage import io %matplotlib inline #Defining the File Path cat=os.listdir("/mnt/hdd/datasets/dogs_cats/train/cat") dog=os.listdir("/mnt/hdd/datasets/dogs_cats/train/dog") filepath="/mnt/hdd/datasets/dogs_cats/train/cat/"filepath2="/mnt/hdd/datasets/dogs_cats/train/dog/"#Loading the Images images=[] label = []for i in cat: image = scipy.misc.imread(filepath+i) images.append(image) label.append(0) #for cat imagesfor i in dog: image = scipy.misc.imread(filepath2+i) images.append(image) label.append(1) #for dog images #resizing all the imagesfor i in range(0,23000): images[i]=cv2.resize(images[i],(300,300)) #converting images to arrays images=np.array(images) label=np.array(label) # Defining the hyperparameters filters=10filtersize=(5,5) epochs =5batchsize=128input_shape=(300,300,3) #Converting the target variable to the required sizefrom keras.utils.np_utils import to_categorical label = to_categorical(label) #Defining the model model = Sequential() model.add(keras.layers.InputLayer(input_shape=input_shape)) model.add(keras.layers.convolutional.Conv2D(filters, filtersize, strides=(1, 1), padding='valid', data_format="channels_last", activation='relu')) model.add(keras.layers.MaxPooling2D(pool_size=(2, 2))) model.add(keras.layers.Flatten()) model.add(keras.layers.Dense(units=2, input_dim=50,activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(images, label, epochs=epochs, batch_size=batchsize,validation_split=0.3) model.summary()


    在这一模型中,我只使用了单一卷积和池化层,可训练参数是 219,801。很好奇如果我在这种情况使用了 MLP 会有多少参数。通过增加更多的卷积和池化层,你可以进一步降低参数的数量。我们添加的卷积层越多,被提取的特征就会更具体和复杂。


    在该模型中,我只使用了一个卷积层和池化层,可训练参数量为 219,801。如果想知道使用 MLP 在这种情况下会得到多少,你可以通过加入更多卷积和池化层来减少参数的数量。越多的卷积层意味着提取出来的特征更加具体,更加复杂。


    结语


    希望本文能够让你认识卷积神经网络,这篇文章没有深入 CNN 的复杂数学原理。如果希望增进了解,你可以尝试构建自己的卷积神经网络,借此来了解它运行和预测的原理。


    原文链接:https://www.analyticsvidhya.com/blog/2017/06/architecture-of-convolutional-neural-networks-simplified-demystified/

    展开全文
  • 卷积神经网络结构详解

    千次阅读 2017-10-10 11:21:01
    原文参考:Deep Learning(深度学习)学习笔记整理系列之...它的权值共享网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量。该优点在网络的输入是多维图像时表现的更为明显,使图像可以直

    原文链接:Deep Learning(深度学习)学习笔记整理系列之(七)

    9.5、Convolutional Neural Networks卷积神经网络

           卷积神经网络是人工神经网络的一种,已成为当前语音分析和图像识别领域的研究热点。它的权值共享网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量。该优点在网络的输入是多维图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。卷积网络是为识别二维形状而特殊设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。

           CNNs是受早期的延时神经网络(TDNN)的影响。延时神经网络通过在时间维度上共享权值降低学习复杂度,适用于语音和时间序列信号的处理。

           CNNs是第一个真正成功训练多层网络结构的学习算法。它利用空间关系减少需要学习的参数数目以提高一般前向BP算法的训练性能。CNNs作为一个深度学习架构提出是为了最小化数据的预处理要求。在CNN中,图像的一小部分(局部感受区域)作为层级结构的最低层的输入,信息再依次传输到不同的层,每层通过一个数字滤波器去获得观测数据的最显著的特征。这个方法能够获取对平移、缩放和旋转不变的观测数据的显著特征,因为图像的局部感受区域允许神经元或者处理单元可以访问到最基础的特征,例如定向边缘或者角点。

    1)卷积神经网络的历史

           1962年Hubel和Wiesel通过对猫视觉皮层细胞的研究,提出了感受野(receptive field)的概念,1984年日本学者Fukushima基于感受野概念提出的神经认知机(neocognitron)可以看作是卷积神经网络的第一个实现网络,也是感受野概念在人工神经网络领域的首次应用。神经认知机将一个视觉模式分解成许多子模式(特征),然后进入分层递阶式相连的特征平面进行处理,它试图将视觉系统模型化,使其能够在即使物体有位移或轻微变形的时候,也能完成识别。

           通常神经认知机包含两类神经元,即承担特征抽取的S-元和抗变形的C-元。S-元中涉及两个重要参数,即感受野与阈值参数,前者确定输入连接的数目,后者则控制对特征子模式的反应程度。许多学者一直致力于提高神经认知机的性能的研究:在传统的神经认知机中,每个S-元的感光区中由C-元带来的视觉模糊量呈正态分布。如果感光区的边缘所产生的模糊效果要比中央来得大,S-元将会接受这种非正态模糊所导致的更大的变形容忍性。我们希望得到的是,训练模式与变形刺激模式在感受野的边缘与其中心所产生的效果之间的差异变得越来越大。为了有效地形成这种非正态模糊,Fukushima提出了带双C-元层的改进型神经认知机。

           Van Ooyen和Niehuis为提高神经认知机的区别能力引入了一个新的参数。事实上,该参数作为一种抑制信号,抑制了神经元对重复激励特征的激励。多数神经网络在权值中记忆训练信息。根据Hebb学习规则,某种特征训练的次数越多,在以后的识别过程中就越容易被检测。也有学者将进化计算理论与神经认知机结合,通过减弱对重复性激励特征的训练学习,而使得网络注意那些不同的特征以助于提高区分能力。上述都是神经认知机的发展过程,而卷积神经网络可看作是神经认知机的推广形式,神经认知机是卷积神经网络的一种特例。

    2)卷积神经网络的网络结构

          卷积神经网络是一个多层的神经网络,每层由多个二维平面组成,而每个平面由多个独立神经元组成。

           图:卷积神经网络的概念示范:输入图像通过和三个可训练的滤波器和可加偏置进行卷积,滤波过程如图一,卷积后在C1层产生三个特征映射图,然后特征映射图中每组的四个像素再进行求和,加权值,加偏置,通过一个Sigmoid函数得到三个S2层的特征映射图。这些映射图再进过滤波得到C3层。这个层级结构再和S2一样产生S4。最终,这些像素值被光栅化,并连接成一个向量输入到传统的神经网络,得到输出。

           一般地,C层为特征提取层,每个神经元的输入与前一层的局部感受野相连,并提取该局部的特征,一旦该局部特征被提取后,它与其他特征间的位置关系也随之确定下来;S层是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射为一个平面,平面上所有神经元的权值相等。特征映射结构采用影响函数核小的sigmoid函数作为卷积网络的激活函数,使得特征映射具有位移不变性。

           此外,由于一个映射面上的神经元共享权值,因而减少了网络自由参数的个数,降低了网络参数选择的复杂度。卷积神经网络中的每一个特征提取层(C-层)都紧跟着一个用来求局部平均与二次提取的计算层(S-层),这种特有的两次特征提取结构使网络在识别时对输入样本有较高的畸变容忍能力。

    3)关于参数减少与权值共享

          上面聊到,好像CNN一个牛逼的地方就在于通过感受野和权值共享减少了神经网络需要训练的参数的个数。那究竟是啥的呢?

           下图左:如果我们有1000x1000像素的图像,有1百万个隐层神经元,那么他们全连接的话(每个隐层神经元都连接图像的每一个像素点),就有1000x1000x1000000=10^12个连接,也就是10^12个权值参数。然而图像的空间联系是局部的,就像人是通过一个局部的感受野去感受外界图像一样,每一个神经元都不需要对全局图像做感受,每个神经元只感受局部的图像区域,然后在更高层,将这些感受不同局部的神经元综合起来就可以得到全局的信息了。这样,我们就可以减少连接的数目,也就是减少神经网络需要训练的权值参数的个数了。如下图右:假如局部感受野是10x10,隐层每个感受野只需要和这10x10的局部图像相连接,所以1百万个隐层神经元就只有一亿个连接,即10^8个参数。比原来减少了四个0(数量级),这样训练起来就没那么费力了,但还是感觉很多的啊,那还有啥办法没?

     

           我们知道,隐含层的每一个神经元都连接10x10个图像区域,也就是说每一个神经元存在10x10=100个连接权值参数。那如果我们每个神经元这100个参数是相同的呢?也就是说每个神经元用的是同一个卷积核去卷积图像。这样我们就只有多少个参数??只有100个参数啊!!!亲!不管你隐层的神经元个数有多少,两层间的连接我只有100个参数啊!亲!这就是权值共享啊!亲!这就是卷积神经网络的主打卖点啊!亲!(有点烦了,呵呵)也许你会问,这样做靠谱吗?为什么可行呢?这个……共同学习。

           好了,你就会想,这样提取特征也忒不靠谱吧,这样你只提取了一种特征啊?对了,真聪明,我们需要提取多种特征对不?假如一种滤波器,也就是一种卷积核就是提出图像的一种特征,例如某个方向的边缘。那么我们需要提取不同的特征,怎么办,加多几种滤波器不就行了吗?对了。所以假设我们加到100种滤波器,每种滤波器的参数不一样,表示它提出输入图像的不同特征,例如不同的边缘。这样每种滤波器去卷积图像就得到对图像的不同特征的放映,我们称之为Feature Map。所以100种卷积核就有100个Feature Map。这100个Feature Map就组成了一层神经元。到这个时候明了了吧。我们这一层有多少个参数了?100种卷积核x每种卷积核共享100个参数=100x100=10K,也就是1万个参数。才1万个参数啊!亲!(又来了,受不了了!)见下图右:不同的颜色表达不同的滤波器。

     

           嘿哟,遗漏一个问题了。刚才说隐层的参数个数和隐层的神经元个数无关,只和滤波器的大小和滤波器种类的多少有关。那么隐层的神经元个数怎么确定呢?它和原图像,也就是输入的大小(神经元个数)、滤波器的大小和滤波器在图像中的滑动步长都有关!例如,我的图像是1000x1000像素,而滤波器大小是10x10,假设滤波器没有重叠,也就是步长为10,这样隐层的神经元个数就是(1000x1000 )/ (10x10)=100x100个神经元了,假设步长是8,也就是卷积核会重叠两个像素,那么……我就不算了,思想懂了就好。注意了,这只是一种滤波器,也就是一个Feature Map的神经元个数哦,如果100个Feature Map就是100倍了。由此可见,图像越大,神经元个数和需要训练的权值参数个数的贫富差距就越大。

     

          需要注意的一点是,上面的讨论都没有考虑每个神经元的偏置部分。所以权值个数需要加1 。这个也是同一种滤波器共享的。

          总之,卷积网络的核心思想是将:局部感受野、权值共享(或者权值复制)以及时间或空间亚采样这三种结构思想结合起来获得了某种程度的位移、尺度、形变不变性。

    4)一个典型的例子说明

           一种典型的用来识别数字的卷积网络是LeNet-5(效果和paper等见这)。当年美国大多数银行就是用它来识别支票上面的手写数字的。能够达到这种商用的地步,它的准确性可想而知。毕竟目前学术界和工业界的结合是最受争议的。

          那下面咱们也用这个例子来说明下。

            LeNet-5共有7层,不包含输入,每层都包含可训练参数(连接权重)。输入图像为32*32大小。这要比Mnist数据库(一个公认的手写数据库)中最大的字母还大。这样做的原因是希望潜在的明显特征如笔画断电或角点能够出现在最高层特征监测子感受野的中心。

            我们先要明确一点:每个层有多个Feature Map,每个Feature Map通过一种卷积滤波器提取输入的一种特征,然后每个Feature Map有多个神经元。

            C1层是一个卷积层(为什么是卷积?卷积运算一个重要的特点就是,通过卷积运算,可以使原信号特征增强,并且降低噪音),由6个特征图Feature Map构成。特征图中每个神经元与输入中5*5的邻域相连。特征图的大小为28*28,这样能防止输入的连接掉到边界之外(是为了BP反馈时的计算,不致梯度损失,个人见解)。C1有156个可训练参数(每个滤波器5*5=25个unit参数和一个bias参数,一共6个滤波器,共(5*5+1)*6=156个参数),共156*(28*28)=122,304个连接。

           S2层是一个下采样层(为什么是下采样?利用图像局部相关性的原理,对图像进行子抽样,可以减少数据处理量同时保留有用信息),有6个14*14的特征图。特征图中的每个单元与C1中相对应特征图的2*2邻域相连接。S2层每个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid函数计算。可训练系数和偏置控制着sigmoid函数的非线性程度。如果系数比较小,那么运算近似于线性运算,亚采样相当于模糊图像。如果系数比较大,根据偏置的大小亚采样可以被看成是有噪声的“或”运算或者有噪声的“与”运算。每个单元的2*2感受野并不重叠,因此S2中每个特征图的大小是C1中特征图大小的1/4(行和列各1/2)。S2层有12个可训练参数和5880个连接。

    图:卷积和子采样过程:卷积过程包括:用一个可训练的滤波器fx去卷积一个输入的图像(第一阶段是输入的图像,后面的阶段就是卷积特征map了),然后加一个偏置bx,得到卷积层Cx。子采样过程包括:每邻域四个像素求和变为一个像素,然后通过标量Wx+1加权,再增加偏置bx+1,然后通过一个sigmoid激活函数,产生一个大概缩小四倍的特征映射图Sx+1

           所以从一个平面到下一个平面的映射可以看作是作卷积运算,S-层可看作是模糊滤波器,起到二次特征提取的作用。隐层与隐层之间空间分辨率递减,而每层所含的平面数递增,这样可用于检测更多的特征信息。

           C3层也是一个卷积层,它同样通过5x5的卷积核去卷积层S2,然后得到的特征map就只有10x10个神经元,但是它有16种不同的卷积核,所以就存在16个特征map了。这里需要注意的一点是:C3中的每个特征map是连接到S2中的所有6个或者几个特征map的,表示本层的特征map是上一层提取到的特征map的不同组合(这个做法也并不是唯一的)。(看到没有,这里是组合,就像之前聊到的人的视觉系统一样,底层的结构构成上层更抽象的结构,例如边缘构成形状或者目标的部分)。

           刚才说C3中每个特征图由S2中所有6个或者几个特征map组合而成。为什么不把S2中的每个特征图连接到每个C3的特征图呢?原因有2点。第一,不完全的连接机制将连接的数量保持在合理的范围内。第二,也是最重要的,其破坏了网络的对称性。由于不同的特征图有不同的输入,所以迫使他们抽取不同的特征(希望是互补的)。

          例如,存在的一个方式是:C3的前6个特征图以S2中3个相邻的特征图子集为输入。接下来6个特征图以S2中4个相邻特征图子集为输入。然后的3个以不相邻的4个特征图子集为输入。最后一个将S2中所有特征图为输入。这样C3层有1516个可训练参数和151600个连接。

           S4层是一个下采样层,由16个5*5大小的特征图构成。特征图中的每个单元与C3中相应特征图的2*2邻域相连接,跟C1和S2之间的连接一样。S4层有32个可训练参数(每个特征图1个因子和一个偏置)和2000个连接。

           C5层是一个卷积层,有120个特征图。每个单元与S4层的全部16个单元的5*5邻域相连。由于S4层特征图的大小也为5*5(同滤波器一样),故C5特征图的大小为1*1:这构成了S4和C5之间的全连接。之所以仍将C5标示为卷积层而非全相联层,是因为如果LeNet-5的输入变大,而其他的保持不变,那么此时特征图的维数就会比1*1大。C5层有48120个可训练连接。

            F6层有84个单元(之所以选这个数字的原因来自于输出层的设计),与C5层全相连。有10164个可训练参数。如同经典神经网络,F6层计算输入向量和权重向量之间的点积,再加上一个偏置。然后将其传递给sigmoid函数产生单元i的一个状态。

          最后,输出层由欧式径向基函数(Euclidean Radial Basis Function)单元组成,每类一个单元,每个有84个输入。换句话说,每个输出RBF单元计算输入向量和参数向量之间的欧式距离。输入离参数向量越远,RBF输出的越大。一个RBF输出可以被理解为衡量输入模式和与RBF相关联类的一个模型的匹配程度的惩罚项。用概率术语来说,RBF输出可以被理解为F6层配置空间的高斯分布的负log-likelihood。给定一个输入模式,损失函数应能使得F6的配置与RBF参数向量(即模式的期望分类)足够接近。这些单元的参数是人工选取并保持固定的(至少初始时候如此)。这些参数向量的成分被设为-1或1。虽然这些参数可以以-1和1等概率的方式任选,或者构成一个纠错码,但是被设计成一个相应字符类的7*12大小(即84)的格式化图片。这种表示对识别单独的数字不是很有用,但是对识别可打印ASCII集中的字符串很有用。

          使用这种分布编码而非更常用的“1 of N”编码用于产生输出的另一个原因是,当类别比较大的时候,非分布编码的效果比较差。原因是大多数时间非分布编码的输出必须为0。这使得用sigmoid单元很难实现。另一个原因是分类器不仅用于识别字母,也用于拒绝非字母。使用分布编码的RBF更适合该目标。因为与sigmoid不同,他们在输入空间的较好限制的区域内兴奋,而非典型模式更容易落到外边。

            RBF参数向量起着F6层目标向量的角色。需要指出这些向量的成分是+1或-1,这正好在F6 sigmoid的范围内,因此可以防止sigmoid函数饱和。实际上,+1和-1是sigmoid函数的最大弯曲的点处。这使得F6单元运行在最大非线性范围内。必须避免sigmoid函数的饱和,因为这将会导致损失函数较慢的收敛和病态问题。

    5)训练过程

            神经网络用于模式识别的主流是有指导学习网络,无指导学习网络更多的是用于聚类分析。对于有指导的模式识别,由于任一样本的类别是已知的,样本在空间的分布不再是依据其自然分布倾向来划分,而是要根据同类样本在空间的分布及不同类样本之间的分离程度找一种适当的空间划分方法,或者找到一个分类边界,使得不同类样本分别位于不同的区域内。这就需要一个长时间且复杂的学习过程,不断调整用以划分样本空间的分类边界的位置,使尽可能少的样本被划分到非同类区域中。

           卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。卷积网络执行的是有导师训练,所以其样本集是由形如:(输入向量,理想输出向量)的向量对构成的。所有这些向量对,都应该是来源于网络即将模拟的系统的实际“运行”结果。它们可以是从实际运行系统中采集来的。在开始训练前,所有的权都应该用一些不同的小随机数进行初始化。“小随机数”用来保证网络不会因权值过大而进入饱和状态,从而导致训练失败;“不同”用来保证网络可以正常地学习。实际上,如果用相同的数去初始化权矩阵,则网络无能力学习。

           训练算法与传统的BP算法差不多。主要包括4步,这4步被分为两个阶段:

    第一阶段,向前传播阶段:

    a)从样本集中取一个样本(X,Yp),将X输入网络;

    b)计算相应的实际输出Op

          在此阶段,信息从输入层经过逐级的变换,传送到输出层。这个过程也是网络在完成训练后正常运行时执行的过程。在此过程中,网络执行的是计算(实际上就是输入与每层的权值矩阵相点乘,得到最后的输出结果):

              Op=Fn(…(F2(F1(XpW(1))W(2))…)W(n)

    第二阶段,向后传播阶段

    a)算实际输出Op与相应的理想输出Yp的差;

    b)按极小化误差的方法反向传播调整权矩阵。

    6)卷积神经网络的优点

            卷积神经网络CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。

            流的分类方式几乎都是基于统计特征的,这就意味着在进行分辨前必须提取某些特征。然而,显式的特征提取并不容易,在一些应用问题中也并非总是可靠的。卷积神经网络,它避免了显式的特征取样,隐式地从训练数据中进行学习。这使得卷积神经网络明显有别于其他基于神经网络的分类器,通过结构重组和减少权值将特征提取功能融合进多层感知器。它可以直接处理灰度图片,能够直接用于处理基于图像的分类。

           卷积网络较一般神经网络在图像处理方面有如下优点: a)输入图像和网络的拓扑结构能很好的吻合;b)特征提取和模式分类同时进行,并同时在训练中产生;c)权重共享可以减少网络的训练参数,使神经网络结构变得更简单,适应性更强。

    7)小结

           CNNs中这种层间联系和空域信息的紧密关系,使其适于图像处理和理解。而且,其在自动提取图像的显著特征方面还表现出了比较优的性能。在一些例子当中,Gabor滤波器已经被使用在一个初始化预处理的步骤中,以达到模拟人类视觉系统对视觉刺激的响应。在目前大部分的工作中,研究者将CNNs应用到了多种机器学习问题中,包括人脸识别,文档分析和语言检测等。为了达到寻找视频中帧与帧之间的相干性的目的,目前CNNs通过一个时间相干性去训练,但这个不是CNNs特有的。

    展开全文
  • 详解随机神经网络结构搜索 (SNAS)

    千次阅读 2019-04-17 23:14:29
    神经网络结构搜索(Neural Architecture Search, NAS)是自动机器学习(AutoML)中的热点问题之一。通过设计经济高效的搜索方法,自动获得泛化能力强、硬件友好的神经网络结构,可以大量节省人工,解放研究员的创造...
  • 从0到1理解神经网络结构(上) 一、 前言 下图为经典的神经网络,主要有三层,第一层为输入层,第二层为隐藏层,第三层为输出层。 图1 神经网络结构图 需要着重记住几点: 在设计神经网络时,输入层与输出层节点是...
  • 深度学习在2010年燃起来以后,较大的革新集中...在文本处理领域,出现了RNN,GRU,LSTM等不同的循环神经网络结构。再加上在不同的网络结构中的调参(层数,每层的单元数,卷积核的大小,卷积核的stride的大小等等...
  • 深度神经网络结构以及Pre-Training的理解 Logistic回归、传统多层神经网络 1.1 线性回归、线性神经网络、Logistic/Softmax回归 线性回归是用于数据拟合的常规手段,其任务是优化目标函数:h(θ)=θ+...
  • 一种确定神经网络最优结构的新算法.pdf
  • 遗传算法应用--基于遗传算法的神经网络结构改进

    千次阅读 热门讨论 2019-01-19 23:25:38
    基于遗传算法的神经网络结构改进       &...
  • 1 神经网络结构 import numpy as np import torch from torch.autograd import Variable import matplotlib.pyplot as plt import torch.nn.functional as F from matplotlib.font_manager import ...
  • 神经网络结构盘点Neural Networks Zoo

    千次阅读 2017-06-20 15:01:12
    原文地址:图文并茂的神经网络架构大盘点:从基本原理到衍生关系 ...
  • 神经网络学习 之 BP神经网络

    万次阅读 多人点赞 2015-11-30 21:17:56
    上一次我们讲了M-P模型,它实际上就是对单个神经元的一种建模,...本文具体来介绍一下一种非常常见的神经网络模型——反向传播(Back Propagation)神经网络。概述BP(Back Propagation)神经网络是1986年由Rumelhart和Mc
  • 第二章 神经网络结构 案例:使用神经网络识别手写数字 我将介绍一个神经网络,它可以很好地对手写的数字进行分类。为了准备这一点,它有助于解释一些术语,让我们可以命名一个网络的不同部分。假设我们有网络...
  • 经典的卷积神经网络结构总结

    千次阅读 多人点赞 2019-07-23 08:58:10
    本文将介绍几种经典的卷积神经网络模型,包括 LeNet-5,AlexNet,ResNet,VGGNet 一、LeNet-5 (1)模型概述 模型结构 第一层:输入层,输入的是32*32的黑白分辨率图像 第二层:C1,卷积层,有六个特征图,卷积核...
  • 画出卷积神经网络结构图[转载]

    万次阅读 2017-02-02 14:10:08
    使用Keras框架(后端可选tensorflow或者theano),可以画出卷积神经网络结构图帮助我们理解或确认自己创立的模型。问题的关键在于使用from keras.utils.visualize_util import plot中的plot函数。 但是直接使用...
  • Logistic回归、传统多层神经网络1.1 线性回归、线性神经网络、Logistic/Softmax回归线性回归是用于数据拟合的常规手段,其任务是优化目标函数:h(θ)=θ+θ1x1+θ2x2+....θnxn" role...
  • 为了改善概率神经网络(PNN)在训练样本数量较大冗余度较高时存在的结构复杂的问题,提出一种基于主成分分析(PCA)的结构优化方法。以概率乘法公式为理论依据,根据训练样本的PCA结果对PNN进行结构优化,并引入学习算法...
  • 神经网络与深度学习习题解答 Neural Networks and Deep Learning(作者 Michael Nielsen)书中第二章Using neural nets to recognize handwritten digits的A simple network to classify handwritten digits一节,该...
  • 1.2 单个神经元的分类作用 以sigmoid函数作为神经元的激励函数为例,这个大家可能稍微熟悉一点,毕竟我们逻辑回归部分重点提到了这个非线性的函数,把输入值压缩成0-1之间的一个概率值。而通过这个非线性映射和设定...
  • 有教师的线性基本函数前向三层神经网络结构研究----BP网络中隐层结点个数的确定.pdf
  • 从LeNet-5看懂卷积神经网络结构

    千次阅读 2019-07-12 11:46:03
    LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体...卷积神经网络能够很好的利用图像的结构信息。LeNet-5是一个较简单的卷积神经网络。下图显示了其结构:输入的二维图...
  •  近年来,基于神经网络...作为NLP领域的基础任务—命名实体识别(Named Entity Recognition,NER)也不例外,神经网络结构在NER中也取得了不错的效果。最近,我也阅读学习了一系列使用神经网络结构进行NER的相关论...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 64,524
精华内容 25,809
关键字:

如何确定神经网络结构