如果说之前的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. node入门学习(一)

    一.安装node.js 方式很多npm,git等,新手建议从官网上直接去下载node的安装包.一键安装. 二.创建一个web服务器. const http = require('http'); htt ...

  2. mac下快速安装gearman和php扩展

    1.brew install gearman 用brew安装gearman 2.pecl install gearman 用pecl安装php的gearman扩展 3.ln -s /usr/local ...

  3. centos7防火墙操作

    启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status firewalld 开机禁用 : s ...

  4. DAY7-Python学习笔记

    前记: 这几天在弄小程序,view页面的开发很简单,但是在加载图片上遇到了问题,小程序的大小不能超过2M,所以大部分的图片内容要通过request请求服务器来获取,这里之前学习小程序的时候是通过网站A ...

  5. Shell脚本创建Nginx的upstream及location配置文件

    #!/bin/sh ##################################################### # Name: create_nginx_conf.sh # Versi ...

  6. MT【142】Bachet 问题,进位制

    问题: 满足下面两种限制条件下要想称出40以内的任何整数重量,最少要几个砝码: i)如果砝码只能在天平的某一边; ii)如果砝码可以放在天平的两边. 提示:对于 i)先证明如下事实: \[\textb ...

  7. HIGH-SPEED PACKET PROCESSING USING RECONFIGURABLE COMPUTING

    摘要 本文介绍了一种新的工具链,它将一门称为 PX 的专门用于包处理的编程语言运用到基于 FPGA 技术的高性能可重构计算架构(HIGH-PERFORMANCE RECONFIGURABLECOMPU ...

  8. 构建工具----gradle---可能遇到的问题----Could not reserve enough space for object heap

    Could not reserve enough space for object heap 意思是 jvm的设置内存不足以运行gradle命令了. 分为两种情况,解决的方法也不同. .10/user ...

  9. bug -- android 7.0 popwindow显示位置异常情况解决

    android 7.0 popwindow显示位置异常,在android7.1官方进行解决了,但是还是要多7.0的bug进行解决,我的解决方案里面通过重写popwindow进行适配: import a ...

  10. Chapter10(泛型算法)--C++Prime笔记

    关键:算法通过在迭代器上进行操作来实现类型无关.算法不改变所操作序列的大小. 1.算法大多都定义在algorithm头文件中,标准库还在头文件numeric中定义了一组数值泛型算法. 2.泛型算法永远 ...