matcaffe是caffe的matlab接口。caffe本身是C++写的,其blob的维度顺序是[N,C,H,W],N表示batchSize,C表示channel数目,H表示feature map的Height, W则是width

而在matcaffe中,blob的顺序则是[W,H,C,N]。这是默认的顺序!所以在faster-rcnn的matlab代码中,当加载了proposal_test.prototxt后,发现其网络输入是:

input: "data"
input_dim: 1
input_dim: 3
input_dim: 224
input_dim: 224

一开始还奇怪,为啥在matlab中设定断点后输出网络的blob的结构是这样的:

K>> rpn_net.blobs('data').shape

ans =

   224   224     3     1

为啥不是[1,3,224,224]这个在prototxt中指定的顺序呢?虽然官方caffe的tutorial里也说了,matcaffe的blob顺序就是[W,H,C,N]

翻看matcaffe的代码:caffe_.cpp,找到370行左右:

// Usage: caffe_('blob_get_shape', hBlob)
static void blob_get_shape(MEX_ARGS) {
mxCHECK(nrhs == 1 && mxIsStruct(prhs[0]),
"Usage: caffe_('blob_get_shape', hBlob)");
Blob<float>* blob = handle_to_ptr<Blob<float> >(prhs[0]);
const int num_axes = blob->num_axes();
mxArray* mx_shape = mxCreateDoubleMatrix(1, num_axes, mxREAL);
double* shape_mem_mtr = mxGetPr(mx_shape);
for (int blob_axis = 0, mat_axis = num_axes - 1; blob_axis < num_axes;
++blob_axis, --mat_axis) {
shape_mem_mtr[mat_axis] = static_cast<double>(blob->shape(blob_axis));
}
plhs[0] = mx_shape;
}

其中最关键的是这个:

  for (int blob_axis = 0, mat_axis = num_axes - 1; blob_axis < num_axes;
++blob_axis, --mat_axis) {
shape_mem_mtr[mat_axis] = static_cast<double>(blob->shape(blob_axis));
}

这里面mat_axis这个索引是倒序的,从3到0;而blob_axis这个索引是正序增加的,从0到3。因此最终的结果是:matcaffe中的blob维度顺序和caffe中顺序完全相反,是[W,H,C,N]

matcaffe的blob维度顺序的更多相关文章

  1. Caffe源码理解1:Blob存储结构与设计

    博客:blog.shinelee.me | 博客园 | CSDN Blob作用 据Caffe官方描述: A Blob is a wrapper over the actual data being p ...

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

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

  3. SQLite中字段顺序和PAGE_SIZE对性能的影响

    1.背景 SQLite数据库中有1张表,该表含若干个字段,其中有1个字段为BLOB类型,且BLOB字段不是最后1个字段.表结构类似如下(col3为BLOB字段): T (col1 INTEGER,co ...

  4. Pytorch-tensor的维度变化

    引言 本篇介绍tensor的维度变化. 维度变化改变的是数据的理解方式! view/reshape:大小不变的条件下,转变shape squeeze/unsqueeze:减少/增加维度 transpo ...

  5. pytorch张量数据索引切片与维度变换操作大全(非常全)

    (1-1)pytorch张量数据的索引与切片操作1.对于张量数据的索引操作主要有以下几种方式:a=torch.rand(4,3,28,28):DIM=4的张量数据a(1)a[:2]:取第一个维度的前2 ...

  6. kylin的rowkey优化之调整rowkey顺序

    在以hbase为存储的cuboid中,会有很多计算好的数据行,这每个行的key都是由维度值按顺序生成的rowkey 而这个顺序,在我们做cube设计的时候是可以调整的. 具体调整路径是:cube de ...

  7. [Caffe]使用经验积累

    Caffe使用经验积累 本贴记录Caffe编译好了,使用过程的常用命令与常见错误解决方式.如果对编译过程还存在问题,请参考史上最全的caffe安装过程配置Caffe环境. 1 使用方法 训练网络 xx ...

  8. keras系列︱Application中五款已训练模型、VGG16框架(Sequential式、Model式)解读(二)

    引自:http://blog.csdn.net/sinat_26917383/article/details/72859145 中文文档:http://keras-cn.readthedocs.io/ ...

  9. 转:SSD详解

    原文:http://blog.csdn.net/a8039974/article/details/77592395, http://blog.csdn.net/jesse_mx/article/det ...

随机推荐

  1. codeigniter(ci)在nginx下返回404的处理方法即codeigniter在nginx下配置方法

    codeigniter(ci)在nginx下返回404的处理方法即codeigniter在nginx下配置方法 进入nginx的配置文件 加上一句(本来就有这句,只需要修改一下就行了) locatio ...

  2. Lak3 Counting(POJ No.2386)

    问题描述: 有个大小为N*M的园子,雨后积起了水.八连通的积水被认为是连接在一起的.求出园子里总共有多少水洼. N, M <= 100 输入例: : 问题分析: 八连通即:上.左上.左,左下,下 ...

  3. Xml转化为DataTable

    /// <summary> /// XML转换为DataTable /// </summary> /// <param name="fileName" ...

  4. 增加窗体边框3D效果

    /// <summary> /// 增加窗体边框3D效果 /// </summary> /// <param name="e"></par ...

  5. java-并发之高性能对象

    Hadoop之RPC          Hadoop的RPC主要是通过Java的动态代理(Dynamic Proxy)与反射(Reflect)实现,代理类是由java.lang.reflect.Pro ...

  6. Python:Python学习总结

    Python:Python学习总结 背景 PHP的$和->让人输入的手疼(PHP确实非常简洁和强大,适合WEB编程),Ruby的#.@.@@也好不到哪里(OO人员最该学习的一门语言). Pyth ...

  7. 分享自制的C#和VB Code互转工具

    分享自制的C#和VB Code互转工具 作为.NET程序员,往往习惯使用一种语言(据我观察,2006年后的程序员习惯用C#,之前的喜欢VB).而对于另一种语言虽然能读懂但是写起来总是比较费事.尤其面对 ...

  8. IOS touch event animation 转动的风车

    最近开始学习IOS的开发,师兄给我提出一个需求:实现一个可拖动的转盘.师兄提示我说利用touch event和UIView animation.经过一两天的折腾边学边做,算是实现了基本功能.这里写写加 ...

  9. Android分渠道打包(Python 3.4 实现)

    Android批量打包实现有很多方式你可以用Ant,Maven或者Gradle.在处理多个Library和NDK编译的时候配置有些麻烦,且每个渠道都编译一次效率较低.如果没有复杂的分渠道编译需求,我们 ...

  10. c# 数据库更新操作-文本更新和数值更新小差别

    1.文本更新 string strName; sql = "update 模式表 a SET 模式名称 ='"+ strName +"'where a.模式ID =&qu ...