如果说之前的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. Sql Server自增ID与序号的使用

    SQL 自增ID alter table a add id int identity(1,1) not null 这里为 a 表增加一个 id 字段,其中identity(1,1)代表自增,第一个1代 ...

  2. Python多线程获取返回值

    在使用多线程的时候难免想要获取其操作完的返回值进行其他操作,下面的方法以作参考: 一,首先重写threading类,使其满足调用特定的方法获取其返回值 import threading class M ...

  3. pixi.js 总结

    我的博客简单简洁 可能表达不清. 如有想法, 敬请留言.谢谢! 群:881784250 https://github.com/ccaleb/endless-runner/tree/master/jav ...

  4. java 数据结构与算法---递归

    原理来自百度百科 一.递归的概念 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通 ...

  5. css中对position的几种定位方式的最佳诠释

    关于元素的position定位的理解,牛客网的hardy给出了一个比较好的理解: 在html中网页可以看成一个立体的空间,一个完整的页面是由很多个页面堆积形成的,如上图所示   CSS中Positio ...

  6. mybaits入门(含实例教程和源码) http://blog.csdn.net/u013142781/article/details/50388204

    前言:mybatis是一个非常优秀的存储过程和高级映射的优秀持久层框架.大大简化了,数据库操作中的常用操作.下面将介绍mybatis的一些概念和在eclipse上的实际项目搭建使用. 一.mybati ...

  7. Windows安装ElastAlert问题总结

    1.运行时出现UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xb4 in position 0: invalid start byte 或  ...

  8. 【Python】Python简介

    Python是一种既使用简单又功能强大的高级编程语言,同时支持面向过程的编程和面向对象的编程. 官方对python的介绍:Python 是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简 ...

  9. HDU4436_str2int

    很好的一个题目.对于理解后缀自动机很有用. 题目给你若干数字串,总长度不超过100000,任意一个串的任意一个子串都可以拿出来单独的作为一个数字.同一个数字只算一次. 问所有不同数字的和为多少? 嗯嗯 ...

  10. 2018 焦作icpc现场赛总结

    Day 0 没有直达焦作的飞机,所以选择了先到新郑机场,再转乘城际列车.城际列车猜是专门给学生开通的吧,每天只有来和回一共两趟(所以机票选择的余地也不多).买的时候只有无座票了,本来以为会一直站着,但 ...