如果说之前的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 API库

    1.API能实现什么? 1.分享到微信朋友圈 2.分享给微信好友 3.分享到腾讯微博 4.新的分享接口,包含朋友圈.好友.微博的分享(for iOS) 5.隐藏/显示右上角的菜单入口 6.隐藏/显示底 ...

  2. nowcoder 202H-卡牌游戏

    题目链接 题目描述 小贝喜欢玩卡牌游戏.某个游戏体系中共有N种卡牌,其中M种是稀有的.小贝每次和电脑对决获胜之后都会有一个抽卡机会,这时系统会随机从N种卡中选择一张给小贝.普通卡可能多次出现,而稀有卡 ...

  3. 【刷题】BZOJ 2049 [Sdoi2008]Cave 洞穴勘测

    Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...

  4. Atcoder Yahoo Programming Contest 2019 简要题解

    A-C 直接放代码吧. A int n,k; int main() { n=read();k=read(); puts(k<=(n+1)/2?"YES":"NO&q ...

  5. 【BZOJ2654】Tree(凸优化,最小生成树)

    [BZOJ2654]Tree(凸优化,最小生成树) 题面 BZOJ 洛谷 题解 这道题目是之前\(Apio\)的时候写的,忽然发现自己忘记发博客了... 这个万一就是一个凸优化, 给所有白边二分一个额 ...

  6. GDOI2018记录

    ​ 说实话,直到初三暑假升高一的时候,我才开始形成竞赛观.那时才顿觉一年的各个比赛是多么重要. ​ 紧接着我的NOIP就直接爆炸了.这意味着我一年也完蛋了.各种人去WC,然后我留在家里. ​ 那GDO ...

  7. uoj132/BZOJ4200/洛谷P2304 [Noi2015]小园丁与老司机 【dp + 带上下界网络流】

    题目链接 uoj132 题解 真是一道大码题,,,肝了一个上午 老司机的部分是一个\(dp\),观察点是按\(y\)分层的,而且按每层点的上限来看可以使用\(O(nd)\)的\(dp\),其中\(d\ ...

  8. 洛谷 P3990 [SHOI2013]超级跳马 解题报告

    P3990 [SHOI2013]超级跳马 题目描述 现有一个\(n\) 行 \(m\) 列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘. ...

  9. Ld, -rpath, -rpath-link

    http://blog.csdn.net/xph23/article/details/38157491

  10. Android Studio & eclipse 调试技巧

    如上图设置多个断点,开启调试.想跨断点移动到下一个断点,点击如下图1箭头,程序将运行一个断点到下一个断点之间需要执行的代码.如果后面代码没有断点,再次点击该按钮将会执行完程序.点击箭头2指向的按钮,可 ...