在windows版本下,caffe中好多脚本是linux版本下的,很多时候需要我们自己改成windows下批处理脚本。
那么在alexnet会遇到那些问题呢?我总结下我遇到的问题:
1.首先是数据ilsvrc2012下载问题,训练数据有138G,而验证集有6个G,测试集有12G,如此大的数据,一般的电脑是带不动的,也包括我的电脑,所以我只选择了30类数据来训练,这个时候问题就来了,你只选择了一点数据来训练,那么图像标签怎模板?因为我们用脚本下载下来的图像标签是所有图像的标签,如果我们用所有数据来训练,这个时候就会出现错误could not open or find file,那是因为标签里好多图片都没有,所以会出现这个问题,解决办法:自己做个标签(一行只有路径和标签,要换行),这个时候又会遇到一个问题,图像路径和标签之间用空格分开,而标签后面不能有有任何空格或则\t,那我就自己写个程序,访问文件的内容,把文件内容改成上面的形式(图像路径和标签之间用空格分开,而标签后面不能有有任何空格或则\t)。
2.如果你把刚才做的标签放进去训练,你会看到意想不到的结果,他会认为整个标签只有一张图片路径,这个是怎么回事呢?明明格式跟他一样!其实,我们错了,不信的话,你可以把他原来的标签和你自己做的标签放导入到到excel,你会发现原来的标签excel可以将他们分开,并且换行,而我们自己做的标签则excel分不开,那是什么原因呢? 据我个人认为:应该是标签和下一个路径之间加入了我们看不到的字符,表面上看他们是在一起的,但程序可以将他们分开,例子:原来图片标签:n0146700101.jpeg 0n0146700102.jpeg 0,你可以看到这个例子有两张图片(n0146700101.jpeg n0146700102.jpeg)及标签(0 0),你可以看到标签0和n0146700102.jpeg连在一起,程序可以将他们分开,但如果我们自己做个标签如上面所示,你会发现程序识别不了,这个是什么原因呢?个人见解是0和n0146700102.jpeg 加入我们看不到的字符,使得程序可以将他们分开,但我们自己做的标签没有。 具体是啥字符,我个人还不知道,如果你知道,请回复我,谢谢!
解决办法:在原来的标签基础上删减。最好是顺序选用。(训练,验证,测试标签都是如此)
3.在解决完标签问题后,后面在create make_imagenet_mean 一般不会遇到问题,如果出现问题;可能是你的路径不对。至少目前我没遇到问题。但前面那个问题我想了好多天怎么去解决?请见谅能力有限。如果你有方法解决,请告诉我们,让大家以后少走点弯路,节约点时间。
这个问题已解决: 就是加入十六进制的0D和0A,中文名叫:换行键,即"\n".其实也不需要那样,直接写个程序,在标签后面加入换行就行,但是自己手动换行不行。
忘记上传自己的代码了。
我的代码如下:
#include<fstream> #include<string> #include<iostream> using namespace std; void main() { ifstream infile("F:\\caffe-master\\data\\ilsvrc12\\val2.txt", ios::in); ofstream outfile("F:\\caffe-master\\data\\ilsvrc12\\val3.txt", ios::out); char a[500]; int count =1; while (!infile.eof()) { if (count % 2 != 0) { infile >> a; outfile <<a<<" "; } else { infile >> a; outfile <<a; outfile << "\n"; } count++; } infile.close(); outfile.close(); } 这个程序是在vs2013下执行的。