@tags: caffe blob

blob是caffe中的基本数据结构,简单理解就是一个“4维数组”。但是,这个4维数组有什么意义?

BTW,TensorFlow这款google出的框架,带出了tensor(张量)的概念。虽然是数学概念,个人还是倾向于简单理解为“多维数组”,那么放在这里,caffe的blob就相当于一个特殊的tensor了。而矩阵就是二维的张量。

anyway,看看blob的4个维度都代表什么:

num: 图像数量
channel:通道数量
width:图像宽度
height:图像高度

caffe中默认使用的SGD随机梯度下降,其实是mini-batch SGD

每个batch,就是一堆图片。这一个batch的图片,就存储在一个blob中。

当然,blob并不是这么受限的、专门给batch内的图片做存储用的。实际上,参数、梯度,也可以用blob存储的。只要是caffe的网络中传递的数据,都可以用blob存储。

而且,blob实际上也并不一定是4维的。它在实现上其实就是1维的指针,而我们作为用户感受到的“多个维度”是通过shape来操作的。

========= 2016-10-26 20:32:45更新 ==========

在用faster-rcnn训练的时候使用了ZF网络,对于ZF网络中的卷积、池化的计算,这里想自己算一算,结果发现对于卷积网的计算细节还是不太懂,于是找到这篇博客

一开始对于博客中的推导,1、2=>3这里不理解:

1、首先,输入图片大小是 2242243(这个3是三个通道,也就是RGB三种)

2、然后第一层的卷积核维度是 773*96 (所以大家要认识到卷积核都是4维的,在caffe的矩阵计算中都是这么实现的);

3、所以conv1得到的结果是11011096 (这个110来自于 (224-7+pad)/2 +1 ,这个pad是我们常说的填充,也就是在图片的周围补充像素,这样做的目的是为了能够整除,除以2是因为2是图中的stride, 这个计算方法在上面建议的文档中有说明与推导的);

第一感觉是,conv1得到的应该是110x110x3x96的结果,而不是110x110x96。后来问了别人,再看看书,发现自己忽略了一个细节,就是卷积之后有一个∑和sigmoid的两个过程,前者是累加,后者是映射到0-1之间。具体到faster-rcnn,∑对应的就是:各个通道上对应位置做累加;而激活函数使用的应该是ReLU吧。anyway,这里的累加和激活函数处理后,通道数就变成了一个;也就是,对于一个滤波器,滑窗滤波+累加、激活函数后,得到的一个feature map。

再具体点说,这里的滤波器(卷积核),是3维的,(Width,Height,Channel)这样;我们用它在一个feature map上按滑窗方式做卷积,其实是所有Channel上同时做sliding window的操作;每个sliding windows位置上,所有通道卷积的结果累加起来,再送给激活函数ReLU处理,就得到结果feature map中的一个像素的值。

值得注意的是,滤波器的通道数量,和要处理的feature map的通道数量,其实可以不一样的,可以比feature map维度少一点,这相当于可以自行指定要选取feature map中的某些channel做卷积操作,相当于有一个采样的过程,甚至可以仅仅使用一个channel的卷积结果。具体例子,可以参考《人工智能(第三版)》(王万良著)里面的例子,结合例子中算出的“要学习的参数数量”来理解。

总结

  1. 在caffe中,Blob类型是(Width,Height,Channel,Number)四元组,表示宽度、高度、通道数量、数量(或者叫种类)

  2. 图像本身、feature map、滤波器(kernel),都可以看做是Blob类型的具体例子

  3. 一个“层”,可以理解为执行相应操作后,得到的结果。比如,执行卷积操作,得到卷积层;执行全连接操作,得到全连接层。通常把池化层归属到卷积层里面。池化就是下采样的意思,有最大池化和平均池化等。

  4. 对于一个卷积层,其处理的“输入”是多个feature maps,也就是一个Blob实例:(H1,W1,C1,N1),比如(224,224,3,5),表示5张图像(这里的5,可以认为是一个minibatch的batch size,即图片数量)

    卷积操作需要卷积核的参与,卷积核也是Blob的实例:(H2,W2,C2,N2),比如(7,7,3,96),表示有96个卷积核,每个卷积核是一个3维的结构,是7x7的截面、3个通道的卷积核

    卷积层的输出也是若干feature maps,也是一个Blob实例:(H3,W3,C3,N3),是根据输入的feature maps和指定的卷积核计算出来的。按上面的例子,得到feature map的Blob描述为(110,110,96,5),表示有5个feature maps,每个feature map是110x110x96大小。

    通常可以这样理解:卷积核的个数,作为结果feature maps中的通道数量。

参考

http://blog.csdn.net/u014114990/article/details/51125776

=========== 2016-10-27 21:06:24 再次update ===========

