NNI 2 用于实例


一、cifar10模型选优

任务领域:图片分类
https://github.com/Microsoft/nni/tree/master/examples/trials/cifar10_pytorch
数据集:CIFAR-10
模型:基于Pytorch的流行模型集合:“vgg”, “resnet18”, “googlenet”, “densenet121”, “mobilenet”, “dpn92”, “senet18”

训练脚本:
NNI 2 用于实例
搜索空间定义:
NNI 2 用于实例

实验结果:
NNI 2 用于实例
NNI 2 用于实例
NNI 2 用于实例
NNI 2 用于实例
当前最优参数:
NNI 2 用于实例
结果分析:
CIFAR-10数据集要比MNIST数据集困难一些,简单的网络最终可能只能达到80%左右的训练精度。本实验通过遍历当前较为流行的经典网络(定义了"vgg", “resnet18”, “googlenet”, “densenet121”, “mobilenet”, “dpn92”, "senet18"七个网络,这种模式也适用于比较各个网络之间同参数下性能的差异),在pytorch框架下测试这些网络的性能,并且加入了优化器类型、学习率两个参数试图得到一个最优的训练模型。因为这些网络本身的层数非常多,结构复杂,我们利用GPU运行了约50小时,采取了当前的结果来分析。从结果中看到,训练时间有显著的差异,从2h到12小时不等,这说明了网络内部参数的复制度是不同的,通过界面显示可以清晰比较。在训练精度方面,这些经典网络几乎都取得了85分以上的精度,在当前的7个实验中,基于策略“densenet121-Adamax-0.001”的组合取得了93.56的准确度,这样的精度在CIFAR-10数据集上是相当理想的。


二、图像文字检测

https://github.com/eragonruan/text-detection-ctpn
任务领域:图像文字检测

采用方法:Detecting Text in Natural Image with Connectionist Text Proposal Network(CTPN)
Source : https://arxiv.org/abs/1609.03605

算法概要:

  1. 类似于 Faster R-CNN,对 VGG16 网络输出(conv5)的卷积 feature map,3×3的窗口平滑(anchors 固定尺寸);
  2. 采用双向LSTM(Bi-directional LSTM, BLSTM)对每一行的序列窗口递归(recurrently)连接;其中,每个窗口的卷积特征(3×3×C) 作为 256D BLSTM 的输入(双向的,两个128D LSTMs).
  3. LSTM RNN层后接一个 512 FC 层,联合输出 文本/非文本概率,y-轴坐标及 k 个 anchors的 side-refinement 偏移值.LSTM RNN层后接一个 512 FC 层,联合输出 文本/非文本概率,y-轴坐标及 k 个 anchors的 side-refinement 偏移值.
    NNI 2 用于实例

1.基本实验结果

实验环境:Ubuntu 16.04+Python 3.5+TensorFlow+CUDA(1080Ti)
实验数据集:mlt(3423张图像+ground truth), 训练图片将短边放缩到600像素。
Source: https://drive.google.com/file/d/1HcZuB_MHqsKhKEKpfF1pEU85CYy4OlWO/view?usp=sharing

实验时长:约8 hours

实验过程中:
NNI 2 用于实例
实验默认参数设置了50k个step,每隔10个step输出一次模型的loss和总loss,还有当前的速度和学习率,隔5000个step保存一次当前step的模型,我们选取最后保存的模型作为测试结果。

实验结果分析:
输出图像:
NNI 2 用于实例
输出结果:
NNI 2 用于实例
输出图像:
NNI 2 用于实例
输出结果:
NNI 2 用于实例
结果分析:该模型支持数据集中出现的包括汉字在内的常用语言字体的检测,模型的输出是N个固定宽度的矩形框,result.txt中国的每一行的前8个点代表了矩形框的四个顶点坐标的x与y值,最后的数字代表“预测为文本”的概率。从图像中可以看到,英文标准字体库的检测效果非常理想,完全还原了文字的位置,包括人物的脖颈上的文字印花都框了出来。对于下图的中文电影海报,一些艺术字无法检测到,因为当前训练集中未出现过类似的字体,其他的中文字符较为准确识别。

2.NNI小试牛刀

我们尝试利用NNI进行上述内容的训练,在安装好NNI后,我们开始配置当前的实验环境。

下图为本次实验采用的config.yml:
NNI 2 用于实例
接下来,基于GitHub作者推荐的默认训练参数和初始的使用中定义的可选参数(如下图),我们定义了本次实验的search_space.json,我们将total loss设为本次实验的metric,并设定最小化目标策略。

原始实验的可选参数
NNI 2 用于实例

本次实验的搜索空间定义
NNI 2 用于实例

实验结果:
NNI 2 用于实例NNI 2 用于实例

模型保存测试:
NNI 2 用于实例
NNI 2 用于实例

结果分析:
由于时间的限制,我们只截取了当前运行了8小时左右的NNI界面。因为最终我们比较的策略是训练时的网络的总loss,此时NNI的输出结果我们希望最小化。保存的模型我们同样做了真实图像的测试,可以看到效果是不亚于之前50k个step得到的模型的,这说明最优的参数不是当前网络训练的默认值,运用了默认值可能出现了过拟合的现象。继续运行NNI能够得到最终最小化loss的结果。


三、SSD模型

https://github.com/amdegroot/ssd.pytorch
任务领域:目标检测

采用方法:Single Shot MultiBox Detector(SSD)
Source:https://arxiv.org/abs/1512.02325

算法概要:

  1. SSD目标检测方法比YOLO效率高,在检测精度上与Faster RCNN不相上下,其核心是在特征图上采用卷积核来预测一系列default bounding boxes的类别分数、偏移量。为了提高检测准确率,在不同尺度的特征图上进行预测,此外,还得到具有不同aspect ratio的结果。这些改进设计,实现了end-to-end训练,并且,即使图像的分辨率比较低,也能保证检测的精度。
  2. SSD使用VGG-16作为初始网络,在对图像进行卷积后,在特征图像的每一个位置处预测一系列不同尺寸和长宽比的边界框。在测试阶段,该网络对每一个边界框中分别包含各个类别的物体的可能性进行预测,并且对边界框进行调整以适应目标物体的形状。

使用NNI寻优

在本例中调节batch_size和learning_rate,对模型进行寻优。
由于网络规模大,原实验中本需要512 epoch;服务器性能原因导致每个epoch需要花费1小时… 因此大幅降低epoch数量导致实验效果非常差。

在第一次尝试中,设置search space为 batch_size: 32,64 和 learning_rate: 0.0001和0.001。设置四次实验测试效果。然而4次实验中却没有一次测试到batch_size=64。
NNI 2 用于实例

因此再次进行实验,调高maxTrialNum为20。即下列截图所示。

config.yml
NNI 2 用于实例
search_space.json
NNI 2 用于实例
每个epoch记录一次中间结果
NNI 2 用于实例
在实验最后传入最终结果
NNI 2 用于实例

实验结果:
NNI 2 用于实例
由于epoch设置次数过少导致训练效果非常不好。目前的参数调优不具有参考价值。