1.4 如何开展深度学习的研究和应用开发
进行深度学习的研究和应用开发,首先,应该确定具体的问题和解决问题的目标;其次,需要采集或通过公开途径获得大量相关的有标注的数据集;然后选择合适的深度学习平台进行深度神经网络模型的训练;最后,得到特征提取模型和目标分类模型。
本节以深度学习的主流平台——Caffe为例,概要讲解如何使用深度学习平台在自己的数据集上训练模型,如何设计网络结构,如何调整网络参数的相关技术。Caffe的具体讲解将在本书第5章进行。
目前使用Caffe训练深度模型主要有两种方法:①利用当前数据从零开始重新训练深度模型;②加载已有模型,利用加载到的模型的参数作为训练新模型的初始化参数。Caffe中提供了许多基于大量数据训练的深度模型,读者可以参考文献[23]下载自己需要的深度模型。至于如何选择这两种方法,如果你的数据量较小或者数据与文献[23]中的某个模型所用的数据很相似,就可以优先选择第二种方法。当然,也可以尝试第一种方法。
下面主要参考文献[24]讲解如何加载Caffe中的已有模型来训练自己的数据,得到针对自己数据集的特有模型。该例使用在ImageNet数据集上训练得到的CaffeNet模型。ImageNet是一个数据量达到百万级的数据库,CaffeNet模型本身解决的是物体分类问题,而这里[24]主要是解决“Flickr Style”[25]数据库问题,即图片风格分类问题,该数据库包含8万张图片。选择加载CaffeNet模型的主要原因是“Flickr Style”数据库中的图片与ImageNet很相似。
具体步骤如下(假设所有操作都在配置好的Caffe根目录下执行)。
1. 准备自己的数据
使用上面的命令,下载“Flickr Style”数据库中的2000张图片,并自动将数据分为训练和测试数据,保存在data/flickr_style文件夹中,训练文件为train.txt,测试文件为test.txt,这两个文件中的数据格式:图片路径、该图片对应的标签,路径和标签之间用空格隔开。
2. 下载Caffe中已有模型
使用上面的命令,下载Caffe中已有的CaffeNet模型,保存在models文件夹中,模型的文件名为bvlc_reference_caffenet.caffemodel,该文件中保存了该模型对应的权重和偏置等相关参数值。
由于在训练新的模型的时候,需要对应的均值文件,可以通过下面的命令得到,对应文件保存在data/ilsvrc12/文件夹下,名称为imagenet_mean.binaryproto。
3. 修改网络结构
首先需要强调的是,由于使用的是CaffeNet模型,所以使用的网络结构必须是CaffeNet网络结构,这些可以从models\bvlc_reference_caffenet文件夹下获得。由于“Flickr Style”数据库中的图片风格共有20类,而ImageNet数据库中图片共有1000类,所以需要将CaffeNet网络中的最后一个全连接层的输出数量从1000修改为20,这个至关重要。另外,加载已有模型的参数到现有网络中对应的网络层主要依据网络中的层名称,需要将最后一个全连接层的层名称从fc8修改为其他不一样的名称,例如fc8_flickr,这样就可以实现从随机初始化的权重开始学习这一层。
网络中最后一个全连接层修改如下:
此外,还需要修改models/finetune_flickr_style文件夹下solver.prototxt文件的内容,修改如下:
4. 加载已有模型训练自己的数据
使用上面的命令,加载已有模型的参数,主要通过-weights来指定已有模型对应的文件路径,训练针对自己的数据的深度模型;如果不想通过加载已有模型的方式训练自己的模型,可以通过去掉-weights参数来实现。最后模型保存在models/finetune_flickr_style/文件夹中,随着迭代的进行,会保存多个模型文件。而finetune_flickr_style_100000.caffemodel是完成所有迭代后得到的最终模型文件。
紧接着,就是调整参数的过程,这里,需要调整的参数较多,目前的技术不能全自动地确定调某一个参数就能得到最好的模型。当前都是通过逐个尝试的方法来调参。具体而言,调参主要包括调整solver.prototxt文件中的学习率(base_lr),权重衰减值(weight_decay)等。当然也可以尝试使用不同的学习率改变策略(lr_policy),具体可以参考本书第5章中不同的学习率改变策略。
调整学习率的完整过程如下:首先固定一个学习率的值,然后训练模型,直到验证准确率不再上升,可以尝试将学习率降低继续训练,反复调整学习率的值,直至训练出一个较好的深度模型。
上述四个主要步骤非常重要,它们是深度学习业内人士进行深度学习研究和应用开发时,为了在自己的具体数据上训练特征提取模型时,经常使用的解决方案。