Ubuntu16.04+CUDA8.0+cudnn v5.1+opencv3.1(2.4.10)+caffe+GTX 1080Ti 机器配置记录及tsn训练与测试记录

来源:互联网 发布:张良知乎 编辑:程序博客网 时间:2024/05/22 03:07
从暑假就开始装环境,一路踩坑,终于忍不了了决定在博客上记录一下,方便自己查看,也希望能帮到遇到同样问题的朋友。 

2017.11.23

  1. caffe又不能训练了,怀疑是之前为了提取光流把opencv版本从3.1降到了2.4导致的,于是重新下载并编译了opencv3.1,但是仍然报错:

    E1123 09:29:26.794917 4138 common.cpp:114]Cannot create Cublas handle. Cublas won't be available.

    F112311:12:25.336674 15624 cudnn_conv_layer.cpp:53] Check failed: status== CUDNN_STATUS_SUCCESS (4 vs. 0)CUDNN_STATUS_INTERNAL_ERROR

    百度说是显卡驱动的问题应该重装(http://blog.csdn.net/TaylorMei/article/details/77968197?locationNum=10&fps=1),但鉴于和驱动有关的东西更改以后系统会崩,而且之前可以测试mnistfasterrcnn的时候就是这个驱动版本,于是打算把caffe删掉重新下载重新编译,重新下载的压缩文件同时保存在mypassport

  2. 但是删掉caffegithub新下载的重新编译,到mnist测试时还是报一样的错误。

  3. 用系统自带的软件和更新把显卡驱动改成了381.22,之前是384.98,结果cuda也不能用了

  4. 卸载了驱动和cudahttp://blog.csdn.net/u012436149/article/details/53163346),重新安装了一遍,版本和之前一样3848.0,结果编译caffe还是runtest能过但一测试mnist就报错,错误同上

  5. 采用tsn(https://github.com/yjxiong/temporal-segment-networks#start-training)下的caffeaction编译(才知道这也是个caffe),把系统默认的opencv改成了2.4.10,编译通过,但run test 出现了如下错误:

    E1124 09:02:54.143685 3694 common.cpp:138]Cannot create Cublas handle. Cublas won't be available.

    F1124 09:02:54.165396 3694 common.cpp:201] Checkfailed: status == CUBLAS_STATUS_SUCCESS (1 vs. 0)CUBLAS_STATUS_NOT_INITIALIZED

  6. 这回test都不通过了,同样还是cublas的问题,此时光流还可以提取,于是计划先提取一些光流。


2017.11.24

采用http://blog.csdn.net/lenbow/article/details/51683783的方法卸载掉384.98,重装375.66(下载参考这篇https://zhuanlan.zhihu.com/p/27917556最后),安装驱动的.run文件时需要把系统默认语言改成英文,否则中文会显示成实心的菱形。按照此方法成功安装了375.66,直接用apt-get安装不知道为什么还会是384

然后卸载掉cuda再重装,重新按照教程走一遍直到编译,最后训练mnist数据集也终于能成功了!看来果然是显卡驱动版本的问题!


但是在训练tsn网络时还是有[libprotobuf ERRORgoogle/protobuf/text_format.cc:274] Error parsing text-formatcaffe.NetParameter: 19:12: Message type "caffe.LayerParameter" hasno field named "bn_param".

F1124 19:10:18.841284 32660upgrade_proto.cpp:88] Check failed:ReadProtoFromTextFile(param_file, param) Failed to parseNetParameter file:models/ucf101/tsn_bn_inception_rgb_deploy.prototxt这样的问题,已经更改了~/.bashrcPython的路径,但还是有这个问题


重启电脑以后发现可以测试了!第二天过来看发现测试split1 rgb准确率是86.02%竟然比作者论文里的还要高一些!后来看作者说是因为单个模式的测试不够稳定,需要把rgbflowwarpedflow结合在一起看


2017.11.29测试split1 flow结果:

Accuracy 87.63%


real 44m22.896s

user 38m20.592s

sys 4m4.524s



2017.12.12

