模型保存:
对于训练后的模型,模型的各个参数需要进行一定的保存,如果之后有新的数据想要进行训练,那么就可以使用原有的模型对新数据进行训练。
这一节比较简单。
用昨天写好的模型,训练完后,使用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)
使用静态图加速
先了解以下什么是静态图,什么是动态图。
静态图:
静态图在程序执行前定义好整个计算流程,即将计算步骤组织成一个静态的图形结构,其中节点表示操作(例如加法、乘法或卷积等),边表示数据流。这个图在编译阶段会被优化,然后生成高效的机器代码以供执行。
特点:
- 提前优化:由于计算图在运行前已经确定,编译器可以对其进行详尽的优化,比如消除冗余计算、内存分配优化等,从而提高运行时效率。
- 部署友好:优化后的静态图可以方便地序列化和部署到不同平台,适合于生产环境和移动设备。
- 调试不便:静态图构建过程相对复杂,尤其是当涉及到控制流时,调试起来不如动态图直观。
动态图(Dynamic Graph)
概念: 动态图是在运行时根据程序的实际执行动态构建计算图。这意味着图的结构可以在每次迭代或每个操作时改变,更加灵活地反映了程序的动态行为。
特点:
- 易于调试和快速迭代:开发者可以像编写常规程序那样一行行执行代码并立即看到结果,这对于调试和实验新想法非常有利。
- 表达能力强:动态图能自然地处理条件分支、循环等控制流结构,更适合实现复杂的算法逻辑。
- 性能开销:由于计算图是在运行时构建的,这可能会引入额外的 overhead,尤其是在需要频繁构建和销毁图的场景下,相较于静态图,其原始运行速度可能较慢。
TensorFlow 最初以静态图著称,但后来也支持了Eager Execution(动态图)模式;PyTorch 则是以动态图为核心设计,便于调试和快速迭代,但也通过 TorchScript 支持静态图执行以优化部署性能。
# 静态图
ms.set_context(mode=ms.GRAPH_MODE) # 使用set_context进行运行静态图模式的配置
# 动态图
ms.set_context(mode=ms.PYNATIVE_MODE) # 使用set_context进行动态图模式的配置
还可以通过@jit的方式,让某些运算时被编译为静态图。