昇思25天学习打卡营第8天|模型权重与 MindIR 的保存加载

目录

导入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)

        运行截图:

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值