开机以后在登录界面显示分辨率不正常,输密码以后显示系统出现问题,闪了一下又到了登录界面,nvidia-smi看了一下发现果然又是显卡的问题,于是按照之前的操作重新装了一遍375.66,现在又能用了,真的太不稳定了!ctrl+alt+F1的时候因为我系统语言是中文,好多提示又显示成了菱形图案,于是还更改了一下系统语言,决定以后就用英文版了,想想可能过阵子又得重装驱动吧。。。还好我安装包一直放在home期间重装驱动的时候也报了一个错“you appear to be running an X server”上一次安装驱动出现这个问题我记得是因为我没进tyy1,但这次进了依然有,解决办法:http://blog.csdn.net/eclipse_c/article/details/23302061。然后安装好驱动再sudo service start lightdm以后就回到了图形桌面,但关机的时候出现了“failed to start load kernel modules”,上一次装完也有这个问题,但因为没有影响使用所以就忽略了,现在想想估计就是这个原因导致我用着用着突然又崩了,于是用http://blog.csdn.net/hello_java_android/article/details/54091293的方法试了一下,目前还没有再次看到那个failed提示。


2017.12.15

昨天关机的时候发现还是有那个failed的提示,大概是之前的设置没有用吧,这个问题暂时还没解决,不是每次关机都出现,只有用的时间长一点再关机才会出现。

昨天想用手上ntu的数据微调kinetic预训练的网络,结果失败了,loss一直在4.6不收敛,后来试了一下微调ImageNet预训练的网络就成功了,前面不成功的原因可能是prototxt不匹配的缘故,应该要按照给出的deploy文件添加输入输出层自己写一个。附图训练的结果:


今天用这个训练好的模型在做测试,结果出来以后再来贴上。

结果出现了F1215 10:05:11.961401  9572 blob.cpp:481] Check failed: ShapeEquals(proto) shape mismatch (reshape not set)的错误,目前还在找原因。

查看了很多博客的解决方法,大部分情况都是在fine tune也就是训练的时候就报错了,而我这个有些不同,是训练没问题,测试才报错,于是用UCF101按照作者的步骤按部就班了一遍,发现也还在这个错误,无法测试,抱着试一试的心态,把训练的prototxt最后和动作类别有关的层重新命名了,训练的结果比之前差一点,如图:


然后相应的deploy的prototxt最后的层也重新命名,再测试就真的不报错了!

我这个训练速度也很快,作者训练UCF101都要40分钟,他还是4个GPU,应该是因为我把batch_size从32改成了128的缘故。但现在来看测试好像有些费时,还没有测完。

结果到后面就报了一个这样的错误:

video S017C001P020R002A054_rgb done
video S017C001P007R002A020_rgb done
video S017C001P009R002A004_rgb done
video S017C001P016R001A049_rgb done
video S017C001P020R001A033_rgb done
Traceback (most recent call last):
  File "tools/eval_net.py", line 125, in <module>
    cf = confusion_matrix(video_labels, video_pred).astype(float)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/metrics/classification.py", line 255, in confusion_matrix
    labels = unique_labels(y_true, y_pred)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/utils/multiclass.py", line 103, in unique_labels
    raise ValueError("Mix of label input types (string and number)")
ValueError: Mix of label input types (string and number)
dl526@dl526:~/temporal-segment-networks$ python tools/eval_net.py ntu 1 rgb /media/dl526/BE4AAB8D4AAB414F/nturgbd_rgb-extract/ models/ntu/tsn_bn_inception_rgb_deploy.prototxt models/ntu_split1_tsn_rgb_bn_inception_iter_3500.caffemodel --num_worker 1 --save_scores SCORE_FILE_ntu_rgb

说是label的类型混合了字符和数字,这就很奇怪了

搞了一整天终于发现了错误,原来是我自己写的parse_ntu_splits()函数里面返回的label类型是str,而作者写的UCF101和HMDB51的都是返回int,怪不得我测试单个视频,正确率几乎为零,应该是训练网络的时候就训练错了,那个0.83的accuracy也不知道咋来的,现在把label类型改成了int以后又重新训练了的结果:


好吧貌似和之前区别不大,又测试了一下单个视频,发现五个里就没有一个识别对的(笑哭)

还是进行整个测试集的测试吧


整个测试集的测试也很醉,正确率才百分之一点多,肯定是哪里出问题了,继续查错

先把prototxt和deploy中最后几层改过layername的top也改成了相应的名称,然后再训练:


准确率比之前训练的0.83还高了一点,然后再拿五个测试集视频去测试,发现还是一个都认不出来。。。再拿训练集的五个视频测试,还是一个都认不出来,这是deploy文件的问题吗。。?

为了找问题又用UCF101训练再测试,发现是正常的,同样是改了层名称

训练:


测试:


