目录
导入Python 库和模块
创建神经网络模型
保存和加载模型权重
保存和加载MindIR
导入Python 库和模块
上一章节着重阐述了怎样对超参数予以调整,以及如何开展网络模型的训练工作。在网络模型训练的整个进程当中,事实上我们满怀期望能够留存中间阶段以及最终的成果,以便用于细微的调整(fine-tune)以及后续的模型推理和部署操作。在本章节,我们将会为您介绍怎样去保存以及加载模型。
首先,我们进行了一系列的 Python 库和模块的导入操作:我们导入了 NumPy 库,并将其简称为 np 。要知道,NumPy 通常被广泛应用于数值计算领域以及数组相关的操作之中。此外,我们还导入了 MindSpore 库,MindSpore 乃是一个极为出色的深度学习框架。不仅如此,我们从 MindSpore 库中导入了 nn 模块,这里面或许涵盖了与神经网络相关联的各类类和函数。最后,我们还从 MindSpore 库中导入了 Tensor 类,其主要作用在于创建张量这种数据结构。
代码如下:
import numpy as np
import mindspore
from mindspore import nn
from mindspore import Tensor
创建神经网络模型
定义了一个被称作“network”的函数,此函数旨在创建一个神经网络模型。在该函数的内部,通过运用“nn.SequentialCell”构建了一个按照顺序相互连接的神经网络。最终,这个函数会返回构建完成的模型。
代码如下:
def network():
model = nn.SequentialCell(
#用于将输入数据展平为一维向量
nn.Flatten(),
#全连接层,输入维度为 28*28,输出维度为 512。
nn.Dense(28*28, 512),
#激活函数 ReLU 层。
nn.ReLU(),
#全连接层,输入维度为 512,输出维度为 512。
nn.Dense(512, 512),
#激活函数 ReLU 层。
nn.ReLU(),
#全连接层,输入维度为 512,输出维度为 10。
nn.Dense(512, 10))
return model
保存和加载模型权重
当对模型进行保存操作时,将采用 save_checkpoint 这一接口,并将网络和特定指定的保存路径传入其中。
代码如下:
model = network()
mindspore.save_checkpoint(model, "model.ckpt")
分析:在 MindSpore 框架中,“model = network()”这行代码一般而言是创建了一个被命名为“model”的对象。此对象是通过对名为“network”的函数或者类的调用而得以生成。而“mindspore.save_checkpoint(model, "model.ckpt")”这行代码,其发挥的作用是借助 MindSpore 框架所提供的“save_checkpoint”函数,把创建好的“model”对象的当前状态保存至一个叫做“model.ckpt”的文件之中。之所以要进行这样的操作,通常是出于如下目的:在后续的一系列操作里,能够重新加载这个模型的状态,从而便于继续开展训练工作、执行预测任务,或者实现模型的迁移以及部署等相关操作。
要实现模型权重的加载,第一步是创建相同的模型实例,接下来则要通过 load_checkpoint 和 load_param_into_net 方法对参数予以加载。
代码如下:
model = network()
param_dict = mindspore.load_checkpoint("model.ckpt")
param_not_load, _ = mindspore.load_param_into_net(model, param_dict)
print(param_not_load)
分析:首先,通过 model = network() 创建了一个名为 model 的网络对象。
然后,使用 mindspore.load_checkpoint("model.ckpt") 从名为 "model.ckpt" 的文件中加载模型的检查点数据,并将其存储在 param_dict 中。
接着,通过 mindspore.load_param_into_net(model, param_dict) 尝试将加载的参数数据 param_dict 加载到模型 model 中。同时,返回未成功加载的参数以及一个相关的标识,未成功加载的参数存储在 param_not_load 中。
最后,使用 print(param_not_load) 输出未成功加载的参数。
运行结果:
[]
保存和加载MindIR
除了 Checkpoint 之外,MindSpore 为云侧(训练)和端侧(推理)提供了统一的中间表示(Intermediate Representation,IR)。用户能够通过 export 接口,直接将模型保存为 MindIR 格式。这种统一的中间表示和便捷的模型保存方式,为模型的训练和推理提供了高效且便捷的支持,极大地提升了开发和应用的效率。
代码如下:
model = network()
inputs = Tensor(np.ones([1, 1, 28, 28]).astype(np.float32))
mindspore.export(model, inputs, file_name="model", file_format="MINDIR")
mindspore.set_context(mode=mindspore.GRAPH_MODE)
graph = mindspore.load("model.mindir")
model = nn.GraphCell(graph)
outputs = model(inputs)
print(outputs.shape)
分析:首先定义了一个叫做 model 的网络模型,接着准备了一个输入数据 inputs ,这个数据的值全是 1 ,并且是张量的形式。然后通过 mindspore.export 把模型和这个输入保存成 MINDIR 格式的文件,文件名就叫 model 。接下来设置 MindSpore 的运行环境为图模式。再去加载之前保存的 model.mindir 文件,并把它转变为 GraphCell 类型的模型。之后使用之前准备好的输入数据 inputs 来对模型进行推理运算,从而得到输出 outputs 。最后把输出的形状给打印出来。
运行结果:
(1, 10)
运行截图: