读书笔记1CIFAR-10在caffe上进行训练与学习2014.7.21薛开宇本次学习笔记作用,知道如何在caffe上训练与学习,如何看结果。1.1使用数据库:CIFAR-1060000张32X32彩色图像10类50000张训练10000张测试1.2准备在终端运行以下指令:cd$CAFFE_ROOT/data/cifar10./get_cifar10.shcd$CAFFE_ROOT/examples/cifar10./create_cifar10.sh其中CAFFE_ROOT是caffe-master在你机子的地址运行之后,将会在examples中出现数据库文件./cifar10-leveldb和数据库图像均值二进制文件./mean.binaryproto1.3模型该CNN由卷积层,POOLing层,非线性变换层,在顶端的局部对比归一化线性分类器组成。该模型的定义在CAFFE_ROOT/examples/cifar10directory’scifar10_quick_train.prototxt中,可以进行修改。其实后缀为prototxt很多都是用来修改配置的。1.4训练和测试训练这个模型非常简单,当我们写好参数设置的文件cifar10_quick_solver.prototxt和定义的文件cifar10_quick_train.prototxt和cifar10_quick_test.prototxt后,运行train_quick.sh或者在终端输入下面的命令:cd$CAFFE_ROOT/examples/cifar10./train_quick.sh即可,train_quick.sh是一个简单的脚本,会把执行的信息显示出来,培训的工具是train_net.bin,cifar10_quick_solver.prototxt作为参数。然后出现类似以下的信息:I031721:52:48.9457102008298256net.cpp:74]CreatingLayerconv1I031721:52:48.9457162008298256net.cpp:84]conv1-dataI031721:52:48.9457252008298256net.cpp:110]conv1-conv1I031721:52:49.2986912008298256net.cpp:125]Topshape:100323232(3276800)I031721:52:49.2987192008298256net.cpp:151]conv1needsbackwardcomputation.这是搭建模型的相关信息接着:031721:52:49.3093702008298256net.cpp:166]Networkinitializationdone.I031721:52:49.3093762008298256net.cpp:167]MemoryrequiredforData23790808I031721:52:49.3094222008298256solver.cpp:36]Solverscaffoldingdone.I031721:52:49.3094472008298256solver.cpp:47]SolvingCIFAR10_quick_train之后,训练开始I031721:53:12.1797722008298256solver.cpp:208]Iteration100,lr=0.001I031721:53:12.1856982008298256solver.cpp:65]Iteration100,loss=1.73643...I031721:54:41.1500302008298256solver.cpp:87]Iteration500,TestingnetI031721:54:47.1294612008298256solver.cpp:114]Testscore#0:0.5504I031721:54:47.1295002008298256solver.cpp:114]Testscore#1:1.27805其中每100次迭代次数显示一次训练时lr(learningrate),和loss(训练损失函数),每500次测试一次,输出score0(准确率)和score1(测试损失函数)当5000次迭代之后,正确率约为75%,模型的参数存储在二进制protobuf格式在cifar10_quick_iter_5000然后,这个模型就可以用来运行在新数据上了。1.5其他另外,更改cifar*solver.prototxt文件可以使用CPU训练,#solvermode:CPUorGPUsolver_mode:CPU可以看看CPU和GPU训练的差别。主要资料来源:caffe官网教程读书笔记2用一个预训练模型提取特征2014.7.21薛开宇本学习笔记的作用在于为后面打基础,没有什么实际的东西可以观测到,要可视化特征还要观看后面的教程。2.1制作一个数据库先做一个临时文件夹存放东西。mkdirexamples/_temp我们为两张在images文件夹的照片生成一个文件列表(默认为一张图片,cat1是我随意加上去的)find`pwd`/examples/images-typef-exececho{}\;examples/_temp/temp.txt我们将使用imagedatalayer预计标签之后的每一个文件名,所以让我们添加一个0到每一行的末尾seds/$/0/examples/_temp/temp.txtexamples/_temp/file_list.txt这样,我们将得到两个文件temp.txt和file_list.txt。2.2.定义特征提取网络结构在实践中,从一个数据集中减去均值图像对于提高分类准确性很重要,因此从ILSVRCdataset中下载均值图像数据库data/ilsvrc12/get_ilsvrc_aux.sh我们将使用其中的data/ilsvrc212/imagenet_mean.binaryproto去定义网络结构。将定义结构的文件cope到我们的临时文件夹。cpexamples/feature_extraction/imagenet_val.prototxtexamples/_temp然后,我们进入imagenet_val.prototxt更改路径。更改其中$CAFFE_DIR的地方下图是我做的改动。2.3.提取特征执行指令build/tools/extract_features.binexamples/imagenet/caffe_reference_imagenet_modelexamples/_temp/imagenet_val.prototxtfc7examples/_temp/features10其中fc7是最高层的特征,我们也可以使用其他层提取,像conv5或pool3最后的参数是数据的批次特征保存在LevelDBexamples/_temp/features,可以运用到其他代码了。这里可以发现,特征文件中5个文件和cifar10中的leveldb是相似的。_temp下featuresCifar10下特征数据库因此,这是我们训练时组建模型时必要的文件。2.4.注意当存在features文件夹时将出现错误,这时需要移除该文件夹。资料来源:caffe官网教程学习笔记3用自己的数据训练和测试“CaffeNet”2014.7.22薛开宇本次学习笔记作用比较大,也是重点,知道如何在caffe上搭建自己的数据库。3.1数据准备本学习笔记有点脱离了原文,原文是用ImageNet1000类的数据库,而因为电脑内存不足,只能自己模仿做一个小的数据库进行下去。本来教程是假设已经下载了ImageNet训练数据和验证数据(非常大),并以下面的格式存储在磁盘:/path/to/imagenet/train/n01440764/n01440764_10026.JPEG/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG里面是各种的分类图。因为实在太大,所以我们改为模仿搭建自己的数据库。在data中新建文件夹myself,本人在网上下载了训练猫的图片50张,测试猫10张,训练鸟的图片50张,测试鸟10张。如图所示:如果坚持用Imagenet的话,我们还需要一些标签数据进行训练,用以下指令可以下载,如果不用,就可以不执行下面指令。cd$CAFFE_ROOT/data/ilsvrc12/./get_ilsvrc_aux.sh培训和测试的输入是用train.txt和val.txt描述的,这些文档列出所有文件和他们的标签。注意,我们分类的名字是ASCII码的顺序,即0-999,对应的分类名和数字的映射在synset_words.txt(自己写)中。运行以下指令:find-name*.jpeg|cut-d'/'-f2-3train.txt注意路径然后,因为样本数比较少,可以自行手动做分类标签。在train.txt的每个照片后用0-999分类。当样本过多,就自己编写指令批量处理。同理,获得val.txtTest.txt和val.txt一样,不过后面不能标签,全部设置成0。我们还需要把图片的大小变成256X256,但在一个集群环境,可以不明确的进行,使用Mapreduce就可以了,像杨青就是这样做的。如果我们希望更简单,用下面的命令:fornamein/path/to/imagenet/val/*.JPEG;doconvert-resize256x256\!$name$namedone我做成了sh,方便以后使用。然后在caffe-master创建myself文件夹,然后将imagenet的create_imagenet.sh.复制到该文件夹下进行修改,进行训练和测试路径的设置,运行该sh.最后得到3.2计算图像均值模型需要我们从每张图片减去均值,所以我们必须获得训练的均值,用tools/compute_image_mean.cpp实现,这个cpp是一个很好的例子去熟悉如何操作多个组建,例如协议的缓冲区,leveldbs,登录等。我们可以直接复制imagenet的./make_imagenet_mean.加以修改应用就行,注意路径。3.3网络的定义从imagenet中复制修改imagenet_train.prototxt,注意修改数据层的路径。source:ilvsrc12_train_leveldbmean_file:../../data/ilsvrc12/imagenet_mean.binaryproto我改成同理,复制修改imagenet_val.prototxt.改成如果你细心观察imagenet_train.prototxtandimagenet_val.prototxt,你会发现他们除了数据来源不同和最后一层不同,其他基本相同。在训练中,我们用一个softmax——loss层计算损失函数和初始化反向传播,而在验证,我们使用精度层检测我们的精度。我们还有一个运行的协议imagenet_train.prototxt,复制过来,从里面可以观察到,我们将运行256批次,迭代4500000次(90期),每1000次迭代,我们测试学习网络验证数据,我们设置初始的学习率为0.01,每100000(20期)次迭代减少学习率,显示一次信息,训练的weight_decay为0.0005,每10000次迭代,我们显示一下当前状态。以上是教程的,实际上,以上需要耗费很长时间,因此,我们稍微改一下test_iter:1000是指测试的批次,我们就10张照片,设置10就可以了。test_interval:1000是指每1000次迭代测试一次,我们改成500次测试一次。base_lr:0.01是基础学习率,因为数据量小,0.01就会下降太快了,因此改成0.001lr_policy:step学习率变化gamma:0.1学习率变