发现测试的准确率和训练阶段验证的准确率是差不多的,但都比作者给的训练好的reference要低,可能还是因为后两个层改了名字没有用到ImageNet预训练的数据?

刚刚试了一下UCF不更改曾名称也可以测试了?不知道之前为啥不能,难道是把rgb的文件写成flow了吗


由于之前没改layername时候的训练log被覆盖了,于是刚刚重新训练了一下:


也是0.84,正常的应该就是一样的,因为训练阶段的验证集和测试时的测试集本来就是同一个。

再重新用ntu训练一下不改layername的网络,max_iter从3500改成了4000,batchsize从128改成了32


结果不知道为什么准确率降到0.82了,可能是batchsize?然后测试的时候就又报错了


也就是说用ucf可以不改layer名称,但是用ntu就需要改,改了以后虽然能测试,但结果完全不对,还是没有找到原因,心好累——2017.12.19


2017.12.20今天早上来打算再调调参数试试,结果看solver文件的时候,猛然发现上面一行字:net: "models/ucf101/tsn_bn_inception_rgb_train_val.prototxt"我天居然还是ucf101???这个可是ntu的solver啊!我居然没有改??这下终于找到问题所在了,太不容易了,赶紧改成ntu以后再训练,发现速度慢了好多,38分钟了才iteration=120(刚刚为了复制这个按了个Ctrl+C!!傻叉了,训练被我中断了,只好再来一遍)

2017.12.21训练了十多个小时才出来的结果:


这回才是真正的训练啊,之前才不到二十分钟的那个都是假的。。。

然后用这回的模型测试了一下测试集的前五个视频:


结果还不错,五个里面对了四个。但是训练完的那个accuracy只有0.57,太低了一些,接下来需要研究下怎么提高。

另外这两天测试的时候发现做video parsed这一步的速度比以前慢了很多,暂时不知道什么原因。刚刚删了几个home下面没什么用的大文件以后又变快了,现在打算用这个模型先做一遍整个数据集的测试看看。


结果还是和训练的时候差不多,有点低,现在打算先不调这个网络的参数,改用kinetic预训练的模型来训练看看会不会好些。

由于kinetic只给出了deploy,需要自己写train_val和solver,我就把之前ImageNet的输入输出层直接粘贴到kinetic的deploy首尾了,然后solver直接复制改了一下net的地址,但运行的时候报错了:

I1222 11:11:04.523223  7409 layer_factory.hpp:74] Creating layer reshape_fc
I1222 11:11:04.523229  7409 net.cpp:99] Creating Layer reshape_fc
I1222 11:11:04.523232  7409 net.cpp:479] reshape_fc <- fc
I1222 11:11:04.523238  7409 net.cpp:435] reshape_fc -> reshape_fc
I1222 11:11:04.523246  7409 net.cpp:163] Setting up reshape_fc

F1222 11:11:04.523259  7409 reshape_layer.cpp:79] Check failed: 0 == bottom[0]->count() % explicit_count (0 vs. 120) bottom count (1920) must be divisible by the product of the specified dimensions (180)

在输出部分有个reshape层的bottom个数是1920,不能被我设置的[-1, 1, 3,60]计算出的180整除,我查了一遍还看了源代码,目前还是不知道这个1920是怎么来的,按理说都是bn-inception,维数应该不会不同,之前都不出错,现在不知道为何出错了。

一边找错一边用ntu训练ImageNet预训练的光流网络,发现特别特别慢,这回不知道得几十个小时,看来一个显卡还是太吃力了。

然后对照着之前的train_val文件从头开始查,查到第一个卷积层就发现错误了,输入应该是reshape_data ,而我还保持着deploy文件的data。。。不过改过以后能不能奏效还得之后再检验了,先训练完光流,现在显卡被占用着。


2017.12.25

22号15点左右开始训练的,今天早上来看发现log卡在了23号凌晨3点,当时iteration=1000,忘记保存snapshot了,只好关机,结果关机也卡住了,只好按主机上的重启按钮,成功重启了,估计是大量数据在内存没有写入完毕,现在打算先不训练flow网络了,先用rgb微调kinetics预训练的网络,改了reshape_data那个错误以后,又出现了shape mismatch的错误,这回是在训练阶段,改了全连接层的名称为fc-action1以后就可以训练了。

2017.12.26

训练的结果:


只比ImageNet高了1%的样子

接下来是用这个模型测试

阅读全文
0 0
原创粉丝点击