16.11.29更新


1.添加beta23版本安装出现的问题。

最近安装beta23版本,出现vl_compilenn()函数运行时报错如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
错误使用 mex
roipooling_cpu.cpp
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(120) : warning C4244:
“初始化”: 从“const double”转换到“float”,可能丢失数据
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(324): 参见对正在编
译的函数 模板 实例化“void roipooling_forward_cpu<type,acc_sum<type>>(type *,const type
*,size_t,size_t,size_t,size_t,const type *,size_t,const int [],const double [])”的引用
with
[
type=float
]
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(320): 编译类 模板
成员函数“vl::ErrorCode vl::impl::roipooling_average<dev,type>::forward(type *,const type
*,size_t,size_t,size_t,size_t,const type *,size_t,const int [],const double [])”时
with
[
dev=VLDT_CPU,
type=float
]
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(350): 参见对正在编
译的类 模板 实例化“vl::impl::roipooling_average<dev,type>”的引用
with
[
dev=VLDT_CPU,
type=float
]
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(121) : warning C4244:
“初始化”: 从“const double”转换到“float”,可能丢失数据
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(122) : warning C4244:
“初始化”: 从“const double”转换到“float”,可能丢失数据
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(123) : warning C4244:
“初始化”: 从“const double”转换到“float”,可能丢失数据
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(128) : error C3861:
round”: 找不到标识符
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(129) : error C3861:
round”: 找不到标识符
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(130) : error C3861:
round”: 找不到标识符
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(131) : error C3861:
round”: 找不到标识符
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(167) : warning C4267:
“初始化”: 从“size_t”转换到“const int”,可能丢失数据
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(208) : warning C4244:
“初始化”: 从“const double”转换到“float”,可能丢失数据
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(342): 参见对正在编
译的函数 模板 实例化“void roipooling_backward_cpu<type,acc_sum<type>>(type *,const type
*,size_t,size_t,size_t,size_t,const type *,size_t,const type *,const int [],const double
[])”的引用
with
[
type=float
]
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(337): 编译类 模板
成员函数“vl::ErrorCode vl::impl::roipooling_average<dev,type>::backward(type *,const type
*,size_t,size_t,size_t,size_t,const type *,size_t,const type *,const int [],const double
[])”时
with
[
dev=VLDT_CPU,
type=float
]
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(209) : warning C4244:
“初始化”: 从“const double”转换到“float”,可能丢失数据
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(210) : warning C4244:
“初始化”: 从“const double”转换到“float”,可能丢失数据
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(211) : warning C4244:
“初始化”: 从“const double”转换到“float”,可能丢失数据
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(216) : error C3861:
round”: 找不到标识符
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(217) : error C3861:
round”: 找不到标识符
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(218) : error C3861:
round”: 找不到标识符
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(219) : error C3861:
round”: 找不到标识符
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(227) : warning C4244:
“初始化”: 从“double”转换到“const float”,可能丢失数据
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(228) : warning C4244:
“初始化”: 从“double”转换到“const float”,可能丢失数据
E:\postgraduate\project\Machine Learning\Deep
Learning\CNN\matconvnet-1.0-beta23\matlab\src\bits\impl\roipooling_cpu.cpp(250) : warning C4267:
“初始化”: 从“size_t”转换到“const int”,可能丢失数据
出错 vl_compilenn>mex_compile (line 529)
mex(mopts{:}) ;
出错 vl_compilenn (line 490)
mex_compile(opts, srcs{i}, objfile, flags.mexcc) ;
出错 compile (line 2)
vl_compilenn;

解决方案是在matconvnet-1.0-beta23\matlab\src\bits\impl文件夹下的roipooling_cpu.cpp文件中添加如下代码:

1
2
3
4
5
double round(double r)
{
return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}

