如果说之前的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. 爬虫学习之-requests乱码

    总体功能的一个演示 import requests response = requests.get("https://www.baidu.com") print(type(resp ...

  2. Windows 常用快捷方式

    gpedit.msc-----组策略sndrec32-----录音机nslookup----- ip地址侦测器explorer------ 打开资源管理器logoff-------注销命令tsshut ...

  3. [转帖]通俗解释 AWS 云服务每个组件的作用

    你有听说过 ContainerCache,ElastiCast 和 QR72 这些 AWS 的新服务吗? 没有就对了,这些都是我编的:) 不过,AWS 有 50 多个服务,从名称也不能看出这些服务是做 ...

  4. C# 字符串多行显示、文本换行

    以textbox为例 ①:先设置textbox的属性Multiline为true ②:组织好显示字符串:FistLine(第一行要显示的字符).SecondLine(第二行要显示的字符)....... ...

  5. delphi ERP框架

    之前做c/s架构,接了有家装饰的一个ERP项目,做了一个ERP框架,现在转后端开发了,这些东西还是蛮怀念的,就开源出来吧,有需要的同学可以参考. https://github.com/qianlnk/ ...

  6. Netty简单使用

    目录 丢弃服务器 DiscardServerHandler DiscardServer 测试 应答服务器 时间服务器 TimeServerHandler TimeClient TimeClientHa ...

  7. 【Java并发编程】之十三:生产者—消费者模型

    生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. ​ 这里实现如下情况的生产--消费模型: ​ 生产者不断交替地生产两组 ...

  8. 迭代解析JSON简单实例

    由于项目中遇到了这个问题,所以在这里记录一下. 比如:请求到的JSON串: { "msg":"数据获取成功", "success":true ...

  9. Windows Shell远程执行代码漏洞((CVE-2018-8414)复现

    0x00   SettingContent-ms文件介绍 .SettingContent-ms是在Windows 10中引入的一种文件类型,它的内容是XML格式进行编写的,主要用于创建Windows设 ...

  10. PHP获取IP地址的方法,防止伪造IP地址注入攻击

    PHP获取IP地址的方法 /** * 获取客户端IP地址 * <br />来源:ThinkPHP * <br />"X-FORWARDED-FOR" 是代理 ...