Press "Enter" to skip to content

MindSpore深度学习入门-LeNet模型理解深度学习一般化过程

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

深度学习一般化过程理解

 

Mindspore docs工程代码:https://gitee.com/mindspore/docs.git
LeNet实例源码位置:*/docs/tutorials/tutorial_code/lenet

 

接续上一篇的实例实践,通过前面运行MindSpore的LeNet实例代码了解了一个经典的手写字体识别模型在框架中使用的情况,本篇尝试从该代码实例开始,围绕模型为核心来深入分析和总结深度学习的一般化过程以及需要重点掌握的知识点。

 

从实践来看深度学习的领域“模型”是核心,所有的操作最终都是围绕模型来建立的。通常深度学习应用过程抽象为以下一般过程。

 

 

1)深度学习应用结构-“输入-处理-输出”

 

深度学习尽管本身是专属领域的范畴,但是其在应用过程中依然离不开IT通用的化的过程,任何的部署成可执行程序的模式基本的结构都是相通的。

“输入-处理-输出”的结构是通用IT应用的基本结构,对于人工智能的深度学习方法也是同样适用;
不同之处人工智能的深度学习方法到能够落地应用通常分为两个关键步骤:

模型学习训练(深度学习的学习就凸显在模型的学习训练上,通过规模数据训练学习输出符合要求的模型)
模型的推理应用(其中推理会涉及应用的场景化部署,所以可能部署的方式各不同,比如数据中心、边缘等方式)

2)核心围绕-“数据”

 

深度学习离不开数据,所有的模型训练即学习的过程,通过数据的输入处理不断的完善模型,在数据方面涉及规模数据的称呼为“数据集”。

通常一个模型要能够到达应用的地步,离不开两类数据集:

训练数据集(LeNet例子中MNIST数据集中的train-images-idx3-ubyte和train-labels-idx1-ubyte)
测试数据集(LeNet例子中MNIST数据集中的t10k-images-idx3-ubyte和t10k-labels-idx1-ubyte)

另外在模型训练完成后:

会生成带有训练参数优化的输出的模型文件数据,比如MindSpore中提供的模型输出文件,后续会深入分析。
实际部署应用中会涉及相应的模型验证评估和推理处理的请求和输出结果数据,比如图像识别中人脸识别应用,实时捕捉人脸数据作为服务“请求数据”进行识别,以及结果数据的输出。

3)深度学习的两个关键过程“模型训练”和“模型推理”

 

深度学习的学习就体现在学习数据、训练模型上面,通过海量的数据输入结合特定的网络模型来进行训练和学习,最终输出具备一定精准度的模型文件,供后续推理使用。

模型训练

在人工智能的深度学习方面,模型是核心,其中基于神经网络构建的模型是当前主流的模型方法,因此模型训练包括如下过程:

 

 

1)输入数据的准备;模型训练通常输入数据采用数据集的方式来管理,不同的数据集可能存在不同的格式,后续会介绍MindSpore在数据集处理上提供的核心能力。

 

2)模型训练过程,根据神经网络先选择定义匹配的网络,结合训练的数据集来训练相应的模型,这个模型是带有某种内置数学手段的输出物,最终会生成模型的文件(存放训练结果的数据)。

 

3)模型是一个训练的结果输出物,在MindSpore上采用了checkpoints的快照模式,来支持多次训练的输出或者中断时候恢复,同时MindSpore还提供了统一的模型文件MindIR格式,用于部署态不同云、边等环境统一部署。

模型评估和推理

模型评估

结合数据集和相应的神经网络等训练方法输出相应的模型数据,该模型数据如何评估其准确性和精度,就需要通过模型评估的方法,结合输入的测试数据集(如MNIST数据集中的测试数据集t10k-images-idx3-ubyte和t10k-labels-idx1-ubyte)

 

评估的结果往往是输出模型的精度,比如图片训练结合测试数据的识别度,精度往往可以通过选择不同的神经网络方法、包括网络参数的调整来提升。

模型推理

当模型训练输出后,要进入应用场景时候,需要发布和部署成功输出的模型,通常如果要提供在线服务,都会部署成可以提供在线处理的服务模式,供在线应用。

 

Mindspore框架的相应能力说明

 

官方入门教程地址:https://www.mindspore.cn/tutorial/zh-CN/r1.2/quick_start.ht

 