对比一下之前的cpp文件,添加后前几行代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// @author Abishek Dutta
// @author Andrea Vedaldi
/*
Copyright (C) 2016 Hakan Bilen, Abishek Dutta, and Andrea Vedaldi.
All rights reserved.
This file is part of the VLFeat library and is made available under
the terms of the BSD license (see the COPYING file).
*/
#include "matrix.h"
#include "../data.hpp"
#include "roipooling.hpp"
#include <limits>
#include <algorithm>
#include <cmath>
using std::max ;
using std::min ;
/* ---------------------------------------------------------------- */
/* max roipooling helper */
/* ---------------------------------------------------------------- */
/*************16.11.29添加*******************/
// @Frank
// from https://github.com/vlfeat/matconvnet/issues/722
double round(double r)
{
return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}
/*************16.11.29添加*******************/
template <typename type>
struct acc_max
// 以下代码省略

博客原文

MatConvNet是Matlab下用于机器视觉的一个工具包,主要应用是CNN网络,当然其他的网络也涉及到了。MatConvNet简洁、高效,可以用于图片分类、分割和人脸识别等等深度学习的功能。具体的可以参见官网的介绍。

在搭建环境的过程中,发现如今网上对其的资源不太多,所以在这做一个总结。以beta22版本为例。

过程分为下面几个步骤:
1.MatConvNet的下载
2.GPU模式的使用
3.测试

1.MatConvNet的下载

在其官网的页面进行下载,解压到适当的位置。

运行其中matconvnet-1.0-beta22\examples\vggfaces路径下的cnn_vgg_faces.m文件,会出现下面的结果,那么说明已经可以使用了。在运行前最好把其中要下载的一些内容给放到对应的文件夹下,这样可以节省一点等待的时间。

matconvnet-installation-in-windows-system-01

2.GPU模式的使用

官网的这个页面中,提到了搭建GPU的方式。

首先,安装CUDA,在这个页面有下载。记得下载和自己系统以及显卡支持的CUDA。

接下来,要下载cuDNN(The NVIDIA CUDA Deep Neural Network library)。cuDNN是用于GPU加速的一个库函数。在这个页面有下载。

然后把解压好的cuDNN放在合适的文件夹下,建议在MatConvNet下建立local文件夹,同时把cuDNN文件夹中bin文件夹下的cudnn64_5.dll文件复制到matconvnet-1.0-beta22\matlab\mex文件夹下。

最后,在MatConvNet文件夹下建立compileGPU.m文件,其中内容如下。记得把对应的路径给改成自己电脑中的路径。

1
2
3
4
5
6
7
addpath matlab;
%% with cudnn
vl_compilenn('enableGpu', true, ...
'cudaRoot', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0', ... % CUDA的安装路径
'cudaMethod', 'nvcc', 'enableCudnn', 'true', ...
'cudnnRoot', 'E:\postgraduate\project\Machine Learning\Deep Learning\CNN\matconvnet-1.0-beta22\local\cudnn'); % cuDNN的路径

出现下面图片中类似的结果,就代表成功了。

matconvnet-installation-in-windows-system-02

4.测试

还是根据官网的这个页面,在命令行窗口输入vl_testnn命令,测试非GPU模式,会出现下面的内容。

matconvnet-installation-in-windows-system-03

接下来测试GPU模式,在命令行窗口输入vl_testnn('gpu', true),会有类似上面的内容出现。这就是成功了,GPU模式下的速度提示还是很明显的,一般都会有十倍以上。

matconvnet-installation-in-windows-system-05

到此,MatConvNet的安装就结束了。

同时,把我在安装过程中遇到的一个问题的解决方式给写一下。在安装cuDNN的时候,可能会遇到如下的错Error using mex nvcc fatal : Unsupported gpu architecture 'compute_21',其中21可以为其他不能被10整除的数字。这个时候可以把matconvnet-1.0-beta22\matlab下的vl_compilenn.m文件中的732行的代码中”%s”改为向下取10的整数倍。

比如,原代码为

1
2
3
cudaArch = ...
sprintf('-gencode=arch=compute_%s,code=\\\&amp;quot;sm_%s,compute_%s\\\&amp;quot; ', ...
arch_code, arch_code, arch_code) ;

可以改为

1
2
3
cudaArch = ...
sprintf('-gencode=arch=compute_20,code=\\\&amp;quot;sm_20,compute_20\\\&amp;quot; ', ...
arch_code, arch_code, arch_code) ;

这样,经常遇到的问题就能解决了。