博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
matcaffe的blob维度顺序
阅读量:7224 次
发布时间:2019-06-29

本文共 1429 字,大约阅读时间需要 4 分钟。

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: 1input_dim: 3input_dim: 224input_dim: 224

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

K>> rpn_net.blobs('data').shapeans =   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
* blob = handle_to_ptr
>(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
(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
(blob->shape(blob_axis)); }

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

转载地址:http://gwufm.baihongyu.com/

你可能感兴趣的文章
Bowery为什么从Node.js转向 Go
查看>>
Java 20年:转角遇到Go
查看>>
JavaScript到底是面向对象还是基于对象?
查看>>
java第三方包学习之lombok
查看>>
《OpenStack 实战》内容概览与作者采访
查看>>
微软宣布公开预览其内容分发网络
查看>>
MongoDB 是如何鼓励和激励开发者社区的
查看>>
太多脚本将会毁掉持续交付
查看>>
如何在国内构建一个硅谷级的高效技术团队?
查看>>
QCon旧金山2016大会,议题发布及研讨会一瞥
查看>>
苏宁:我们开发百度小程序遇到的那些“坑”
查看>>
聊天宝彻底凉了,遭罗永浩抛弃,团队就地解散
查看>>
取代Python多进程!伯克利开源分布式框架Ray
查看>>
中台之上(八):企业级业务架构的实现需要不断沟通和调整
查看>>
BAT集体升级云事业部,这背后都藏着哪些“小心思”?
查看>>
JavaScript对象:我们真的需要模拟类吗?
查看>>
Node.js因为OpenSSL安全问题推迟更新
查看>>
宜人贷CTO段念:透明与面向目标是管理理念的核心
查看>>
Java 9进入第一轮问题修复阶段
查看>>
蔚来汽车李斌:2025年无人驾驶将100%解放驾驶时间
查看>>