Concat层的作用就是将两个及以上的特征图按照在channel或num维度上进行拼接,并没有eltwise层的运算操作,举个例子,如果说是在channel维度上进行拼接conv_9和deconv_9的话,首先除了channel维度可以不一样,其余维度必须一致(也就是num、H、W一致),这时候所做的操作仅仅是conv_9 的channel k1加上deconv_9的channel k2,Concat 层输出的blob可表示为:N*(k1+k2)*H*W。通常情况下,考虑到Concat是希望将同大小的特征图拼接起来,那为什么会产生同大小的特征图呢?显然离不开上采样和下采样的操作,接下来,以Caffe为例,介绍一下这两种拼接的方式,如下:

  • 选择axis=0,表示在num维度上进行拼接,可表示为:(k1+k2)*C*H*W;
  • 选择axis=1,表示在channel维度上进行拼接,可表示为:N*(k1+k2)*H*W。

注意,卷积运算是三维的(不要想成二维的,当然这应该在学卷积的时候说过的),卷积核的数量就是feature map的channel,feature map的num通常是minibatch的数目。可问题是,这两种Concat的方式应该如何选择呢?(ps:如果自己不会用,很自然就是看看别人怎么用)

那么接下来我们就看看到底怎么用。

目前我见过的大都是在channel维度上进行拼接,其实也容易想到,因为我们说feature map 的num是minibatch的图片数目,比方我们的batch是32,但是我们有4张显卡同时训练,显然minibatch等于8,这个8表示的是每张显卡一次性处理的图片数目,这么说来,如果在num维度上拼接的意思就是将同一张显卡处理的feature map数目重复的加倍了,当然由于上下采样并不是严格的互逆运算,所以在重复的特征图上像素值还是存在差异。反之,如果是在channel 维度上拼接,此时channel 的数量增加了,也就是说同一个大小的特征图有了更多的特征表示,很多论文都已经证实其可以提高检测性能,但是如果不是cancat的方式,而是增加原有的卷积层的channel数目会导致显存占用增加,速度下降,这样一来concat的方式在不失速度的前提下,提高了精度,这也是其主要的贡献。当然光说不行,我把这两种方法都试验一下,供大家参考。

在试验之前介绍一下我的环境,我采用的是VGG模型加的改进,训练中用了4个TITAN X,minibatch等于8,在保证其它情况一致的情况下进行如下试验:

  1. 在num维度上进行拼接;显然,在num维度上拼接的话,concat层输出的num个数就变成16了,如下表统计的结果显示,此种操作的效果很差,出现missing GT position for label的warning,不建议使用。
  2. 在channel维度上进行拼接,在channel维度上的拼接分成无BN层和有BN层。

(1)无BN层:直接将deconvolution layer 和convolution layer concat。实验结果表明,该方式取得的结果精度较低,低于原有的VGG模型,分析主要的原因是漏检非常严重,原因应该是concat连接的两层参数不在同一个层级,类似BN层用在eltwise层上。

(2)有BN层:在deconvolution layer 和convolution layer 后面加batchnorm和scale层(BN)后再concat。实验结果表明,该方式取得了比原有VGG模型更好的检测效果(表中的迭代次数还没有完哦),增加了2%的精度,但是速度上慢了一些。

总结:concat层多用于利用不同尺度特征图的语义信息,将其以增加channel的方式实现较好的性能,但往往应该在BN之后再concat才会发挥它的作用,而在num维度的拼接较多使用在多任务问题上,将在后续的博客中介绍,总之concat层被广泛运用在工程研究中。

