编译MatCaffe

转自: http://blog.csdn.net/ws_20100/article/details/50525879

使用如下命令编译MatCaffe

  1. make all matcaffe
  • 1

之后,你可以用以下命令测试MatCaffe:

  1. make mattest
  • 1

如果你在运行上面命令时,遇到如下错误:libstdc++.so.6 version ‘GLIBCXX_3.4.15’ not found,说明你的Matlab库不匹配。你需要在启动Matlab之前运行如下命令:

  1. export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:/usr/local/cuda/lib64
  2. export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
  • 1
  • 2

在Caffe根目录启动Matlab之后需要增加路径:

  1. addpath ./matlab
  • 1

你可以使用savepath来保存Matlab搜索路径,这样下次就不用再添加路径了。


使用MatCaffe

MatCaffe 和 PyCaffe 的使用方法很相似。

下面将用一个例子来解释MatCaffe的具体使用细节,假设你已经下载了BVLC CaffeNet,并且在caffe根目录启动matlab。

  1. model = './models/bvlc_reference_caffenet/deploy.prototxt';
  2. weights = './models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel';
  • 1
  • 2
  • 3

1.设置模式和设备

模式和设备的设置必须在创建一个net或solver之前。

使用CPU:

  1. caffe.set_mode_cpu();
  • 1

使用GPU并指定gpu_id:

  1. caffe.set_mode_gpu();
  2. caffe.set_device(gpu_id);
  • 1
  • 2

2.创建一个网络并访问它的layers和blobs

1.创建网络

创建一个网络:

  1. net = caffe.Net(model, weights, 'test'); % create net and load weights
  • 1

或者

  1. net = caffe.Net(model, 'test'); % create net but not load weights
  2. net.copy_from(weights); % load weights
  • 1
  • 2

它可以创建一个如下的net对象:

  1. Net with properties:
  2. layer_vec: [1x23 caffe.Layer]
  3. blob_vec: [1x15 caffe.Blob]
  4. inputs: {'data'}
  5. outputs: {'prob'}
  6. name2layer_index: [23x1 containers.Map]
  7. name2blob_index: [15x1 containers.Map]
  8. layer_names: {23x1 cell}
  9. blob_names: {15x1 cell}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

两个containers.Map对象可以通过layer或者blob的名称找到对应的索引。

2.访问blob

你可以访问网络中的每一个blob,将data的blob填充为全一:

  1. net.blobs('data').set_data(ones(net.blobs('data').shape));
  • 1

data的blob中数值全部乘以10:

  1. net.blobs('data').set_data(net.blobs('data').get_data() * 10);
  • 1

注意:因为Matlab是以1作为起始单元,且以列为主,在Matlab中使用四维blob为[width, height, channels, num],且width是最快的维度,而且要在BGR通道。而且Caffe使用单精度浮点型数据。如果你的数据不是浮点型的,set_data将会自动转换为single。

3.访问layer

你也可以访问网络的每一层,以便你作一些网络调整。例如把conv1参数乘以10:

  1. net.params('conv1', 1).set_data(net.params('conv1', 1).get_data() * 10); % set weights
  2. net.params('conv1', 2).set_data(net.params('conv1', 2).get_data() * 10); % set bias
  • 1
  • 2

你也可以如下代码:

  1. net.layers('conv1').params(1).set_data(net.layers('conv1').params(1).get_data() * 10);
  2. net.layers('conv1').params(2).set_data(net.layers('conv1').params(2).get_data() * 10);
  • 1
  • 2

4.保存网络

你仅仅需要如下代码保存网络:

  1. net.save('my_net.caffemodel');
  • 1

5.获得一层的类型(string)

  1. layer_type = net.layers('conv1').type;
  • 1

3.前向和后向计算

前向和后向计算可以使用net.forward或者net.forward_prefilled实现。函数net.forward将一个包含输入blob(s)的cell数组作为输入,并输出一个包含输出blob(s)的cell数组。函数net.forward_prefilled将使用输入blob(s)中的已有数据进行计算,没有输入数据,没有输出数据。

在通过一些方法(如:data = rand(net.blobs('data').shape);)产生输入数据后,你可以运行:

  1. res = net.forward({data});
  2. prob = res{1};
  • 1
  • 2

