
框架使用
编译caffe的MATLAB接口出问题
Caffe环境安装 • 雷雷雨 回复了问题 • 3 人关注 • 3 个回复 • 6417 次浏览 • 2019-09-03 15:54
ubuntu16.04配置caffe编译报错,各种博客的方法都没解决
Caffe环境安装 • B-Kalasiky 回复了问题 • 4 人关注 • 3 个回复 • 3416 次浏览 • 2019-05-01 19:13
各位大神请看一下跑FCN时出现的*ptr host allocation of size 561259008 failed是内存不足引起的吗?谢谢
Caffe开发使用 • antigravity 回复了问题 • 2 人关注 • 1 个回复 • 3728 次浏览 • 2018-12-01 08:28
caffe移植到arm 之 hdf5交叉编译
Caffe开发使用 • 跨界程序猿 回复了问题 • 2 人关注 • 1 个回复 • 3678 次浏览 • 2018-11-21 16:02
caffe 如何进行特征融合?
图像分类 • fayeye 回复了问题 • 13 人关注 • 9 个回复 • 4754 次浏览 • 2018-11-14 21:24
CAFFE2的MNIST的验证运行问题, 为何显示打不开LMDB数据库
综合问题 • zwb666 回复了问题 • 6 人关注 • 5 个回复 • 3717 次浏览 • 2018-11-08 12:48
caffe的编译出现问题
Caffe环境安装 • Alvin_Lee 回复了问题 • 2 人关注 • 1 个回复 • 2746 次浏览 • 2018-10-14 17:27
Windows下Caffe的训练日志在哪里?
综合问题 • yunyunxu 回复了问题 • 4 人关注 • 4 个回复 • 3876 次浏览 • 2018-10-07 09:13
andrio中集成caffe2执行runne函数一直卡阻,没有响应
回复综合问题 • fa_ge 发起了问题 • 1 人关注 • 0 个回复 • 1353 次浏览 • 2018-09-03 11:34
caffe-windows下MATLAB 环境配置成功,demo时invalid Net handle
Caffe环境安装 • Shewhart 回复了问题 • 9 人关注 • 7 个回复 • 6960 次浏览 • 2018-09-01 19:56
请问make pycaffe时,出现如下问题,如何解决?
Caffe开发使用 • smiley 回复了问题 • 7 人关注 • 5 个回复 • 9532 次浏览 • 2018-06-16 13:07
caffe怎样实现在单gpu上开多线程,提高gpu的利用率
大规模优化 • mhaoyang 回复了问题 • 5 人关注 • 3 个回复 • 5248 次浏览 • 2018-06-07 13:04
caffe生成配置文件prototxt中的num_output怎么定义值
参数调节 • alex68 回复了问题 • 2 人关注 • 1 个回复 • 1953 次浏览 • 2018-06-01 08:25
caffe runtest hdf5=1.8.16和python3.6的问题
回复Caffe环境安装 • alexliu 发起了问题 • 1 人关注 • 0 个回复 • 2480 次浏览 • 2018-05-29 19:36
caffe编译过程出现问题,望大神指点
Caffe环境安装 • alex68 回复了问题 • 2 人关注 • 1 个回复 • 5588 次浏览 • 2018-05-23 11:43
caffe运行中断: data_transformer.cpp:Check failed
人脸识别 • lishanlu136 回复了问题 • 3 人关注 • 2 个回复 • 3564 次浏览 • 2018-05-23 11:37
caffe2安装问题
Caffe环境安装 • breadbread1984 回复了问题 • 2 人关注 • 1 个回复 • 3410 次浏览 • 2018-05-20 01:03
caffe2编译出错
Caffe开发使用 • breadbread1984 回复了问题 • 2 人关注 • 3 个回复 • 7502 次浏览 • 2018-05-20 01:01
caffe自带lstm参数问题
深度学习应用 • alex68 回复了问题 • 3 人关注 • 1 个回复 • 5848 次浏览 • 2018-05-19 16:47
caffe2 网络层替换的问题
Caffe开发使用 • breadbread1984 回复了问题 • 2 人关注 • 1 个回复 • 1415 次浏览 • 2018-05-17 23:04
首先导入makefile工程到eclipse
File→New→Project→C/C++ →Makefile Project with Existing Code.
然后选择从现有... 显示全部 »
首先导入makefile工程到eclipse
File→New→Project→C/C++ →Makefile Project with Existing Code.
然后选择从现有代码创建一个makefile项目
选Create a new Makefile Project from existing code
设置工程名
设置代码路径
语言选C++
工具链选linux GCC
然后就可以把工程引入进来了
以上~
下面是读取pool5的代码示例:
boost::shared_ptr<c... 显示全部 »
下面是读取pool5的代码示例:
boost::shared_ptr<caffe::Blob<NetF>> pool5 = _net->blob_by_name("pool5");
cv::Mat Pool5FeatureMat(pool5->num(), pool5->width()*pool5->height()*pool5->channels(), CV_32F);
int channel_step = pool5->height()*pool5->width();
for (size_t n = 0; n < pool5->num(); n++)
{
for (size_t c = 0; c < pool5->channels(); c++)
{
for (size_t h = 0; h < pool5->height(); h++)
{
for (size_t w = 0; w < pool5->width(); w++)
{
float value = pool5->data_at(n, c, h, w);
}
}
}
}
然后我们使用matlab的接口就可以自己进行matlab的矩阵转换了,如果是单张图片num一层的循环可以去掉。
下面我给出c++将数组转成matlab的矩阵的代码:
#include <iostream.h>
#include "xMatrix.h"
#include "MatlabEngine.h"
void main()
{
printf("matlab&c++ /n /
visualsan@yahoo.cn NUAA/
2011/n------------------------/n");
//matlab 引擎
CMatlabEngine g;
//打开
cout<<"Open Matlab Engine..../n";
if( g.OpenEngine() )
{
//1.从matlab中获取一个5X5的随机矩阵
char tmp[200];
//准备矩阵5X5
double mr[]=
{
1.2,4.4,5.5,6.6,7.7,
1.12,1.44,15.5,1.66,1.77,
21.2,2.44,2.55,2.66,2.77,
3.12,3.44,3.55,3.66,3.77,
4.12,4.44,4.55,4.66,4.77
};
//转换为matlab格式,按列存储
xMatrixDouble::C2Mat(mr,5,5,mr);
xMatrixDouble xd(5,5,mr);
//写入矩阵
g.PutVar("text_matrix",xd.GetArray());
//计算矩阵的逆矩阵
g.EvalString("text_matrix_inv=inv(text_matrix);");
mxWrap text_matrix;
mxWrap text_matrix_inv;
//获取名称为text_matrix的矩阵
g.GetVar("text_matrix",&text_matrix);
xMatrixDouble *pd=(xMatrixDouble*)text_matrix.GetArrayInterface();
//获取名称为text_matrix_inv的逆矩阵
g.GetVar("text_matrix_inv",&text_matrix_inv);
xMatrixDouble *pd_inv=(xMatrixDouble*)text_matrix_inv.GetArrayInterface();
//打印矩阵
cout<<"原矩阵:/n";
for (int i=0;i<xd.GetR();i++)
{
for (int j=0;j<xd.GetC();j++)
{
cout<<xd.GetRealAt(i,j)<<" ";
}
cout<<endl;
}
cout<<"从matlab中读取的矩阵:/n";
for ( i=0;i<pd->GetR();i++)
{
for (int j=0;j<pd->GetC();j++)
{
cout<<pd->GetRealAt(i,j)<<" ";
}
cout<<endl;
}
cout<<"从matlab中读取的逆矩阵:/n";
for ( i=0;i<pd_inv->GetR();i++)
{
for (int j=0;j<pd_inv->GetC();j++)
{
cout<<pd_inv->GetRealAt(i,j)<<" ";
}
cout<<endl;
}
//关闭引擎
g.CloseEngine();
}
}
顺便把c++读取matlab矩阵的代码也贴出来吧
#include <iostream.h>
#include "xMatrix.h"
#include "MatlabEngine.h"
void main()
{
printf("matlab&c++ /n /
visualsan@yahoo.cn NUAA/
2011/n------------------------/n");
//matlab 引擎
CMatlabEngine g;
//打开
cout<<"Open Matlab Engine..../n";
if( g.OpenEngine() )
{
//1.从matlab中获取一个5X5的随机矩阵
char tmp[200];
//调用rand生成随机矩阵
strcpy(tmp,"rang_natrix=rand(5);");
g.EvalString(tmp);
mxWrap rang_natrix;
//获取名称为rang_natrix的矩阵
g.GetVar("rang_natrix",&rang_natrix);
xMatrixDouble *pd=(xMatrixDouble*)rang_natrix.GetArrayInterface();
//打印矩阵
for (int i=0;i<pd->GetR();i++)
{
for (int j=0;j<pd->GetC();j++)
{
cout<<pd->GetRealAt(i,j)<<" ";
}
cout<<endl;
}
//关闭引擎
g.CloseEngine();
}
}
这样基本你需要的操作就都有了。
实际使用的时候基本不用设置,和原来一样编译好就可以用了。命令就是在-gpu 后面对多个GPU号用逗号隔开,比如-gpu 1,2,3,4 就是同时使用1-4共4个GPU,GPU编号可以不连续,或者直接用-gpu all,就是使用所有的GPU。
官方的github里是这样写的
54
正好我也在用顺手截图
55
可以看到输出的log里提示了使用了两个GPU
很多人建议caffe从四个层次来理解:Blob、Layer、Net、Solver,和题主的问题还挺match的
1.Blob
Blob是caffe基本的数据结构,用... 显示全部 »
很多人建议caffe从四个层次来理解:Blob、Layer、Net、Solver,和题主的问题还挺match的
1.Blob
Blob是caffe基本的数据结构,用四维矩阵 Batch×Channel×Height×Weight表示,存储了网络的神经元激活值和网络参数,以及相应的梯度(激活值的残差和dW、db)。其中包含有cpu_data、gpu_data、cpu_diff、gpu_diff、mutable_cpu_data、mutable_gpu_data、mutable_cpu_diff、mutable_gpu_diff这一堆很像的东西,分别表示存储在CPU和GPU上的数据(印象中二者的值好像是会自动同步成一致的),其中带data的里面存储的是激活值和W、b,diff中存储的是残差和dW、db,另外带mutable和不带mutable的一对指针所指的位置是相同的,只是不带mutable的只读,而带mutable的可写。
2.Layer
Layer代表了神经网络中各种各样的层,组合成一个网络。一般一个图像或样本会从数据层中读进来,然后一层一层的往后传。除了数据层比较特殊之外,其余大部分层都包含4个函数:LayerSetUp、Reshape、Forward、Backward。其中LayerSetup用于初始化层,开辟空间,填充初始值什么的。Reshape是对输入值进行维度变换,比如pooling接全连接层的时候要先拉成一个向量再计算。Forward是前向传播,Backward是后向传播。当然对于我这种喜欢偷懒的童鞋一般学习的时候最喜欢看各种层的Backward函数了,最好是对着公式边推导边看,可以有更直观的理解。
那么数据是如何在层之间传递的呢?每一层都会有一个(或多个)Bottom和top,分别存储输入和输出,比如bottom[0]->cpu_data()存输入的神经元激活值,换成top存输出的,换成cpu_diff()存的是激活值的残差,换成gpu是存在GPU上的数据,再带上mutable就可写了,这些是神经元激活值相关的,如果这个层前后有多个输入输出层,就会有bottom[1],比如accuracy_layer就有两个输入,fc8和label。而每层的参数会存在this->blobs_里,一般this->blobs_[0]存W,this->blobs_[1]存b,this->blobs_[0]->cpu_data()存的是W的值,this->blobs_[0]->cpu_diff()存的梯度dW,b和db也类似,然后换成gpu是存在GPU上的数据,再带上mutable就可写了。。(各种变量好多好晕,但愿我说清楚了。。)
哦对了,凡是能在GPU上运算的层都会有名字相同的cpp和cu两个文件,cu文件中运算时基本都调用了cuda核函数,可以在math_function.cu中查看。
3.Net
Net就是把各种层按train_val.prototxt的定义堆叠在一起,首先进行每个层的初始化,然后不断进行Update,每更新一次就进行一次整体的前向传播和反向传播,然后把每层计算得到的梯度计算进去,完成一次更新,这里注意每层在Backward中只是计算dW和db,而W和b的更新是在Net的Update里最后一起更新的。而且在caffe里训练模型的时候一般会有两个Net,一个train一个test。刚开始训练网络时前面的一大堆输出,网络的结构什么的也都是这里输出的。
4.Solver
Solver是按solver.prototxt的参数定义对Net进行训练,首先会初始化一个TrainNet和一个TestNet,然后其中的Step函数会对网络不断进行迭代,主要就是两个步骤反复迭代:①不断利用ComputeUpdateValue计算迭代相关参数,比如计算learning rate,把weight decay加上什么的,②调用Net的Update函数对整个网络进行更新。迭代中的一大堆输出也是在这里输出的,比如当前的loss和learning rate什么的。
综上,为了把整个过程串起来,可以从tools/caffe这个我们最常用的函数入手,训练一个网络然后跟着数据的流动方向看看一个网络是怎么更新的,然后找自己比较感兴趣的地方细看。我本人主要看各种Layer的实现比较多,对其余的部分理解也有限,希望可以一起讨论~
(针对最近大大们头疼的侵权问题,在这里弱弱的加一句:本内容为本人原创,仅授权给CaffeCN使用,如需转载须注明转载来源。(⊙v⊙))
先说结论:一个卷积核是三维的(channel×height×width),每个卷积层有若干卷积核,一个卷积核输出的feature map是二维的,每层输出的feature map数量和卷积核... 显示全部 »
先说结论:一个卷积核是三维的(channel×height×width),每个卷积层有若干卷积核,一个卷积核输出的feature map是二维的,每层输出的feature map数量和卷积核数量相等。
以经典的AlexNet为例,先上图
89
输入图像是227×227×3(注1),conv1的卷积核参数是:
kernel_size: 11
stride: 4
num_output: 96
因此实际的卷积核维度是11×11×3,channel是输入的图像的第三维(如果是后面的卷积层,其卷积核的channel是与之做卷积的输入的feature map的数量),即3,做卷积的时候,是11×11×3的卷积核和输入图像里的11×11×3的块进行卷积,得到一个值,卷积的过程是在height和width上滑动,第三维上不滑动,因此得到的feature map是二维的,公式是
$$\text{FeaSize}=\lfloor\frac{\text{InputSize}-\text{KernelSize}}{\text{Stride}}\rfloor+1$$
(注意这里是下取整,pooling是上取整,二者是反着的)
因此conv1输出的feature map size为$$\lfloor\frac{227-11}{4}\rfloor+1=55$$
输出的feature map数量和卷积核数量相同,为96,因此conv1的输出是55×55×96
后面的层类似,只要注意卷积核的第三维是由输入的feature map的数量决定就可以了,这一点从图上也可以看出来。
最后祝大家春节快乐~
注1:论文里是224×224×3,caffe官网的例子里是227×227×3,这里以官网的例子为例。
(针对最近大大们头疼的侵权问题,在这里弱弱的加一句:本内容为本人原创,仅授权给CaffeCN社区(caffecn.cn)使用,如需转载须注明转载来源。(⊙v⊙))
假设你的batch size是32,你单卡,每次迭代处理的就是32张图像。
你现在换了两卡,并行处理,你实际上每次迭代处理的图像就是64张。
训练速度的提升,体现在每次迭代的loss下降更多,收敛更快。
也就是说,以前可能需要100万次迭代才能收敛... 显示全部 »
假设你的batch size是32,你单卡,每次迭代处理的就是32张图像。
你现在换了两卡,并行处理,你实际上每次迭代处理的图像就是64张。
训练速度的提升,体现在每次迭代的loss下降更多,收敛更快。
也就是说,以前可能需要100万次迭代才能收敛,现在可能50-70万次就可以了。
所以从这个角度说,训练时间缩短了,训练速度提升了。
微软的caffe配置
Caffe环境安装 • timothy 发表了文章 • 5 个评论 • 5676 次浏览 • 2016-04-27 21:15
caffe for window的autoencoder运行问题
框架开发使用 • SongEsther 回复了问题 • 4 人关注 • 4 个回复 • 6272 次浏览 • 2016-08-21 19:45
谁能提供一下caffe在做train()时候的详细流程图,代码看的晕乎乎的
框架开发使用 • 爱在路上 回复了问题 • 15 人关注 • 2 个回复 • 7132 次浏览 • 2016-08-23 09:02
各位大神请看一下跑FCN时出现的*ptr host allocation of size 561259008 failed是内存不足引起的吗?谢谢
回复Caffe开发使用 • antigravity 回复了问题 • 2 人关注 • 1 个回复 • 3728 次浏览 • 2018-12-01 08:28
andrio中集成caffe2执行runne函数一直卡阻,没有响应
回复综合问题 • fa_ge 发起了问题 • 1 人关注 • 0 个回复 • 1353 次浏览 • 2018-09-03 11:34
caffe-windows下MATLAB 环境配置成功,demo时invalid Net handle
回复Caffe环境安装 • Shewhart 回复了问题 • 9 人关注 • 7 个回复 • 6960 次浏览 • 2018-09-01 19:56
caffe怎样实现在单gpu上开多线程,提高gpu的利用率
回复大规模优化 • mhaoyang 回复了问题 • 5 人关注 • 3 个回复 • 5248 次浏览 • 2018-06-07 13:04
caffe生成配置文件prototxt中的num_output怎么定义值
回复参数调节 • alex68 回复了问题 • 2 人关注 • 1 个回复 • 1953 次浏览 • 2018-06-01 08:25
caffe runtest hdf5=1.8.16和python3.6的问题
回复Caffe环境安装 • alexliu 发起了问题 • 1 人关注 • 0 个回复 • 2480 次浏览 • 2018-05-29 19:36
caffe运行中断: data_transformer.cpp:Check failed
回复人脸识别 • lishanlu136 回复了问题 • 3 人关注 • 2 个回复 • 3564 次浏览 • 2018-05-23 11:37
请问caffe-train过程中每隔一个test_interval测试一下,那用于测试的数据是从哪来的呢
回复参数调节 • zhubeniii 发起了问题 • 1 人关注 • 0 个回复 • 1991 次浏览 • 2018-05-12 20:00
如何用caffe提取的中间层特征,如何训练SVM分类器,能给个实例吗,新手
回复图像分类 • 辣辣不是吃货 发起了问题 • 1 人关注 • 0 个回复 • 1862 次浏览 • 2018-05-11 15:25
请问BN层是什么?微软分支的caffe编译出来不支持,可以添加吗?谢谢
回复Caffe开发使用 • mhaoyang 回复了问题 • 3 人关注 • 2 个回复 • 2599 次浏览 • 2018-05-11 13:55
在caffe中怎么实现cnn+svm呀,有示例代码吗?
回复大规模优化 • mhaoyang 回复了问题 • 7 人关注 • 4 个回复 • 10507 次浏览 • 2018-05-09 19:17
编译好了pycaffe后编译mattest的问题
回复综合问题 • BlueSkyAndSea 发起了问题 • 1 人关注 • 0 个回复 • 1550 次浏览 • 2018-05-09 16:49
微软的caffe配置
Caffe环境安装 • timothy 发表了文章 • 5 个评论 • 5676 次浏览 • 2016-04-27 21:15