zoukankan      html  css  js  c++  java
  • CNN学习笔记

    传统的全连接网络在处理大尺寸图片数据时,由于每层网络与前层都是全连接,所以网络的参数会变得很庞大,这导致网络训练起来速度很慢,而且网络的参数太多会导致过拟合的问题。相比于全连接网络,卷积网络层有3个维度:宽度、高度和深度。卷积层的每一个神经元不是与上层的所有神经元连接,而是与上层网络的部分区域神经元连接。

    卷积网络的组成

    卷积神经网络主要有三种网络结构组成:卷积层、池化层和全连接层。一个简单的结构示例:

    •  输入层:输入图像的原始数据,比如32*32*3;
    • 卷积层:卷积层中每一个神经元的输出是用卷积核与上一层的局部小区域进行点积得到的;
    • RELU:对卷积后得到的每一个神经元的值使用RELU函数进行非线性化,这不会改变结果的体积;
    • 池化层:在宽度和高度方向上进行下采样,这会缩小结果的提及;
    • 全连接层:计算每一个类别的得分,此时输出的大小为1*1*10(假设有10个分类),全连接层中的每一个神经元与上层的所有神经元相连接;

    如果我们将卷积层、RELU层和池化层当作卷积层的话,那么卷积层对输入数据的处理可以看作是将输入数据映射到隐层的特征空间,而全连接层则是从隐层特征空间到类别空间的映射。需要注意的是,在卷积神经网络中,卷积层和全连接层是有参数的,而RELU和池化层是没有参数的。卷积层、池化层和全连接层是有超参数的,而RELU层是没有超参数的。

    卷积层

    布局连接

    卷积层的每一个神经元与上层的一些局部神经元相连接,卷积核的大小叫做卷积的感受野,感受野是一个超参数。卷积核与输入在深度方向上的连接总是等于输入数据的深度。比如输入有3个通道,那么这个卷积核在这三个通道上分别进行卷积,然后将它们的和作为卷积神经元的输出,有时还会再加上一个偏值。卷积核的连接是不具有对称性的,在同一个深度上,卷积核与输入的连接是局部的,但是在深度方向上,卷积核与每一个深度切片都是连接的。例如,假设输入的尺寸是32*32*3,卷积核的大小是5*5的,那么这个卷积层的权重值一共有5*5*3=75个(还要加上一个偏置),之所以要乘以3是因为输入的深度为3。

    空间排布

    三个超参数控制着输出的大小:卷积核的深度、卷积运算的步长以及零填充。

    1、  输出的深度是一个超参数,它由我们使用的卷积核的个数来决定。对于相同的输入,不同的卷积核从输入中学习到的东西不一样,对于相同位置的输入,深度方向上的不同卷积核可能由不同的输入特征被激活。我们将看向相同区域的一系列神经元叫做一个深度列。

    2、  在输入数据上滑动卷积核的步长会影响到输出的大小;

    3、  零填充是为了控制输出的大小而采用的一种方式,零填充是在输入的边界位置外填充0,由于填入的数据是0,这不会影响到输入的特征,同时又能够控制输出的大小(宽度和高度),使得输出的宽度和高度与输入是一致的;除了能够控制输出的大小之外,如果没有零填充,每进行一次卷积后原输入的边缘处的信息就会丢失一些,经过多次卷积之后,边缘处的信息可能就不存在了,因此零填充也的确可以提高网络的性能;

    4、  假设输入的宽度为W,卷积核的大小为F,零填充的列数为P,卷积核滑动的步长为S,卷积核的个数为N,那么输出在深度方向上的所有分片的宽度都是[(W-F+2P)/S]+1,输出的深度为卷积核的个数N。

    步长的限制

    从上面的公式我们可以看到,输出的宽度和输入的宽度、卷积核的大小、零填充的大小及步长有着密切的关系,由于输出的宽度不可能为小数,因此对步长、零填充的大小都有限制。可以通过调整这些超参数来使得输出是有效的,或者调整输入的尺寸;

           权值共享

           当处理较大输出的数据时,如果我们仍然采用全连接的方式,那么随着网络层数的增加,网络参数的个数将会增加的非常快。为了减少参数的个数,我们做出了这样的假设:如果使用一个卷积核在一个位置(x,y)处提取特征是有效的,那么在另一个位置使用同样的卷积核也能够将相同的特征提取出来。因此,我们在输入数据的一个深度上使用同一个卷积核在宽度方向和高度方向上滑动,一个卷积核使用一个偏置,即使是在输入的不同深度上。这个假设极大地减少了参数的个数。在反向传播的过程中,每一个神经元会计算它的权重的梯度,由于在深度方向上有多个权重值,因此会计算在不同深度上的梯度并且将它们的和相加作为总的梯度,深度方向上的每一个权重都要更新。

           有时候参数共享假设可能没有意义,特别是当卷积神经网络的输入图像是一些明确的中心结构时候。这时候我们就应该期望在图片的不同位置学习到完全不同的特征。一个具体的例子就是输入图像是人脸,人脸一般都处于图片中心。你可能期望不同的特征,比如眼睛特征或者头发特征可能(也应该)会在图片的不同位置被学习。在这个例子中,通常就放松参数共享的限制,将层称为局部连接层(Locally-Connected Layer)。

           1×1卷积核

           https://blog.csdn.net/haolexiao/article/details/77073258

    池化层

           通常在卷积层之后我们会插入一个池化层,池化层的作用是逐步减少输出的大小,减少参数的个数,减少计算量,因此也能够控制过拟合。池化在深度方向上的每一个切片上进行,一般使用最大池化操作。最常见的池化操作是:在2×2的区域内使用最大池化,滑动步长为2。这种池化实际上只保留了卷积结果中2×2区域中的一个值,丢弃了75%的值。

           池化层的反向传播:梯度只沿着最大值进行回传,因此在前向传播的过程中只需要跟踪最大值的索引。

    卷积网络的结构

           通常的卷积网络结构为:INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC;

     

    相比于使用更大感受野的卷积核,使用几个较小的卷积核然后将其堆叠起来是更好的做法。

    假设我们将3个3×3的卷积核堆叠起来(卷积层之间有非线性层),卷积的步长为1,那么其输出大小与直接在原输出上使用一个大小为7×7的卷积核相同。但是,使用较大的卷积核有如下的一些缺点:1、使用一个7×7的卷积核的输出是对输入的线性操作,而使用3个3×3的卷积核具有非线性能力,这使得它们的输出特征更加丰富;2、假设输入有c个通道,那么7×7的卷积核的参数个数为49c2,而3个3×3的卷积核的参数个数为27c2,参数个数更少。不过,使用小的卷积核堆叠也有一个缺点,那就是在反向传播的过程中需要较大的内存来存储中间层的结果。

     

  • 相关阅读:
    identityser4 samesit 问题
    mysql 8 root密码重置
    OutSystems学习笔记。
    获取两个List中的不同元素,4种方法,逐步优化,学习使用
    java 配置在.properties文件中的常量
    java POST 传值 加签 验证
    springboot jpa 多条件查询(多表)
    java代码行数统计工具类
    Map集合遍历的4种方法
    springboot jpa 多条件查询(单表)
  • 原文地址:https://www.cnblogs.com/puheng/p/9328493.html
Copyright © 2011-2022 走看看