Concat层解析的更多相关文章

  1. slice层解析

    如果说之前的Concat是将多个bottom合并成一个top的话,那么这篇博客的slice层则完全相反,是把一个bottom分解成多个top,这带来了一个问题,为什么要这么做呢?为什么要把一个低层的切 ...

  2. Eltwise层解析

    Concat层虽然利用到了上下文的语义信息,但仅仅是将其拼接起来,之所以能起到效果,在于它在不增加算法复杂度的情形下增加了channel数目.那有没有直接关联上下文的语义信息呢?答案是Eltwise层 ...

  3. json两层解析

    public class Demo { public static void main(String[] args) { try { // 创建连接 服务器的连接地址 URL url = new UR ...

  4. Caffe_Scale层解析

    Caffe Scale层解析 前段时间做了caffe的batchnormalization层的解析,由于整体的BN层实现在Caffe是分段实现的,因此今天抽时间总结下Scale层次,也会后续两个层做合 ...

  5. ASP.NET SignalR2持久连接层解析

    越是到年底越是感觉浑身无力,看着啥也不想动,只期盼着年终奖的到来以此来给自己打一针强心剂.估摸着大多数人都跟我一样犯着这样浑身无力的病,感觉今年算是没挣到啥钱,但是话也不能这么说,搞得好像去年挣到钱了 ...

  6. Euclideanloss_layer层解析

    这里说一下euclidean_loss_layer.cpp关于该欧式loss层的解析,代码如下: #include <vector> #include "caffe/layers ...

  7. Spring的Service层与Dao层解析

    本文转载于网络,觉得写得很透彻. dao完成连接数据库修改删除添加等的实现细节,例如sql语句是怎么写的,怎么把对象放入数据库的.service层是面向功能的,一个个功能模块比如说银行登记并完成一次存 ...

  8. Mybatis框架基础支持层——解析器模块(2)

    解析器模块,核心类XPathParser /** * 封装了用于xml解析的类XPath.Document和EntityResolver */ public class XPathParser { / ...

  9. TCP协议详解7层和4层解析(美团,阿里) 尤其是三次握手,四次挥手 具体发送的报文和状态都要掌握

    如果想了解HTTP的协议结构,原理,post,get的区别(阿里面试题目),请参考:HTTP协议 结构,get post 区别(阿里面试) 这里有个大白话的解说,可以参考:TCP/IP协议三次握手和四 ...

随机推荐

  1. Littleproxy的使用

    介绍 LittleProxy是一个用Java编写的高性能HTTP代理,它基于Netty事件的网络库之上.它非常稳定,性能良好,并且易于集成到的项目中. 项目页面:https://github.com/ ...

  2. requests爬取豆瓣热门电视剧

    # *_*coding:utf-8 *_* import requests payload = {'key1': 'value1', 'key2': 'value2'} headers = {'use ...

  3. Pytest - 进阶功能fixture

    1. 概述 Pytest的fixture功能灵活好用,支持参数设置,便于进行多用例测试,简单便捷,颇有pythonic.如果要深入学习pytest,必学fixture. fixture函数的作用: 完 ...

  4. Mysql innodb 间隙锁 (转)

    MySQL InnoDB支持三种行锁定方式: 行锁(Record Lock):锁直接加在索引记录上面. 间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记 ...

  5. vue & keep-alive & activated

    vue & keep-alive & activated vue 生命周期 钩子函数 缓存 http://www.cnblogs.com/nekoooo/p/6442077.html ...

  6. js小功能记录

    个人日常中遇到的js小功能记录,方便查看. /** * 判断是否包含字符串某字符串 * @param {[type]} str [被检测的字符串] * @param {[type]} substr [ ...

  7. linux eclipse add desktop shortcut with root permission

    gedit ~/.local/share/applications/opt_eclipse.desktop sudo apt-get install gksu [Desktop Entry] Type ...

  8. Swift中使用MPMoviePlayerController实现自定义视频播放器界面

    默认情况下播放器自带各种控制按钮,比如前进后退播放暂停等: var url = NSBundle.mainBundle().URLForResource("1", withExte ...

  9. Pentaho的Mondrian对Hive的支持

    需求描述 考虑直接在Hive或者Impala等Big Data方案,能够支持MDX查询,现调研一下Mondrian对hive的支持情况. 环境准备 hive环境,采用hive-0.10-cdh4.2. ...

  10. 单点登录(十二)-----遇到问题-----cas启用mongodb验证方式登录后没反应-pac4j-mongo包中的MongoAuthenticatInvocationTargetException

    cas启用mongodb验证方式登录后没反应 控制台输出 2017-02-09 20:27:15,766 INFO [org.jasig.cas.authentication.MongoAuthent ...