或者

  1. net.blobs('data').set_data(data);
  2. net.forward_prefilled();
  3. prob = net.blobs('prob').get_data();
  • 1
  • 2
  • 3

后向计算使用net.backward或者net.backward_prefilled,并且把get_dataset_data替换为get_diffset_diff。在通过一些方法(例如prob_diff = rand(net.blobs('prob').shape);)产生输出blobs的梯度后,你可以运行:

  1. res = net.backward({prob_diff});
  2. data_diff = res{1};
  • 1
  • 2

或者

  1. net.blobs('prob').set_diff(prob_diff);
  2. net.backward_prefilled();
  3. data_diff = net.blobs('data').get_diff();
  • 1
  • 2
  • 3

然而,如上的后向计算并不能得到正确的结果,因为Caffe默认网络不需要后向计算。为了获取正确的后向计算结果,你需要在你的网络prototxt文件中设置force_backward: true

在完成前向和后向计算之后,你可以获得中间blobs的data和diff。例如,你可以在前向计算后获取pool5的特征。

4.Reshape

假设你想要运行1幅图像,而不是10幅时:

  1. net.blobs('data').reshape([227 227 3 1]); % reshape blob 'data'
  2. net.reshape();
  • 1
  • 2

然后,整个网络就reshape了,此时net.blobs('prob').shape应该是[1000 1];

5.训练网络

假设你按照ImageNET Tutorial的方法创建了训练lmdb和验证lmdb,产生一个solver并且在ILSVRC 2012 分类数据集上训练:

  1. solver = caffe.Solver('./models/bvlc_reference_caffenet/solver.prototxt');
  • 1

这样可以创建一个solver对象:

  1. Solver with properties:
  2. net: [1x1 caffe.Net]
  3. test_nets: [1x1 caffe.Net]
  • 1
  • 2
  • 3
  • 4

训练代码:

  1. solver.solve();
  • 1

如果只想训练迭代1000次:

  1. solver.step(1000);
  • 1

来获取迭代数量:

  1. iter = solver.iter();
  • 1

来获取这个网络:

  1. train_net = solver.net;
  2. test_net = solver.test_nets(1);
  • 1
  • 2

假设从一个snapshot中恢复网络训练:

  1. solver.restore('your_snapshot.solverstate');
  • 1

6.输入和输出

caffe.io类提供了基本的输入函数load_imageread_mean。例如,读取ILSVRC 2012 mean文件(假设你已经通过运行./data/ilsvrc12/get_ilsvrc_aux.sh下载imagenet例程辅助文件)

  1. mean_data = caffe.io.read_mean('./data/ilsvrc12/imagenet_mean.binaryproto');
  • 1

为了读取Caffe例程图片,并且resize到[width, height],且假设width = 256; height = 256;

  1. im_data = caffe.io.load_image('./examples/images/cat.jpg');
  2. im_data = imresize(im_data, [width, height]); % resize using Matlab's imresize
  • 1
  • 2

注意:width是最快的维度,通道为BGR,与Matlab存取图片的一般方式不一样。如果你不想要使用caffe.io.load_image,且想自己导入一幅图片:

  1. im_data = imread('./examples/images/cat.jpg'); % read image
  2. im_data = im_data(:, :, [3, 2, 1]); % convert from RGB to BGR
  3. im_data = permute(im_data, [2, 1, 3]); % permute width and height
  4. im_data = single(im_data); % convert to single precision
  • 1
  • 2
  • 3
  • 4

你也可以看一下caffe/matlab/demo/classification_demo.m文件,了解如何将输入图片crop成多个输入块。

你可以查看caffe/matlab/hdf5creation,了解如何通过Matlab读和写HDF5数据。但不提供额外的数据输出函数,因为在Matlab本身已经具有了强大的功能。

7.清除nets和solvers

调用caffe.reset_all()来清理你所创建的所有的solvers,和stand-alone nets。

