首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

利用 Neon* 传输学习-2

利用 Neon* 传输学习-2

创建模型 新型神经网络和预训练 AlexNet 的结构基本相同,有所不同的是,两个仿射层与 dropout 层取代了最后的分类层,使神经网络(针对 ImageNet 的标签进行训练)适应 Pascal VOC 数据集的新标签组。neon 的简化意味着以下代码行(请参阅 create_model())
# train for the 1000 labels of ImageNet

Affine(nout=1000, init=Gaussian(scale=0.01),

       bias=Constant(-7), activation=Softmax())



将被替换为:
Affine(nout=4096, init=Gaussian(scale=0.005),

       bias=Constant(.1), activation=Rectlin()),

Dropout(keep=0.5),

# train for the 21 labels of PascalVOC

Affine(nout=21, init=Gaussian(scale=0.01),

       bias=Constant(0), activation=Softmax())



由于我们已经使用预训练模型,只需进行 6-8 次训练。因此,采用的小型学习速度数值为 0.0001。此外,每隔几次将大幅度减少学习,并利用高 组件,因为预学习权重已经接近本地最小值。和超参数设置一致:
if hyper_params.use_pre_trained_weights:

    # This will typically train in 5-10 epochs. Use a small learning rate

    # and quickly reduce every few epochs.

    s = 1e-4

    hyper_params.learning_rate_scale = s

    hyper_params.learning_rate_sched = Schedule(step_config=[15, 20],

                                                change=[0.5*s, 0.1*s])

    hyper_params.momentum = 0.9

else:

    # need to actively manage the learning rate if the

    # model is not pre-trained

    s = 1e-2

    hyper_params.learning_rate_scale = 1e-2

    hyper_params.learning_rate_sched = Schedule(

                            step_config=[8, 14, 18, 20],

                            change=[0.5*s, 0.1*s, 0.05*s, 0.01*s])

    hyper_params.momentum = 0.1



这些强大的超参数通过 create_model() 中的单行代码执行:
opt = GradientDescentMomentum(hyper_params.learning_rate_scale,

                              hyper_params.momentum, wdecay=0.0005,      

                              schedule=hyper_params.learning_rate_sched)



多量程取样器2007 版 Pascal VOC 数据集为每张图像的某些矩形相应区域 (ROI) 提供了标签。Neon 安装了 Pascal VOC 数据集加载器。根据 PASCALVOCTrain 等级创建一个类型,然后创建一个数据集加载器。
依次按照 [1., 1.3, 1.6, 2., 2.3, 2.6, 3.0, 3.3, 3.6, 4., 4.3, 4.6, 5.] 的调整规模,对输入图像进行取样,并收集 448 个补丁。特定规模的取样流程如下所示(请参阅 compute_patches_at_scale()):
size = (np.amin(shape)-1) / scale

num_samples = np.ceil( (shape-1) / size)



由于补丁是生成的,而不是地面真实情况衍生而来,需要为补丁分配标签。将 ROI 标签分配给补丁,补丁产生明显重叠。我们选择的重叠标准是单个补丁至少有 20% 的区域与单个 ROI 重叠,ROI 至少有 60% 的区域被重叠区域所覆盖。如果针对特定补丁,有 0 个或多于 1 个 ROI 符合这个标准,将该补丁标记为背景(请参阅 get_label_for_patch())。背景补丁通常占据主导地位。训练过程中,进行偏差取样,以传输更多的非背景补丁(请参阅 resample_patches())。利用 MultiscaleSampler 的 __iter__() 函数全程动态取样。当 neon 要求数据集提供下一批小批次数据时,调用该函数。[1] 的图 4 展示了该过程的动机。
补丁取样方法既能用于训练,也能用于推断。多量程取样器为 neon 传输小批输入和标签数据,而 neon 察觉不到这种 meta 形式的多量程学习。由于每张图像的补丁超过小批尺寸,在训练和推断过程中,一张图像将传输多个小批任务。在训练过程中,我们使用了 neon 配备的 CrossEntropyMulti 函数。在推断过程中,我们使用了 neon 的灵活性来定义成本函数。
推断通过预测图像中特定对象标签是否存在,在推断过程中进行多类分类。利用指数使分类预测产生偏差,累积所有补丁(从图像上推断出)的偏差值,根据类别进行分类。也就是说,图像 i 类别 c 中 S(i,c) 的得分是类别 c 中单个补丁得分 P(j,c) 的总和(乘以一个指数)。
通过 ImageScores 类别得以实施,分数计算可以用以下两行代码表示(请参阅 __call__()):
exp = self.be.power(y, self.exponent)

self.scores_batch[:] = self.be.add(exp, self.scores_batch)



[1] 的图 5 和图 6 展示了该评分技术的原则。
结果以下是测试数据集的结果。通过平均准确率指标来衡量预测质量。整体平均准确率 (mAP) 的数值是 74.67。对于比较简单的实施来讲,结果令人满意。只进行了 15 次训练,而预训练模型的训练超过 90 次此外,如果将针对预训练模型的超参数优化考虑入内,大大节约了计算。
类别飞机自行车鸟类瓶子公共汽车汽车椅子
AP81.1779.3281.2174.8452.8974.5787.7278.5463.0069.57
类别餐桌摩托车人类植物沙发火车电视
AP58.2874.0677.3879.9190.6969.0578.0259.5581.3282.26
不出所料,如下图所示,预训练模型极大加快了训练融合的速度。


以下是关于运行示例的几点有效提示:
  • 利用以下命令启动全新训练运行
    1. ./transfer_learning.py -e10 -r13 -b gpu –save_path model.prm
    2. –serialize 1 –history 20 > train.log 2>&1 &
    复制代码
  • 利用以下命令运行测试。务必通过 -e 选项将本命令的规定 epochs 数量设置为 0。这样可确保 neon 跳过训练,直接进入测试。
    1. ./transfer_learning.py -e0 -r13 -b gpu –model_file model.prm > infer.log 2>&1 &
    复制代码
  • 如果对训练数据集中的 5000 张图像全部进行训练,训练一个 epoch 将花费 4-6 个小时。如果由于某种原因您必须终止训练,利用以下命令,将从上次保存的 epoch 处重新开始训练。
    1. ./transfer_learning.py -e10 -r13 -b gpu –save_path train.prm
    2. –serialize 1 –history 20 –model_file train.prm > train.log
    3. 2>&1 &
    复制代码
如欲获取本文使用的预训练模型,。
如欲获取传输学习后获得的完全训练模型。
您可以使用训练模型在 Pascal VOC 数据集上分类(通过 AlexNet)。
返回列表