matconvnet CPU移植到GPU遇到的问题

之前一直是在CPU上跑fast rcnn,今天重新在GPU上又遇到了一些新的问题,记录一下。

1.

problem:找不到vl_rootnn\vl_simplenn_tidy\vl_imreadjpeg,或者说是试图将这些脚本语言作为函数执行

reason:这些都是其他语言编译过来的,原始的.m文件中是一个没有任何命令的脚本语言,所以需要将其编译文件

solution:

第一次:matconvnet\matlab\mex添加到matlab工作空间中,然后重启matlab就可以.

第二次:在代码首行加上addpath(matconvnet\matlab)

2.

problem:vl_nnroipool\vl_ataccum 找不到

reason:fast rcnn函数较新,而matconvnet-18版本太老,缺少这些函数

solution:将自己20版本的matconvnet\matlab下所有文件下对应的含有该关键字的文件复制到18版本对应的文件中

3.

problem:dagnn.DagNN eval()输入参数太多

reason:自己的PC是基于matconvnet-20的,而服务器是18的,所以eval()函数有所不同

从输入参数上看,

18:eval(obj,inputs,derOutputs)

20:eval(obj,inputs,derOutputs,varargin)

这里再说明一下,原始调用的命令为net.eval(inputs,derOutputs)  ,之所以在函数定义的时候obj变量中的参数是从对象net中获取的。

从函数内部变量来看

18:没有变量obj.ignoreAverage

20:有变量obj.ignoreAverage

solution:用20eval()替换18的eval(),而且因为多输入的opts.holdOn输入为false,eval()文件中也默认是0,所以不输入该参数了,ignoreAverage变量是在网络结构初始化时net.layers(41).block结构体中的一个变量,因为这个变量始终为0,所以函数中凡是遇到该变量,统一注释掉。

block含有每个卷积层的卷积和大小、步长、填充等参数

4.

problem:服务器有两块显卡,同学在用第二块显卡,自己只能用第一块显卡,不知道怎么编号

solution:

用CPU:opts.train.gpus=[]

用GPU:opts.train.gpus=[1,2]

GPU 是从1开始编号,后期会检查要用到的GPU数量以及对应的索引值

5.

matlab中以“+”“@”开头的文件无法添加到路径中,可添加其包含特殊符号的上级目录。

有的函数会在多个文件中出现,每次添加路径的时候尽量只添加该项目的文件夹,避免matlab在寻找子函数时定位到了其他文件夹中。

6.

matlab的面向对象

matlab 也可以定义类(classdef),也有继承(<)有类的属(properties),仅供类使用的私有成员,类方法(methods…end)

https://blog.csdn.net/beechina/article/details/50933860

对matlab的类定义和效率进行了说明

7.

problem:错误使用vl_nnconv An input is not a numeric array(or GPU support not compiled)

matconvnet官方文档说vl_nn...函数支持matlab矩阵也支持gpu array,所以觉得是GPU版本的编译有问题

https://www.cnblogs.com/qq552048250/p/7857122.html

即使跑官方的cnn_mnist也是会出现问题

说需要重新编译

 https://github.com/ignaciorlando/red-lesion-detection/issues/4

vl_compilenn('EnableGpu',true);

这个问题目前还没有解决,现在还在用CPU在跑

在GPU上替换了eval文件,同时检查了vl_nnconv的路径确实是服务器上的,不是自己硬盘上的。

分析了一下,是因为自己将自己在CPU跑的编译文件添加到了服务器上,所以CPU版本和GPU版本的编译文件是混的,在服务器上用GPU上跑的时候就容易出问题,现在唯一的解决办法就是重新在服务器上编译最新的GPU版本的matconvnet。

师兄说可以在其他目录下编译一下,彼此之间也不互相影响。


启发:

编译什么的一定要看官方文档!!!

这个真的很重要

之前自己编CPU的时候和容易

在GPU的时候一直参考的是博客,所有的有GPU版本编译的博客,毫无例外地告诉我要用到cudnn,一本正经地进行一些文件的替换,但是如果去看官网的话就会明白,在你matlab版本和你的cuda对应的时候cuda就可以,如果不对应的话是必须要用到cudnn的。所有说cudnn不是必须的。这就是小徐同学说的cudnn是锦上添花的。

简直了不论做什么事情原版最重要!!!特别是配置的这种事情,多花时间研读官网的说法!!!博客仅作为辅助。

理解很重要!!!







你可能感兴趣的:(matlab,深度学习)