Mindspore docs工程代码:https://gitee.com/mindspore/docs.git
LeNet实例源码位置:*/docs/tutorials/tutorial_code/lenet
接续上一篇的实例实践,通过前面运行MindSpore的LeNet实例代码了解了一个经典的手写字体识别模型在框架中使用的情况,本篇尝试从该代码实例开始,围绕模型为核心来深入分析和总结深度学习的一般化过程以及需要重点掌握的知识点。
从实践来看深度学习的领域“模型”是核心,所有的操作最终都是围绕模型来建立的。通常深度学习应用过程抽象为以下一般过程。
1)深度学习应用结构-“输入-处理-输出”
深度学习尽管本身是专属领域的范畴,但是其在应用过程中依然离不开IT通用的化的过程,任何的部署成可执行程序的模式基本的结构都是相通的。
2)核心围绕-“数据”
深度学习离不开数据,所有的模型训练即学习的过程,通过数据的输入处理不断的完善模型,在数据方面涉及规模数据的称呼为“数据集”。
3)深度学习的两个关键过程“模型训练”和“模型推理”
深度学习的学习就体现在学习数据、训练模型上面,通过海量的数据输入结合特定的网络模型来进行训练和学习,最终输出具备一定精准度的模型文件,供后续推理使用。
在人工智能的深度学习方面,模型是核心,其中基于神经网络构建的模型是当前主流的模型方法,因此模型训练包括如下过程:
1)输入数据的准备;模型训练通常输入数据采用数据集的方式来管理,不同的数据集可能存在不同的格式,后续会介绍MindSpore在数据集处理上提供的核心能力。
2)模型训练过程,根据神经网络先选择定义匹配的网络,结合训练的数据集来训练相应的模型,这个模型是带有某种内置数学手段的输出物,最终会生成模型的文件(存放训练结果的数据)。
3)模型是一个训练的结果输出物,在MindSpore上采用了checkpoints的快照模式,来支持多次训练的输出或者中断时候恢复,同时MindSpore还提供了统一的模型文件MindIR格式,用于部署态不同云、边等环境统一部署。
结合数据集和相应的神经网络等训练方法输出相应的模型数据,该模型数据如何评估其准确性和精度,就需要通过模型评估的方法,结合输入的测试数据集(如MNIST数据集中的测试数据集t10k-images-idx3-ubyte和t10k-labels-idx1-ubyte)
评估的结果往往是输出模型的精度,比如图片训练结合测试数据的识别度,精度往往可以通过选择不同的神经网络方法、包括网络参数的调整来提升。
当模型训练输出后,要进入应用场景时候,需要发布和部署成功输出的模型,通常如果要提供在线服务,都会部署成可以提供在线处理的服务模式,供在线应用。
官方入门教程地址: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的输出模型文件方面,提供了两类核心能力:
# save the network model and parameters for subsequence fine-tuning
ckpoint = ModelCheckpoint(prefix="checkpoint_lenet", config=config_ck)
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方式开放其支持深度学习应用开发的能力。
下一篇结合LeNet模型实例,来尝试深入理解下神经网络模型是怎么回事。