zoukankan      html  css  js  c++  java
  • 普通MLP处理图像时遇到了什么样的问题,才导致后续各种模型的出现

    普通MLP处理图像时遇到了什么样的问题,才导致后续各种模型的出现

    出现的问题

    • 参数过多

      比如输入一张大小为1000x1000的图像, 第一层要使用1000个神经元,下一层的神经元使用10^6个
      那么,全连接参数就是1000 * 1000 * 10^6 = 10^12 一万亿个参数 这还仅仅是前两层。
      很明显,网络的参数过多, 参数过多 意味着 模型容易过拟合, 也就需要更多训练数据。 首先数据不容易获得,而且即使拿到海量数据去训练这个模型也会使模型的泛化能力差。

      同时还可以看到,因为参数过多,数据较少, 稍微调整参数就可以使模型达到一个很小的训练误差,=》 导致收敛到一个较差的局部极值,而不是最小值

    解决方法:

    • 针对参数过多的问题. 我们首先使用卷积层去解决。 因为图像数据具有很强的区域性, 相同区域的像素 共同代表或者表达一个意思。 不同区域的像素和图像整体关联不大

      基于图像数据的这种性质,我们使用卷积层替换原来的全连接层,简单说就是将全连接换成局部连接,从而减少参数量
      还是输入一张大小为1000x1000的图像, 第一层使用1000个神经元, 下一层的神经元数量还是10^6个但是,局部连接范围是10*10,那么,在局部范围内,连接参数就是10 * 10 * 10^6 = 10^8 一亿个参数, 减少了一万倍

      除了局部连接之外, 我们还可以通过参数共享的方式去减少参数。 因为图像像素所表征的含义跟像素所在的位置无关,比如猫在一张图片的左上角和猫在在图像的右下角都不能改变那些像素代表猫这个事实。 所以图像含义跟像素的位置无关。 既然无关,那么我们可以用一组相同的参数,去处理全部的像素。就像一个探照灯依次扫过图像的每一行。 当时用了参数共享后,原来的参数的数量变成了这样,
      还是一张大小为1000x1000的图像,第一层使用1000个神经元, 下一层的神经元有10^6个,局部连接范围是10*10, 那么, 在局部范围的全连接参数就是10 * 10 = 10^2 一百个参数

    卷积层

    卷积层的输入和输出都是矩阵, 全连接层的输入和输出都是向量

    卷积核的作用

    卷积核: 是用来提取某种特征的

    公式

    卷积核输出大小: (输入大小 - 卷积核的大小 + padding) / stride + 1

    使图像的尺寸越来越大

    参数数目= 输入的通道数 x (卷积核大小 x 卷积核大小)x 输出的通道数

    池化

    池化的作用

    1. 用于减小图像尺寸,从而减少计算量。
    2. 一定程度上解决平移造成的问题, 提高鲁棒性
      但是,这全是在损失了空间位置的精度的基础上

    全连接层

    全连接层就是将上一层输出展开,并连接到自己的每一个神经元上

    以图像数据为例, 二维多通道的输入数据,通过卷积层, 输出还是一个二维的数据。
    我们需要把这个输出展开成一个一维向量, 然后连到下一层的神经元上。

    注意

    全连接层之后可以再加全连接层 但是不能再加卷积层, 池化层了。 因为卷积层和池化层的输入需要是一个二维图像数据,而全连接层输出是一个以为向量。 首先在数据维度不匹配,
    而且,即使将全连接层后的结果进行reshape,打成二维数据的形式,但原来的图像的位置信息也丢失了, 不在具有物理意义。输入进去也没有实际意义。

    为什么使用DropOut

    DropOut干了啥

    DropOut放在模型的最后一层,通过设置一个比例参数,每次epoch,随机将固定比例的神经元的权重设置成0,也就意味部分神经元不在参与预测过程。

    DropOut作用

    可以有效防止过拟合,每次dropout都相当于训练了一个子网络,最后的模型的结果相当于很多子网络的组合。消除了神经单元之间的依赖,增强模型的泛化能力。 对于dropout后的结果,总能找到一个样本与其对应。 这也相当于做了数据增强。

    变种AlphaDropOut

    基本功能跟Dropout一样,随机使一定比例的神经元失活。但是AlphaDropOut可以保持输出值的均值和方差不变,普通的dropout可能会造成输出值的分布改变。

    同时还可以保持输出值的归一化的性质不变,适合跟selu激活函数或者批归一化一起使用

  • 相关阅读:
    解决centos7的root账户下无法通过code命令启动vscode
    centos7安装epel
    centos7用过yum安装vscode
    yum install gcc报错Error: Package: glibc-2.17-260.el7_6.6.i686 (updates) Requires: glibc-common = 2.17
    centos7通过yum从vim7升级到vim8
    解决VM虚拟机安装centos7无法联网
    centos7设置开机默认使用root账户登陆
    centos7使用sudo命令提示sudo command not found
    不同编译器下C++基本数据类型的字节长度
    C++函数模板
  • 原文地址:https://www.cnblogs.com/sight-tech/p/13150312.html
Copyright © 2011-2022 走看看