zoukankan      html  css  js  c++  java
  • CNN 各layer汇总

    Flattening:类型为:Flatten

    基于某个axis进行偏平的意思,如 axis = 1 ,fattens an input of shape n * c * h * w to a simple vector output of shape n * (c*h*w))

    Reshape:(重新调整维度),类型为:Reshape

    在不改变数据的情况下,改变输入的维度

    layer {  
        name: "reshape"  
        type: "Reshape"  
        bottom: "input"  
        top: "output"  
        reshape_param {  
          shape {  
            dim: 0  # copy the dimension from below  
            dim: 2  
            dim: 3  
            dim: -1 # infer it from the other dimensions  
          }  
        }  
      }  

    有一个可选的参数组shape,用于指定blob数据的各维的值(bolb是一个四维的数据:n*c*w*h)。

    dim:0  表示维度不变,即输入和输出是相同的维度。

    dim:2 或 dim:3 将原来的维度变成2或3

    dim:-1 表示由系统自动计算维度。数据的总量不变,系统会根据blob数据的其它三维来自动计算当前维的维度值 。

    假设原数据为:64*3*28*28, 表示64张3通道的28*28的彩色图片

    经过reshape变换:

    复制代码
    reshape_param {  
          shape {  
            dim: 0   
            dim: 0  
            dim: 14  
            dim: -1   
          }  
        }  
    复制代码

    输出数据为:64*3*14*56,系统自己算的。blob里面的数据量不变,知道三个维度,另外一个就知道了

    Cocatenation(把多个输入可以串联起来):类型为:Concat

    在某个维度,将输入的layer组合起来,是slice的逆过程

    Slicing(可以对输入进行切片)类型为:Slice

    Slice layer 的作用是将bottom按照需要分解成多个tops。(与split layer的不一样在于spliit的作用是将bottom复制多份,输出到tops)
    首先我们先看一下slice layer 在prototxt里面的书写

    layer {
      name: "slice"
      type: "Slice"
      bottom: "input"
      top: "output1"
      top: "output2"
      top: "output3"
      top: "output4"
      slice_param {
        axis: 1
        slice_point: 1
        slice_point: 3
        slice_point: 4
      }
    }

    这里假设input的维度是N*5*H*W,tops输出的维度分别为N*1*H*W N*2*H*WN*1*H*WN*1*H*W 。
    这里需要注意的是,如果有slice_point,slice_point的个数一定要等于top的个数减一。 
    axis表示要进行分解的维度。 
    slice_point的作用是将axis按照slic_point 进行分解。 
    slice_point没有设置的时候则对axis进行均匀分解。

    Elementwise Operations(类型为Eltwise), Argmax(类型为ArgMax), Softmax(类型为Softmax),

    Mean-Variance Normalization(类型为MVN)

    Dropout(防止过拟合的trick):类型为Dropout

    可以随机让网络某些隐含层节点的权重不工作

    layer {  
      name: "drop7"  
      type: "Dropout"  
      bottom: "fc7-conv"  
      top: "fc7-conv"  
      dropout_param {  
        dropout_ratio: 0.5  
      }  
    }layer {  
      name: "drop7"  
      type: "Dropout"  
      bottom: "fc7-conv"  
      top: "fc7-conv"  
      dropout_param {  
        dropout_ratio: 0.5  
      }  
    }  

    只需要设置一个dropout_ratio就可以了。 

    Pooling

    1.  一般池化(General Pooling)

    池化作用于图像中不重合的区域(这与卷积操作不同),我们定义池化窗口的大小为sizeX,即下图中红色正方形的边长,定义两个相邻池化窗口的水平位移/竖直位移为stride。一般池化由于每一池化窗口都是不重复的,所以sizeX=stride,最常见的池化操作为平均池化mean pooling和最大池化max pooling:

    平均池化:计算图像区域的平均值作为该区域池化后的值。

    最大池化:选图像区域的最大值作为该区域池化后的值。参考图[2]。

    2,重叠池化(OverlappingPooling)

    重叠池化正如其名字所说的,相邻池化窗口之间会有重叠区域,此时sizeX>stride。

    论文中,作者使用了重叠池化,其他的设置都不变的情况下, top-1和top-5 的错误率分别减少了0.4% 和0.3%。[“Imagenet classification with deep convolutional neural networks,”in NIPS,2012]。

    3. 空金字塔池化(Spatial Pyramid Pooling) 

    空间金字塔池化可以把任何尺度的图像的卷积特征转化成相同维度,这不仅可以让CNN处理任意尺度的图像,还能避免cropping和warping操作,导致一些信息的丢失,具有非常重要的意义。

    一般的CNN都需要输入图像的大小是固定的,这是因为全连接层的输入需要固定输入维度,但在卷积操作是没有对图像尺度有限制,所有作者提出了空间金字塔池化,先让图像进行卷积操作,然后转化成维度相同的特征输入到全连接层,这个可以把CNN扩展到任意大小的图像。

    空间金字塔池化的思想来自于Spatial Pyramid Model,它一个pooling变成了多个scale的pooling。用不同大小池化窗口作用于卷积特征,我们可以得到1X1,2X2,4X4的池化结果,由于conv5中共有256个过滤器,所以得到1个256维的特征,4个256个特征,以及16个256维的特征,然后把这21个256维特征链接起来输入全连接层,通过这种方式把不同大小的图像转化成相同维度的特征,后面通常接FC。

    对于不同的图像要得到相同大小的pooling结果,就需要根据图像的大小动态的计算池化窗口的大小和步长。假设conv5输出的大小为a*a,需要得到n*n大小的池化结果,可以让窗口大小sizeX为,步长为 。具体示意图参考博客[2]

    SPP其实就是一种多个scale的pooling,可以获取图像中的多尺度信息;在CNN中加入SPP后,可以让CNN处理任意大小的输入,这让模型变得更加的flexible。

    参考Kaiming  He:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition,2014

    4,Global average Pooling

    global average pooling 这个概念出自于 network in network ,主要是用来解决全连接的问题,其主要是是将最后一层的特征图进行整张图的一个均值池化,形成一个特征点,将这些特征点组成最后的特征向量进行softmax中进行计算。举个例子:

    假如,最后的一层的数据是10个6*6的特征图,global average pooling是将每一张特征图计算所有像素点的均值,输出一个数据值,

    这样10 个特征图就会输出10个数据点,将这些数据点组成一个1*10的向量的话,就成为一个特征向量,就可以送入到softmax的分类中计算了。

    原文中介绍这样做主要是进行全连接的替换,减少参数的数量,这样计算的话,global average pooling层是没有数据参数的,这也与network in network 有关,其文章中提出了一种非线性的 类似卷积核的mlpconv的感知器的方法,计算图像的分块的值可以得到空间的效果,这样就取代了pooling的作用,但是会引入一些参数,但是为了平衡,作者提出了使用global average pooling。

    参考:

    1,http://m.blog.csdn.net/m0_37407756/article/details/72235667

    2,https://blog.csdn.net/mao_kun/article/details/50507376

    3,https://blog.csdn.net/losteng/article/details/51520555

    LED照明:依古齐尼(深圳)照明科技有限公司

          13723451660 刘先生

  • 相关阅读:
    九.Spring Boot JPAHibernateSpring Data
    JIRA安装过程中链接mysql的问题!
    五、案例-指令参考-freemarker指令、表达式
    四、模版指令操作
    三、freemarker数据、模版指令
    二、freemarker.controller半自动静态化+Tomcat虚拟资源映射
    一、springMVC、freemarker页面半自动静态化
    window窗口-button(按钮)-dialog(对话框,带按钮)
    panel面板
    python 给定年份、月份,返回当月对应天数
  • 原文地址:https://www.cnblogs.com/hansjorn/p/8206106.html
Copyright © 2011-2022 走看看