caffe for windows 训练cifar10 及若干问题

来源:互联网 发布:网络拓扑visio图库 编辑:程序博客网 时间:2024/05/18 03:31

声明:有部分内容转载至笑笑魔导师

1,准备cifar10数据库

cifar10数据库由60000张32*32 彩色图片 共10类

其中50000张训练

10000张测试

下载cifar10数据库:http://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz

这是binary格式的,所以我们要把它转换成leveldb格式。


2,转换数据 

在../caffe-windows/examples/cifar10文件夹中有一个 convert_cifar_data.cpp

将他include到MainCaller.cpp中。如下:


然后重新编译,一次通过。这里会在bin文件夹下产生一个MainCaller.exe,这里把它改名为convert_cifar_data.exe即可。

可以在bin文件夹下新建一个input文件夹。将第一步下载的文件解压到input文件夹中,这样转换时就不用写路径了。如下图所示




cmd进入bin文件夹




执行后,在output文件夹下有cifar_train_leveldb和cifar_test_leveldb两个文件夹。里面是转化好的leveldb格式数据。

当然,也可以写一个bat文件处理,方便以后再次使用。(我是初学者,我也不会。原谅我。。。)


可能出现的问题:

在编译的时候,出现如下错误:

 convert_cifar_data.cpp(58): error C3861: “snprintf”: 找不到标识符 

打开caffe for Windows\examples\cifar10\convert_cifar_data.cpp文件,这里有两个解决办法:

(1):找到snprintf,在前面加上下划线,或者直接双击错误,会弹出这个cpp,其中有3处都需要加下划线,保存,再编译 。

(2):在这个cpp文件前面 #define snprintf  _snprintf  即可。
我用的是第二种方法,如下图:


3,求数据图像的均值

如下:在MainCaller中重新编译编译../../tools/comput_image_mean.cpp


编译成功后。在这里会出现MainCaller.exe,这里把它修改为ompute_image_mean.exe

接下来就可以求图像mean了。

cmd进入bin。




可能出现的问题:


编译caffe例子cifar10时:出现Assertion failed:dummy_versions_.next_ == &dummy_versions_. file .\db\version_set.cc, line 803
或者:db/version_set.cc:806: leveldb::VersionSet::~VersionSet(): Assertion `dummy_versions_.next_ == &dummy_versions_' failed.


遇到这个问题,怎么办?

在网上搜索,可以找到  Cynric的博客  有这么一段话:

在1.15版本中,如果使用NewIterator函数创建了leveldb::Iterator对象而没有delete该对象的话,在程序退出时将会报出如下错误:
    db/version_set.cc:806: leveldb::VersionSet::~VersionSet(): Assertion `dummy_versions_.next_ == &dummy_versions_' failed.
    根据代码分析,这里assert失败的原因主要是为了防止内存泄露。

参考上面的错误提示,打开源码:(在../tools/compute_image_mean.cpp里面),根据博客的提示,我就在创建lterator后进行delete。大概在源代码的第70行左右的位置。如下图所示:


然后重新编译,就可以解决了。



4,训练cifar网络

在.../examples/cifar10文件夹里已经有网络的配置文件,我们只需要将cifar_train_leveldb和cifar_test_leveldb两个文件夹还有mean.binaryproto文件拷到cifar10文件夹下。

修改cifar10_quick_train.prototxt中的source: "cifar-train-leveldb"    mean_file: "mean.binaryproto" 和cifar10_quick_test.prototxt中的source: "cifar-test-leveldb".(修改路径,使得其读取路径正确即可)
    mean_file: "mean.binaryproto"就可以了,

后面再训练就类似于MNIST的训练。写一个train_quick.bat,内容如下:

copy ..\\..\\bin\\MainCaller.exe ..\\..\\bin\\train_net.exeSET GLOG_logtostderr=1"../../bin/train_net.exe" cifar10_quick_solver.prototxt  pause
先编译一遍 train_net.cpp

运行train_quick.bat

  


5 运行结果

附录:

这里我的笔记本显卡太差,功能跟不上。然后,就直接阵亡了。
所以,我没有出来这个结果。这里是网上借的图。。。。
----------------------------------------------------------

-----------我要买电脑-------------
----------------------------------------------------------

所以劳烦各位能赞助点。。。。




0 0