读取和存储
在实际中,我们有时需要把训练好的模型部署到很多不同的设备。在这种情况下,我们可以把内存中训练好的模型参数存储在硬盘上供后续读取使用。
读写NDArray
可以直接使用save
函数和load
函数分别存储和读取NDArray
创建了NDArray
变量x
,并将其存在文件名同为x
的文件里:
#导包
from mxnet import nd
from mxnet.gluon import nn
#x=(1,1,1)
x = nd.ones(3)
#保存在x文件里
nd.save('x', x)
将数据从存储的文件读回内存:
#从x文件里读回内存
x2 = nd.load('x')
x2
可以存储一列NDArray
并读回内存:
#y=[0,0,0,0]
y = nd.zeros(4)
#将x,y分别存入xy文件中
nd.save('xy', [x, y])
#从内存中取出x2,y2
x2, y2 = nd.load('xy')
(x2, y2)
甚至可以存储并读取一个从字符串映射到NDArray
的字典:
mydict = {'x': x, 'y': y}
nd.save('mydict', mydict)
mydict2 = nd.load('mydict')
mydict2
读写Gluon模型的参数
除NDArray
以外,我们还可以读写Gluon
模型的参数。Gluon
的Block
类提供了save_parameters
函数和load_parameters
函数来读写模型参数.
#同前面的章节
class MLP(nn.Block):
def __init__(self, **kwargs):
super(MLP, self).__init__(**kwargs)
self.hidden = nn.Dense(256, activation='relu')
self.output = nn.Dense(10)
def forward(self, x):
return self.output(self.hidden(x))
net = MLP()
net.initialize()
X = nd.random.uniform(shape=(2, 20))
Y = net(X)
下面把该模型的参数存成文件,文件名为mlp.params
#指明文件名
filename = 'mlp.params'
#存储参数
net.save_parameters(filename)
再实例化一次定义好的多层感知机。与随机初始化模型参数不同,我们在这里直接读取保存在文件里的参数。
#实例化一个MLP
net2 = MLP()
#加载保存好的参数
net2.load_parameters(filename)
因为这两个实例都有同样的模型参数,那么对同一个输入X的计算结果将会是一样的。来验证一下:
Y2 = net2(X)
Y2 == Y
#output:
[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]
<NDArray 2x10 @cpu(0)>