其实上面的理解简直是过于琐碎、过于不到位。其实CNN的数据流动,包括前向传播和反向传播,都是blob经过一层,得到一个新的blob,这个层通常是卷积操作。这个卷积是3D卷积,是空间的卷积!简言之,每次把空间的一个长方体内部的元素值累加,即得到结果feature map中的一个像素值(通常是滑窗操作,所以说是得到一个像素值):

feature map --(3D卷积)--> 新的feature map

【caffe】基本数据结构blob的更多相关文章

  1. 【caffe Blob】caffe中与Blob相关的代码注释、使用举例

    首先,Blob使用的小例子(通过运行结果即可知道相关功能): #include <vector> #include <caffe/blob.hpp> #include < ...

  2. (Caffe)基本类Blob,Layer,Net(一)

    本文地址:http://blog.csdn.net/mounty_fsc/article/details/51085654 Caffe中,Blob.Layer,Net,Solver是最为核心的类,下面 ...

  3. caffe源代码分析--Blob类代码研究

    作者:linger 转自须注明转自:http://blog.csdn.net/lingerlanlan/article/details/24379689 数据成员 shared_ptr<Sync ...

  4. 【撸码caffe 二】 blob.hpp

    Blob类是caffe中对处理和传递的实际数据的封装,是caffe中基本的数据存储单元,包括前向传播中的图像数据,反向传播中的梯度数据以及网络层间的中间数据变量(包括权值,偏置等),训练模型的参数等等 ...

  5. Caffe源码-Blob类

    Blob类简介 Blob是caffe中的数据传递的一个基本类,网络各层的输入输出数据以及网络层中的可学习参数(learnable parameters,如卷积层的权重和偏置参数)都是Blob类型.Bl ...

  6. caffe中的Blob块

    首先说明:Blob定义了一个类模板. 让我们看一下Blob的头文件里有什么哈: 定义了一个全局变量: const ; 看看它的构造函数: Blob() : data_(), diff_(), coun ...

  7. faster-rcnn原理讲解

    文章转自:https://zhuanlan.zhihu.com/p/31426458 经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在2016年提出了新的Faster RC ...

  8. faster rcnn相关内容

    转自: https://zhuanlan.zhihu.com/p/31426458 faster rcnn的基本结构 Faster RCNN其实可以分为4个主要内容: Conv layers.作为一种 ...

  9. Faster-rcnn实现目标检测

      Faster-rcnn实现目标检测 前言:本文浅谈目标检测的概念,发展过程以及RCNN系列的发展.为了实现基于Faster-RCNN算法的目标检测,初步了解了RCNN和Fast-RCNN实现目标检 ...

随机推荐

  1. javascript中的链表结构

    1.定义 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组已经被数据填满的时候,需要再加入新的元素就很困难.只能说在部分变成语言中会有这种情况,在javascript ...

  2. 数据库 Linux下的MySQL数据库管理

    数据库就是数据的集合. 关系数据库是一种特殊的数据库,他将数据组织城标,并表示为表之间的关系. 数据库系统往往是大型项目的核心数据内容,如银行的用户账户信息,腾讯QQ的用户账户信息.股市的各种交易信息 ...

  3. WPF:自动执行"机器人"程序若干注意事项

    企业应用中,经常会遇到一些需要定时自动执行的程序来完成某些功能,比如:自动定时从第三方web service取回数据.定时对历史数据进行清理.定时向ftp上传业务数据... 这类程序,我习惯称为“机器 ...

  4. SQL Server中的索引结构与疑惑

    说实话我从没有在实际项目中使用过索引,仅知道索引是一个相当重要的技术点,因此我也看了不少文章知道了索引的区别.分类.优缺点以及如何使用索引.但关于索引它最本质的是什么笔者一直没明白,本文是笔者带着这些 ...

  5. node 学习笔记 - Modules 模块加载系统 (1)

    本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...

  6. mac下CornerstoneSVN出错 Description : The working copy is locked due to a previous error

    使用CornerStone工具update最新SVN代码报错:The working copy is locked due to a previous error,不仅无法上传,也无法更新,错误提示被 ...

  7. 仿造slither.io第一步:先画条蛇

    前言 最近 slither.io 貌似特别火,中午的时候,同事们都在玩,包括我自己也是玩的不亦乐乎. 好久好久没折腾过canvas相关的我也是觉得是时候再折腾一番啦,所以就试着仿造一下吧.楼主也没写过 ...

  8. checkbox js onclick ajax,列表页表格中修改数据

    <input type='checkBox' value='".$row["p_id"]."' onclick='changeisNew(this);'& ...

  9. 图片上传和显示——上传图片——上传文件)==ZJ

    http://www.cnblogs.com/yc-755909659/archive/2013/04/17/3026409.html aspx上传 http://www.cnblogs.com/mq ...

  10. MVC———用自定义扩展类实现验证

    废话少说,直接上图 →_→ NO.1 NO.2 NO.3 NO.4 NO.5 NO.6 NO.7 NO.8 NO.9 NO.10 NO.11 NO.12 NO.13 NO.14 NO.15 NO.16 ...