如果说之前的Concat是将多个bottom合并成一个top的话,那么这篇博客的slice层则完全相反,是把一个bottom分解成多个top,这带来了一个问题,为什么要这么做呢?为什么要把一个低层的切分成多个高层的呢?自然有它的用途,大家想想,假如我们做的是多任务的问题,比如车牌检测、燃气表盘检测、验证码检测,这类OCR问题,之前做的一个项目就是一个多标签的学习,燃气表大家都知道,8位的表盘,每位都是数字(0~9),前面的环节不考虑小数点。采取的方法是定位+识别的方法,我们先用深度模型检测表盘的位置,然后在crop的位置上识别这些数字,那么问题来了,传统的单任务根本不容易做这件事,如果你想把这8位的数字定义成一个任务一个目标的话,那可想而知,类别太太太多了,每类都需要几百张以上的图片,这数据量难以想象;而如果我们把这个问题当作是单任务的多目标呢?类别确实是少了很多,只有最少的10类了(0~9),可问题是每张图片都需要标注这8个数字,有点太辛苦了,当然这种方法比第一个方法要好很多;那如果是多任务单目标呢?你看一张图片上我们只会crop出一个目标,而这个目标我们是知道的,它有8个数字组成,这就是多任务,换一句话说就是检测数字玩8次,每次都是这10个数,但你要同时玩8次这样的事,这就是多任务,多任务伴随着多标签(label),这个时候slice层派上用场,把我们最初的问题大大滴简化了,我们不再需要做那么复杂的标注,同时也将问题变得可控,因为只有10类嘛。

slice层,可根据给定的维度将bottom切分成多个top,用于具有多个输入多任务的网络。slice层有三个参数,axis和slice_dim用于指定切分的维度是什么,默认为1,切分channel维度,还有另一个选择就是切分num,类似于Concat层,但是注意这两个参数只能指定一个,常用axis。第三个参数就是指定从哪里开始切分,怎么切分?这个参数就是slice_point,因此slice层的运用格式为:

layer {
name: "slicelayer"
type: "Slice"
bottom: "labels"
top: "labels1"
top: "labels2"
top: "labels3"
top: "labels4"
top: "labels5"
top: "labels6"
top: "labels7"
top: "labels8"
slice_param {
axis:
slice_point:
slice_point:
slice_point:
slice_point:
slice_point:
slice_point:
slice_point:
}
}

解释一下,我们的labels是由8个数字组成的,所以8个任务当然要切分成8个label,怎么切呢,显然我们labels之间每隔1为一个label,切7次就搞定了,所以注意slice_point的个数要比top的个数少一个,大概的意思就是一根绳子剪几次有8段?答案是7次,当然绳子是无折叠的,很单纯的。

上面的问题我们是切分label,因为我说是多标签的,那如果切分data呢?有没有这种情况?shuzfan的博客中提到了人脸检测的MTCNN的例子,里面有concat层和slice层在num维度上的运用,因为我没用过,不太熟悉,但说明这种情况是存在的(也即存在便有意义,所以啊,你的存在就是一种意义,常常这么欺骗自己)。

细心的同学发现了,其实caffe还有Split layer,插一句,此处推荐给大家caffe namespace,方便大家查阅,我们可以找到Split layer,对它的描述是:Creates a "split" path in the network by copying the bottom Blob into multiple top Blobs to be used by multiple consuming layers. 意思很明显了,就是把一个bottom 的blob复制成几份相同的blob给top层用。实际中这个层没用过,但我觉得它可以将一个data层对应几个top层,这样起到了共享输入的效果。

总之,在这篇博客和之前Concat的博客中,我们介绍了两个可谓相反的层,在多任务学习中,两者往往在一起用,会起到意想不到的效果。我们可以使用slice层进行多标签学习的时候,运用concat层增加相邻层的语义相关性,增强我们模型对特征的表达能力,这在Concat层解析中已经得到了实验证明。

slice层解析的更多相关文章

  1. slice全解析

    slice全解析 昨天组内小伙伴做分享,给出了这么一段代码: package main import ( "fmt" ) func fun1(x int) { x = x + 1 ...

  2. tf.slice函数解析

    tf.slice函数解析 觉得有用的话,欢迎一起讨论相互学习~Follow Me tf.slice(input_, begin, size, name = None) 解释 : 这个函数的作用是从输入 ...

  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. Eltwise层解析

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

随机推荐

  1. js框架总结

    参考地址 http://www.techweb.com.cn/network/system/2015-12-23/2245809.shtml https://www.cnblogs.com/mbail ...

  2. js遍历数组和遍历对象

    可以用for in来遍历对象,具体内容如下: <script type="text/javascript">             var objs = {      ...

  3. IE userdata 原理 应用 详解

    https://www.cnblogs.com/chyong168/archive/2012/04/24/2467505.html 在Internet Explorer 5中,Microsoft提供了 ...

  4. 第218天:Angular---模块和控制器

    1.使用NG实现双边数据绑定 所有需要ng管理的代码必须被包裹在一个有ng-app指令的元素中ng-app是ng的入口,表示当前元素的所有指令都会被angular管理(对每一个指令进行分析和操作) & ...

  5. vue项目使用eslint

    转载自 https://www.cnblogs.com/hahazexia/p/6393212.html eslint配置方式有两种: 注释配置:使用js注释来直接嵌入ESLint配置信息到一个文件里 ...

  6. RocketMQ生产者消息篇

    系列文章 RocketMQ入门篇 RocketMQ生产者流程篇 RocketMQ生产者消息篇 前言 上文RocketMQ生产者流程篇中详细介绍了生产者发送消息的流程,本文将重点介绍发送消息的通信模式以 ...

  7. 安装linux系统后调优及安全设置

    环境说明: [root@server1 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@server1 ~]# uname - ...

  8. java 操作命令行

    目的:用java进行调用ab压测 window: cmd ab.exe linux: sh  ab.sh 命令: abs -n 500 -c 10 https://www.baidu.com/ > ...

  9. nodejs进程异常退出处理方法

    1. 捕获uncaughtException process.on('uncaughtException', function (err) { //打印出错误 console.log(err); // ...

  10. Go_20: Golang 中 time 包的使用

    time包中包括两类时间:时间点(某一时刻)和时常(某一段时间) 1. 时间常量(时间格式化) const ( ANSIC = "Mon Jan _2 15:04:05 2006" ...