MindSpore官方网站提供了以LeNet模型为开篇入门教程,总结了Mindspore作为一个深度学习框架在其提供的开放能力之上使用的一般过程。

 

这里我们借助这个过程来简单分析MindSpore为其使用者提供了哪些核心的能力来支持深度学习的一般化过程。

 

 

MindSpore中提供给用户使用的是最上层的高阶API,高阶的API虽然也有java和c++语言提供的,大多数情况下还是以python提供为主。

 

要完成一个基本的LeNet模型训练及推理,MindSpore中提供的几个基础核心能力应用即可:

 

1)框架上下文(mindspore.context)

 

MindSpore框架的上下文封装,框架提供的相关图模式、PYNATIVE_MODE、并行计算相关的配置都在其中设定,比如前面实例指定LeNet在CPU上运行,默认模式device_target指定为CPU。

 

context.set_context(mode=context.GRAPH_MODE, device_target=args.device_target)

 

2)数据集(mindspore.dataset)

 

MindSpore在数据集方面提供了丰富的能力,dataset中针对不同的数据集的格式都有统一的封装,具体的说明如下。

 

https://www.mindspore.cn/doc/api_python/en/r1.2/mindspore/mindspore.dataset.html

 

对于LeNet模型实例,选择对应的数据集封装使用“mindspore.dataset.MnistDataset”类即可。

 

3)构建神经网络相关(mindspore.nn)

 

MindSpore在核心的神经网络模型的构建上通过Cell类的基本神经网络单元类来构建最终的网络。比如LeNet中,就采用继承mindspore.nn.Cell的方式来构建,在该类中可以定义各类具体的神经网络方法来训练相应的模型。比如在LeNet中采用Conv2d来定义卷积神经网络的方式来构建网络。

 

class LeNet5(nn.Cell):
    """Lenet network structure."""
    # define the operator required
    def __init__(self, num_class=10, num_channel=1):
        super(LeNet5, self).__init__()
        self.conv1 = nn.Conv2d(num_channel, 6, 5, pad_mode='valid')
        self.conv2 = nn.Conv2d(6, 16, 5, pad_mode='valid')
        ......

 

4)模型训练、推理相关(mindspore.train)

 

其中主要的提供的模型训练、推理的核心API封装,LeNet实例中直接使用提供Model封装类即可完成大部分模型训练和推理的操作。比如在LeNet实例中封装的train_net训练模型、test_net评估模型、test_predict推理三个主要方法,内部核心都使用了Model类提供的方法。

 

#提供模型训练API
network_model.train(epoch_size, ds_train, callbacks=[ckpoint_cb, LossMonitor()], dataset_sink_mode=sink_mode)
#提供模型评估API
network_model.eval(ds_eval, dataset_sink_mode=False)
#提供模型推理API
network_model.predict(Tensor(data['image']))

 

5)输出模型文件相关

 

在MindSpore的输出模型文件方面,提供了两类核心能力:

一类采用类似快照机制,输出训练的过程文件,用于多次训练能够回溯或者中断恢复之前的模型数据处理,在MindSpore中封装在回调mindspore.train.callback中,LeNet实例中如下。每次训练结束都输出一个checkpoint模型文件,可以用于推理处理。

# save the network model and parameters for subsequence fine-tuning
ckpoint = ModelCheckpoint(prefix="checkpoint_lenet", config=config_ck)

一类最终发布的模型文件,采用自定义的MindIR格式,目的是为了可以在不同的硬件体系,如云中心或者边缘、终端等体系直接运行。可以基于某个checkpoint模型文件来最终输出。

def export_mr():
    print("============== Export MindIR ==============")
    resnet = LeNet5()
    # load the parameter into net
    param_dict = load_checkpoint("checkpoint_lenet-1_1875.ckpt")
    load_param_into_net(resnet, param_dict)
    input = np.random.uniform(0.0, 1.0, size=[32, 1, 32, 32]).astype(np.float32)
    export(resnet, Tensor(input), file_name='checkpoint_lenet-2-1_1875', file_format='MINDIR')

 

总结:

 

MindSpore是一个全场景的深度学习框架,全场景体现在其适应云端、边缘、终端等各类基础设施形态上运行;深度学习框架是其总结抽象了深度学习的一般化过程,通过可以被应用开发者使用的API方式开放其支持深度学习应用开发的能力。

 

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注