之前一直是在CPU上跑fast rcnn,今天重新在GPU上又遇到了一些新的问题,记录一下。
problem:找不到vl_rootnn\vl_simplenn_tidy\vl_imreadjpeg,或者说是试图将这些脚本语言作为函数执行
reason:这些都是其他语言编译过来的,原始的.m文件中是一个没有任何命令的脚本语言,所以需要将其编译文件
solution:
第一次:matconvnet\matlab\mex添加到matlab工作空间中,然后重启matlab就可以.
第二次:在代码首行加上addpath(matconvnet\matlab)
problem:vl_nnroipool\vl_ataccum 找不到
reason:fast rcnn函数较新,而matconvnet-18版本太老,缺少这些函数
solution:将自己20版本的matconvnet\matlab下所有文件下对应的含有该关键字的文件复制到18版本对应的文件中
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含有每个卷积层的卷积和大小、步长、填充等参数
problem:服务器有两块显卡,同学在用第二块显卡,自己只能用第一块显卡,不知道怎么编号
solution:
用CPU:opts.train.gpus=[]
用GPU:opts.train.gpus=[1,2]
GPU 是从1开始编号,后期会检查要用到的GPU数量以及对应的索引值
matlab中以“+”“@”开头的文件无法添加到路径中,可添加其包含特殊符号的上级目录。
有的函数会在多个文件中出现,每次添加路径的时候尽量只添加该项目的文件夹,避免matlab在寻找子函数时定位到了其他文件夹中。
matlab的面向对象
matlab 也可以定义类(classdef),也有继承(<)有类的属(properties),仅供类使用的私有成员,类方法(methods…end)
https://blog.csdn.net/beechina/article/details/50933860
对matlab的类定义和效率进行了说明
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是锦上添花的。
简直了不论做什么事情原版最重要!!!特别是配置的这种事情,多花时间研读官网的说法!!!博客仅作为辅助。
理解很重要!!!