(转)如何使用caffe的MATLAB接口的更多相关文章

  1. ubuntu下 编译Caffe的Matlab接口

    一般情况下不愿意使用Caffe的Matlab接口,总觉得Linux版的Matlab很难配置,但是现在搞目标检测,得到的源码是使用的Caffe的Matlab接口,只能硬着头皮上了. (1)修改caffe ...

  2. caffe的Matlab接口安装

    参考博文:http://blog.csdn.net/thystar/article/details/50720691 0. Caffe安装及Matlab安装 1. Caffe中matcaffe配置 c ...

  3. Windows下调用caffe的matlab接口

    一.编译caffe的matlab接口 在我的这篇博客windows-caffe配置已经说了怎么编译了,这里就略过了. 编译成功后,会得到如下图所示文件: matlab接口就在matcaffe文件夹里. ...

  4. 学习笔记之 初试Caffe,Matlab接口提取feature

    Caffe 提供了matlab接口,可以用于提取图像的feature.

  5. ubuntu14.04&matlab2015b 测试caffe的Matlab接口

    Step1: 修改caffe-master中的Makefile.config 提示:可以到文件中直接“ctrl+f”,键入相应大写字母即可查找到相应位置. Step2:编译接口.如果之前编译caffe ...

  6. Ubuntu caffe 测试matlab接口

    这是17年8月份新增的: make matcaffe error 255解决:在Makefile里面,大约第410行那一句话CXXFLAGS += -MMD -MP下面添加CXXFLAGS += -s ...

  7. caffe的matlab接口一览表

    blob 简述 方法: shape reshape get_diff set_diff 私有方法: check_and_preprocess_shape check_and_preprocess_da ...

  8. 【caffe-Windows】微软官方caffe之matlab接口配置,以及安装caffe的注意事项

    1.在此之前,记录一下之前的错误,在参考博客[caffe-Windows]caffe+VS2013+Windows+GPU配置+cifar使用进行caffe的安装时,其中的一些步骤可以不做,具体见下图 ...

  9. win10编译caffe调用matlab接口

    参考 https://www.cnblogs.com/njust-ycc/p/5776286.html https://www.cnblogs.com/heately/p/7922521.html

随机推荐

  1. Codeforces 1110D Jongmah (DP)

    题意:你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组? 解析:首先我们容易发现,我们 ...

  2. c# 类的初步认识

    这里我们把类分为三种: String类(字符串类):Math类(数学类):DateTime类(时间日期类). 在使用类时注意  在输入的过程中代码前面会出现一些符号(紫色立方体代表方法,函数和黑色扳手 ...

  3. Spring第五天

    1. [简答题]:简述一下hibernate和spring框架的整合步骤: 答: 1.加入hibernate jar包 2.编写持久化类 3.添加Hibernate的配置文件:hibernate.cf ...

  4. Python 黑客 004 用Python构建一个SSH僵尸网络 01 简介

    用Python构建一个SSH僵尸网络 01 简介 一. 构建一个SSH僵尸网络的流程图: Created with Raphaël 2.1.0手动操作,实现通过SSH连接目标服务器(手动)用 Pexp ...

  5. 算法Sedgewick第四版-第1章基础-005一封装输入(可以文件,jar包里的文件或网址)

    1. package algorithms.util; /*********************************************************************** ...

  6. niginx隐藏入口文件index.php

    location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php/$ last; break; } }

  7. Hive安装及配置

    第一步:下载hive并解压 tar zxvf hive-0.8.1-bin.tar.gz 重命名: mv hive-0.8.1-bin hive 给权限:chown hadoop:hadoop hiv ...

  8. PAT甲 1095 解码PAT准考证/1153 Decode Registration Card of PAT(优化技巧)

    1095 解码PAT准考证/1153 Decode Registration Card of PAT(25 分) PAT 准考证号由 4 部分组成: 第 1 位是级别,即 T 代表顶级:A 代表甲级: ...

  9. preventDefault()对象

    preventDefault() 方法 Event 对象 定义和用法 取消事件的默认动作. 语法 event.preventDefault() 说明 该方法将通知 Web 浏览器不要执行与事件关联的默 ...

  10. 【C#】如何打开Model Browser(实体数据模型浏览器)

    Visual Studio 2017 如何打开Model Browser(实体数据模型浏览器) 2017-10-11 十有三 2 浏览:4956 开发工具 Visual Studio 做个笔记,记录下 ...