caffe模型训练,一站式caffe工程实践连载(7)

知识引入
这一次我将给大家带来模型训练相关的分享。本次的分享将包含以下的内容:首先,我们将阐述我们的训练接口,Caffe这个平台它可以有C++,python,Matlab等训练接口,最常使用的是C++接口。我们将基于C++的环境来讲述如何进行训练。第二部分是训练细节,在这一部分中我将给大家讲述一下网络的配置以及使用迁移方法来进行训练,同时也会讲述训练相关的一些参数的配置。第三部分是训练结果分析,我们会对训练的结果进行一些可视化的分析。第四部分是做一个简短的总结。因为我们在训练的过程中有可能出现各种各样的问题,导致不能正常的训练,我们会对一些常见的问题进行一个比较完整的总结。
训练前准备
在训练正式开始之前,我们需要准备好两个文件:
train.proto文件,网络配置文件,配置网络信息。
solver.proto文件,训练参数的配置文件。
train.proto 文件
关于网络配置文件,因为文件非常的长,我们就不看整个的文件。我们重点看一下网络的数据层:
caffe,人工智能
type:这是一个图像分割的任务,所以选择是ImageSegData的输入,在我们前面如何定义一个新的分割数据层中已经详细地进行了阐述。它包含两个网络参数配置文件,首先是Image_Data_param,它包含变量:
source:就是我们训练文件的路径,其中每一行存储在我们的图片以及内部的路径。
batchsize:这就是我们的批处理的大小。它的的设置通常跟我们的显存的大小有关系。
shuffle:是用于控制是否对我们的训练文件进行一个随机的打乱操作,
tranform_param:这个参数通常用于做一些数据增强相关的操作。
mean_value:也就是GB的均值。
crop_size:就是我们网络的最终的输入的大小。
mirror:设置是否使用镜像
在这里我们可以看到,我们只做了solver以及train这两个数据的基本操作,其他的一些数据测量操作我们没有做。前面我们已经给大家介绍了如何定义更多的数据,增强操作的方法。
solver.proto文件
caffe图像技术
base_lr:这是我们的基础学习率,10的-4次方,这是一个比较小的学习率。因为我们采用的是千亿学习的方法,这是一个比较合适的学习率。学习率的设置,需要经过不断的尝试。
type:就是我们的优化方法,我们采用的是Adam
lr_prlicy:参数配置的是fixed
solver_mode:我们采用的GPU来进行训练。
知识小结
网络的输入尺度:160×160,stride=32,也就是说到了最后一层feature map,它的大小是160÷32,也就是5×5这样的一个输入尺度,然后我们基于5×5这样的一个尺度,不断地恢复我们图像的大小,直到恢复出100乘以10的这样一个图像分割结果。
我们采用Adam方法,它相比其它来说,会更加的智能和简单。更多的模型,相关的细节,可以参考百度云的链接:
链接地址
https://pan.baidu.com/s/1gRNuBu40y-lL3URuV1jDPA
我们会将我模型配置以及训练的结果都提供给大家。
模型训练
caffe有C++,Matlab,python这三个训练接口,其中C++的接口是使用最为方便最为简单的,它实现了数据和训练的分离。
训练命令
SOLVER=./mobilenet_solver.prototxt
WEIGHTS=./mobilenet.caffemodel
caffe/build/tools/caffe train -solver S O L V E R w e i g h t s WEIGHTS -gpu 0 2>&1 | tee log.txt
由于我们只有一个GPU,所以我们GPU ID 是0,假如我们有多个GPU,我们可以以逗号进行分隔。比如我们有两个GPU,那么我们可以设置为0,1。
注意养成习惯,将我们训练的所有的信息都保存到log文件里面去,后面我们需要对这个log文件进行一些分析。
迁移学习
将一个任务训练好的参数,用于另一个新的任务的参数初始化。
细心的朋友应该有看到的,我们上面在进行训练的过程中,我们不止指定了-solver这样的一个选项,我们还指定了-weights这样的一个选项。假如我们不指定-weights的一个选项,那么就是网络从头开始训练。现在我们指定了-weights选项,也就是说我们的网络的初始化是从另外一个model,也就是上面指定的mobilenet的Caffe model中进行提取的,这就是牵引学习。迁移学习可以大大的提高网络的寿命速度。
训练结果分析
为了方便我们使用可视化的方法来进行分析,我分别画出了acc和loss曲线。
caffe,图像识别技术
caffe,人工智能
可以看到,我们总的迭代次数是3万次,大概在2万字左右,网络就已经得到了非常稳定的结果。我们的acc大概达到了95%的水平。
这里我们只画出了训练的曲线,没有画出测试的曲线。因为对于我们这样的一个任务来说,它不太可能。他不太会过拟合,所以我们没有画出测试的曲线。实际大家在实践的过程中可以去将测试的曲线同时画出来,帮助我们对训练进行一些总结。
训练常见问题
一、学习率不合适。假如我们的学习率非常非常大,那很有可能网络在学习的过程中就会震荡非常厉害。假如我们的学习率非常小,那么很有可能网络迭代的过程非常非常慢,就是它在梯度的更新过程中非常慢,这也会体现为不收敛。
二、数据不好。根据实际经验,这个原因会更加的频繁,很多的时候我们准备的数据其实并不一定适合我们的任务。
就我们这个项目而言,我们选择了将嘴唇这个区域分割出来,然后基于这样的一些数据做训练,这样可以大大减少背景的干扰。假如我们不这样做,我们直接使用人脸的图像来进行训练的话,那么很有可能我们就会遇到不收敛的问题。因为背景的干扰太大,任务的学习过于困难,所以如果大家遇到不收敛的问题,建议首先查看是不是数据不太合适。
三、模型有误。这也是极有可能发生的,尤其是对于初学者来说,我们设置的输入网络大小非常非常小或者非常非常大,这些都需要去进行总结。
如何防止过拟合?
过拟合就是说我们训练出来的模型在训练集上表现得非常好,但是当我们将其用到测试集的时候,他的表现就非常的差。过拟合发生的主要原因有两个:
原因一:数据太少。尤其是对于分类任务,只学习到了一小部分数据的分布,学习得非常的完美。当它应用到更多的数据的时候,它就表现得非常的差。深度学习的发展,在很大的程度上都是归于数据集的发展。所以我们一定要准备足够多的数据来进行我们的网络的训练。
原因二:模型太小。可能跟有些人的认知相反,认为模型太大,会比较容易过拟合,实际上并不是如此。非常大的模型,其实有很多的参数是冗余的。太小的模型,它的参数非常少,这样它的每一个参数就会显得非常的关键。假如这个时候我们的数据又比较少的话,那么它每一个参数群体和我们的数据分布,都起到了非常关键的作用。等我们使用新的数据集来对这个模型进行测试的时候,由于它的参数的鲁棒性不强,就会受到干扰。
案例:
caffe,人工智能
图1展示的是跟学习率有关的一个参数。当我们使用了一个比较高不是最合适的学习率,那很有可能网络收敛得比较快,也就是绿色的曲线,但是它收敛到的不是我们需要的理想状态。当我们的学习率非常小,也就是图中的蓝色曲线,它的收敛过程就变得非常的慢。理想的情况是图中的红色曲线。关于学习率其实并没有理论上的指导,大家只能在实践项目中更多的尝试。
caffe,图像识别技术
图2展示了一个模型在收敛过程中震荡的过程。因为模型是通过八级赛事迭代,假如图片数量取得太少的,就会导致模型在参数迭代的过程中方向不断地发生改变。如果我们的硬件配置允许的话,我们应该尽可能地使用一个比较大的batchsize。一些学术研究使用到了上万数量级的batchsize,但对于我们这样的移动端小模型来说,使用一两百这样的batchsize肯定是没有问题的。
caffe,人工智能
图3展示的就是过拟合现象。其中红色是训练集曲线,绿色是测试集曲线,训练集和测试集的表现差别很大。它的原因可能是数据太少,或者模型太小。所以我们要解决这个问题的话也有两种思路:
第一,我们可以增加我们的数据,我们可以增加数据,数据越多,就会越拟合真实的分布,这样,这个模型过滤的可能性就越低。

第二,给模型增加正则化参数,增强它的鲁棒性。

训练结果下载:
http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html

完整内容及视频解读,请关注蜂口小程序~
参与内测,免费获取蜂口所有内容,请申请内测(1*8*8*1*1*2*1*7*5*9*5),更有其他优惠福利多多,欢迎大家多多参与,尽情挑刺,凡是好的建议,我们都会虚心采纳哒~
蜂口小程序将持续为你带来最新技术的落地方法,欢迎随时关注了解~

猜你喜欢

转载自blog.csdn.net/qq_43019117/article/details/82662719