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

利用 Neon* 传输学习-1

利用 Neon* 传输学习-1

简介在过去几年间,许多深度神经网络 (DNN) 模型用于各种应用,如图像识别和语音翻译。上述模型通常针对特定目标,但是可以进一步扩展,应用于新型使用案例。例如,可以训练模型,以识别图像中的数字和字母,重复使用该模型,在更广泛的模型或数据集(用于自主驾驶)中阅读指示牌。
通过本博文,我们将会:
  • 介绍传输学习及一些传输学习应用
  • 介绍 neon 在传输学习中的应用
  • 介绍示例代码如何利用 neon* 将预训练模型传输到新数据集
  • 通过一些结果探索传输学习的价值
传输学习接触视觉分类任务。卷积神经网络 (CNN) 分为若干层,每一层学习特性的规模各不相同。低级别层识别低级特性,如猫的皮毛或砖墙的纹理。高级别层识别高级特性,如行人移动时的体型或汽车车窗的构造。
针对不同的分类任务,不同规模中学习的特性提供了优秀的特征向量。它们和基于内核的算法(人工操作员开发的)所获取的特征向量截然不同,因为后者通过大量的训练运行进行学习。这些训练运行旨在系统化地改进模型参数,以尽量减少预测输出,yp=f(xt)xt是真实世界中的信号,f() 是模型)和地面实况, yt, 之间的典型错误。
以下几个示例介绍了重复使用 CNN(经受良好训练)所学习的特性。Oquab 等。
[1] 展示了训练 AlexNet 模型识别包含单个对象的图像,其特性可以用于识别真实世界中复杂的图像对象。Szegedy 等。[2] 展示了在一个极为深入的深度神经网络中,半数层所学习的特性可以用于视觉分类。Bell 等。[] 展示了各种预训练 CNN 学习的材料特性(如木头、玻璃等),例如 AlexNet 和 GoogLeNet 可以完成其他不相关的任务,包括图像分割。预训练网络所学习的特性颇有成效,因为它们捕获了数据中的一般统计、空间一致性与层级元关系。
利用 neon 传输学习Neon 不仅在训练及推断 DNN 中表现卓越,还提供了丰富的生态系统,支持 DNN 的相关要求。例如,您可以序列化处理学习模型,加载预训练或部分训练模型,选择行业专家构建的 DNN,并在云中运行,无需自备物理基础设施。如欲获取有关 neon API 的全面概述,。
加载模型的预训练权重,并利用以下两行代码在每层获取权重:
from neon.util.persist import load_obj

pre_trained_model = load_obj(filepath)

pre_trained_layers = pre_trained_model['model']['config']['layers']



然后,在模型中利用以下代码将权重从预学习层传输至兼容层:
  1. layer_of_new_model.load_weights(pre_trained_layer, load_states=True)
复制代码
将权重从预学习模型传输至模型中几个指定的层,这个任务变得非常简单:
new_layers = [l for l in new_model.layers.layers]

for i, layer in enumerate(new_layers):

    if load_pre_trained_weight(i, layer):

        layer.load_weights(pre_trained_layers, load_states=True)



就这么简单!您已将预训练模型有选择地传输至 neon。我们将在下文探讨:1) 如何构建新模型,2) 如何有选择地编写代码,尽可能地重复利用 neon 框架,3) 如何在 neon 中快速准确地训练新模型,无需进行大量的全新训练练习。我们将通过实施 Oquab 等人的项目来探索这些问题。[].
利用单个对象上训练的权重进行一般性场景分类ImageNet 是非常流行的数据集,训练数据集的图像主要代表了 1000 种不同类型的单个对象。它是一个优秀的数据库,用于获取代表单个对象的特征向量。然而,真实世界的图像更加复杂,针对不同的规模,单个图像捕获的对象产生许多实例。这些场景因为合拢变得更加复杂。在不同规模和合拢程度下,人和牛的示例如下图所示。

通常使用两种技术对此类图像进行分类:1) 使用滑动多量程取样器,对图像的一小部分进行分类,2) 有选择地传输复杂算法发现的区域提议,最后传输至 DNN,进行分类。如欲了解有关利用 Fast R-CNN 实施第二种方法的详细信息[],。Fast R-CNN 还利用传输学习提升训练速度。本章节将探讨更易实施的第一种方法。如欲了解有关该实施的详细信息。该实施  利用一个 AlexNet 模型(在 ImageNet 上预训练),在 Pascal VOC 上进行训练。
实施的核心结构很简单:
def main():

  

    # Collect the user arguments and hyper parameters

    args, hyper_params = get_args_and_hyperparameters()

  

    # setup the CPU or GPU backend

    be = gen_backend(**extract_valid_args(args, gen_backend))

  

    # load the training dataset. This will download the dataset

    # from the web and cache it locally for subsequent use.

    train_set = MultiscaleSampler('trainval', '2007', ...)

  

    # create the model by replacing the classification layer

    # of AlexNet with new adaptation layers

    model, opt = create_model( args, hyper_params)

  

    # Seed the Alexnet conv layers with pre-trained weights

    if args.model_file is None and hyper_params.use_pre_trained_weights:

        load_imagenet_weights(model, args.data_dir)

  

    train( args, hyper_params, model, opt, train_set)

  

    # Load the test dataset. This will download the dataset

    # from the web and cache it locally for subsequent use.

    test_set = MultiscaleSampler('test', '2007', ...)

    test( args, hyper_params, model, test_set)

  

    return
返回列表