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: # copy the dimension from below
dim:
dim:
dim: - # 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:
slice_point:
slice_point:
slice_point:
}
}

这里假设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 刘先生

CNN 各layer汇总的更多相关文章

  1. 论文笔记之: Hierarchical Convolutional Features for Visual Tracking

    Hierarchical Convolutional Features for Visual Tracking  ICCV 2015 摘要:跟卢湖川的那个文章一样,本文也是利用深度学习各个 layer ...

  2. Convolutional Neural Network in TensorFlow

    翻译自Build a Convolutional Neural Network using Estimators TensorFlow的layer模块提供了一个轻松构建神经网络的高端API,它提供了创 ...

  3. Keras教程

    In this step-by-step Keras tutorial, you’ll learn how to build a convolutional neural network in Pyt ...

  4. 使用 Estimator 构建卷积神经网络

    来源于:https://tensorflow.google.cn/tutorials/estimators/cnn 强烈建议前往学习 tf.layers 模块提供一个可用于轻松构建神经网络的高级 AP ...

  5. Tutorial: Triplet Loss Layer Design for CNN

    Tutorial:  Triplet Loss Layer Design for CNN Xiao Wang  2016.05.02 Triplet Loss Layer could be a tri ...

  6. Visualizing CNN Layer in Keras

    CNN 权重可视化 How convolutional neural networks see the world An exploration of convnet filters with Ker ...

  7. capsule network——CNN仅仅考虑了“有没有”的问题,没有考虑feature map的结构关系。这个结构关系包括位置,角度等。Capsule layer的输出也跟feature map的max-pooling输出不同,capsule layer的输出是一个向量,这个向量包含了位置,大小,角度等信息,这是feature map仅能输出一个值所不具备的;训练比较慢

    capsule network--<Dynamic Routing Between Capsules> from:https://zhuanlan.zhihu.com/p/31491520 ...

  8. 大汇总 | 一文学会八篇经典CNN论文

    本文主要是回顾一下一些经典的CNN网络的主要贡献. 论文传送门 [google团队] [2014.09]inception v1: https://arxiv.org/pdf/1409.4842.pd ...

  9. layer 问题 汇总

    1.搭配iframe  子页面遮罩层 覆盖父页面 window.parent.layer.open({      // type: 1, //skin: 'layui-layer-rim', //加上 ...

随机推荐

  1. Drupal中的模块载入

    什么是模块载入?首先说载入,这里的载入是指require_once.模块载入就是指require_once模块目录中的某个PHP文件. 每个Drupal模块都应该有自己的主文件.模块主文件以模块名开始 ...

  2. 阿里云 oss python3 样例

    阿里云的oss SDK又是不支持python3,头疼头疼. 本想改一改它的SDK,让它支持python2+python3,无奈里面大量的代码使用不带括号的print.工作量恐怖. 幸好oss的使用很e ...

  3. C#调用Windows CMD命令并,返回输出结果或错误信息

    public static string InvokeExcute(string Command) { Command = Command.Trim().TrimEnd('&') + &quo ...

  4. python代码 构建验证码

    1.python代码编写 (随机验证码): #coding: utf-8 import Image, ImageDraw, ImageFont, ImageFilter import string, ...

  5. 測试赛C - Eqs(哈希)

    C - Eqs Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  6. 解决gremlin-dirver访问tinkerpop服务器提示序列化错误

    解决gremlin-dirver访问tinkerpop服务器提示序列化错误 问题描述 程序集成了gremlin-driver,访问远程tinkerpop服务器,在执行创建节点操作时,返回如下错误栈: ...

  7. python得到今天前的七天每天日期

    import datetime d = datetime.datetime.now() def day_get(d): # 通过for 循环得到天数,如果想得到两周的时间,只需要把8改成15就可以了. ...

  8. 查询MySql数据库架构信息:数据库,表,表字段

    /*1.查询所有数据库*/ show databases;  /*2.查询所有数据表*/ select * from information_schema.tables where table_sch ...

  9. c语言中数组名和指针变量的区别

    编译器工作原理:在64位的计算机中,当创建一个指针变量时,计算机会为它分配8个字节的存储空间.但如果创建的是数组呢?计算机会为数组分配存储空间,但不会为数组变量分配任何空间,编译器仅在出现它的地方把它 ...

  10. atitit。全局变量的设计与实现 java php的异同

    atitit.全局变量的设计与实现 java php的异同 1. 超级全局(Superglobals)"变量 1 2. 全局变量和"global"关键字 1 3. 更加好 ...