zoukankan      html  css  js  c++  java
  • 【caffe】基本数据结构blob

    @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

  • 相关阅读:
    hdu5728 PowMod
    CF1156E Special Segments of Permutation
    CF1182E Product Oriented Recurrence
    CF1082E Increasing Frequency
    CF623B Array GCD
    CF1168B Good Triple
    CF1175E Minimal Segment Cover
    php 正则
    windows 下安装composer
    windows apache "The requested operation has failed" 启动失败
  • 原文地址:https://www.cnblogs.com/zjutzz/p/5960289.html
Copyright © 2011-2022 走看看