1、在复原韩国Hyeonwoo Noh 的Learning Deconvolution Network for Semantic Segmentation的实验过程中,运行训练网络的指令是报错:...error :out of memory 作者的服务器配置为 Nvidia GTX Titan X GPU with 12G memory,我的服务器配置为GeForce GTX 980 with 4G memory .
出现这种情况一般都是显存不够用了,所以解决方案如下:
1):把网络的batchsize 改小
2):把网络的层数改小(改变网络结构)
3):增加GPU显卡数量 (因作者的实验层数居多,将batchsize改到2还不行后,我将网络结构删掉了一部分,最终跑起来!)
2、关于在做自己的反卷积实验中,输入数据的问题:(总结:caffe做分类比较多,做回归较少,lmdb数据类型主要用于分类,而hdf5+euclidean配合做回归)
因为Hyeonwoo Noh的实验数据输入的是rgb图像,标签是单通道的只有21种像素值(灰度图是256个)分别对应21类标签。所以要解决两端都是rgb并且做loss回归的话,要在输入数据上下功夫。我的预期解决方案以及实施结果如下:
1)输入数据使用lmdb 数据,像欧新宇的caffe教程那样,将图片数据生成列表,最终生成lmdb .但此时lmdb的label已经不再是0、1....的label,而是list中的图像。所以我在不同版本的caffe上进行lmdb转换过程中,报错五花八门:有的版本识别到了0幅图像,生成了lmdb;有的caffe版本将input和与其隔一个空格的label图像当成一幅图像的名称,报错找不到对应图像。(否决掉)最后,终于得知,lmdb一般用于做分类,加类标,而hdf5 数据类型做回归!
2)使用caffe中提供的Imagedatalayer。 查看imagedatalayer在caffe中的定义代码后,得知IMAGE_DATA数据存取过程中遍历是以pair形式放入lines(就是生成的txt训练集中的一行),lines是<string,int>的vector,所以由int可以得知,该数据层也是只能做分类(否决掉)
3)套用并改写Hyeonwoo Noh的IMG_SEG_DATA层。将自己的数据直接像noh做图像分割(noh为了实现输入三通道和label单通道来做分割自己定义了一个数据层——IMG_SEG_DATA)那样用.当然如果直接用的话是输入三通道,label单通道,最后做均方误差时,报错:bottom[0]->channels==bottom[1].channels (3 vs 1),显然bottom[0]是input经过网络后的三通道图,bottom[1]为从输入数据取来的label图。所以开始改写caffe代码,使IMG_SEG_DATA数据层输出的label是3通道的。
查看caffe.proto 文件后,确认 caffe/include/caffe 下的data_layer.hpp(数据层的头文件)不用修改
i)在Deconvnet-master/caffe/src/caffe/img_seg_data_layer.cpp中的 ”读取图像初始化top blob“ 处的label(即top[1])的参数1改为变量channels;
重新编译caffe,运行后报错:check failedLlabel_channels==1(3 vs 1)提示报错文件位置:caffe/src/caffe/data_transformer.cpp:313行。于是打开该文件,查看后,是在检查通道数处出错,于是将相应原来的CHECH_EQ(label_channels,1),将1,换位3.
报错,重新编译caffe,终于大功告成,有点小兴奋啊!!!!
4)使用hdf5数据类型,hdf5加上euclidean做回归是可以的,因在方法三种修改caffe代码成功了,就没有尝试这种方法,不过这种方法可行性也是很大,具体可以参照SRCNN的生成过程。
3、网络终于可以跑起来后,兴奋之余,发现loss的值很乖啊,显示loss=nan,于是上网搜了下,很多人说把学习率降低,于是我将学习率从起初的0.01一直调到0.00001,loss才正常显示了,可以了 接下来的工作终于可以安心慢慢调参了。