caffe中的train

xiaoxiao2021-02-28  105

本文以CaffeNet为例: 1. train_val.prototxt  首先,train_val.prototxt文件是网络配置文件。该文件是在 训练的时 候用的。 2.deploy.prototxt 该文件是在测试时使用的文件。 区别: 首先deploy.prototxt文件都是在train_val.prototxt文件的基础上删除了一些东西,所形成的。 由于两个文件的性质,train_val.prototxt文件里面训练的部分都会在deploy.prototxt文件中删除。 在train_val.prototxt文件中,开头要加入一下训练设置文件和准备文件 。例如,transform_param中的mirror: true(开启镜像);crop_size: ***(图像尺寸);mean_file: ""(求解均值的文件),还有data_param中的source:""(处理过得数据训练集文件);batch_size: ***(训练图片每批次输入图片的数量);backend: LMDB(数据格式设置)。然后接下来,训练的时候还有一个测试的设置,测试和训练模式的设置通过一个include{phase: TEST/TRAIN}来设置。接下来就是要设置TEST模块内容。然后其他设置跟上面一样,里面有个batch_size可以调小一点,因为测试的话不需要特别多的图片数量。而以上这一块的内容在deploy里表现出来的只有一个数据层的设置。只需设置name,type,top,input_param这些即可。 接下来,第一个卷积层的设置 ,train_val.prototxt文件中多了param(反向传播学习率的设置),这里需要设置两个param一个时weight的学习率,一个时bias的学习率,其中一般bias的学习率是weight学习率的两倍。然后就是设置convolution_param,但是在train_val里面需要有weight_filler的初始化和对bias_filler的初始化。然后就是设置激活激活函数。这一块由于没有初始化,所以两个文件都是一样的。 再接下来就是池化层 ,由于池化就是降低分辨率,所以这两边是一样的,只需要设置kernel_size,stride,pool即可。无需参数的初始化。 再下来时LRN层 ,该层的全称是Local Response Normalization(局部响应值归一化),该层的作用就是对局部输入进行一个归一化操作,不过现在有论文表明,这一层加不加对结果影响不是很大, 有利于收敛 。但这一层的定义都是相同的。 再接下来就是"conv2" 、"relu2"、"pool2"、"LRN2"这样的循环,具体跟之前说的一样,train_val主要多的就是参数的初始化和学习率的设置。 在第五个卷积层之后,进入了"fc6"层,该层是全连接层,这里train_val里面还是多两个param学习率的设置,和weight_filler、bias_filler的初始化设置,而两者共同的是有一个输出向量元素个数的设置:inner_product_param。 再接下来就是激活函数RELU。 再接下来就是Dropout层,该层的目的就是为了防止模型过拟合。这其中有一个dropout_ration的设置一般为0.5即可。 再接下来就是"fc7",这一层跟"fc6"相同。然后就是"relu7"、"drop7"都是相同的。然后就是"fc8"也与之前相同。 再接下来就是Accuracy ,这个层是用来计算网络输出相对目标值的准确率,它实际上并不是一个损失层,所以没有反传操作。但是在caffe官网中,它在损失层这一部分。所以在deploy.prototxt文件中,这一层的定义是没有的。 再接下来train_val的最后一个层是"SoftmaxWithLoss"层 ,也是简单的定义了name,type,bottom,top就完了。而这一块的内容也不在deploy.prototxt文件中。而在deploy.prototxt文件中直接定义了一个type:"Softmax"。通过对CaffeNet这两个文件的查看发现deploy.prototxt文件 和train_val.prototxt文件之间的差异在很多层里面牵扯到训练部分的都会被删除,然后就是反向传播训练部分会被删除。 其中,这里面有一个区别在里头,就是为什么train_val里 面的是SoftmaxWithLoss而deploy里面的是Softmax层 (两个都是损失层,都没有任何参数):这里面其实都是softmax回归的应用,只是在定义成Softmax时直接计算了概率时还有forward部分,而在SoftmaxWithLoss部分时是还有backward的部分。所以这里就出现了区别,具体的区别可以看这两个文件的C++定义。 ********solver.prototxt************************************************************************************************ 在solver.prototxt文件中添加变量 :resultforsnap  = 0.64 在src/caffe/proto/caffe.proto 文件中, message SolverParameter {}中添加: optional float resultforsnap = 40 [default = 1e-8]; 在include/caffe/solver.hpp文件中添加变量: float maxresult; 如何使用: 在solver.cpp中调用示例为: maxresult = param_.resultforsnap();   并且一定要make clean--->make... ********train_val.prototxt************************************************************************************************ 在prototxt文件中,添加: softmaxloss_param {     temp: 0.5  } 在src/caffe/proto/caffe.proto 文件中, 添加(如果已经有,就不用了): optional SoftmaxLossParameter softmaxloss_param =41;( ID要唯一) 同时添加: message SoftmaxLossParameter {   optional float temp= 1 [default =0.5]; } 如何使用? 请在对应的layer中, this->layer_param_.softmaxloss_param().temp() 就可以调用其参数啦!
转载请注明原文地址: https://www.6miu.com/read-22148.html

最新回复(0)