read-write.md 2.8 KB
Newer Older
1
# 读取和存储
M
muli 已提交
2

A
rw  
Aston Zhang 已提交
3
到目前为止,我们介绍了如何处理数据以及构建、训练和测试深度学习模型。然而在实际中,我们有时需要把训练好的模型部署到很多不同的设备。这种情况下,我们可以把内存中训练好的模型参数存储在硬盘上供后续读取使用。
M
muli 已提交
4 5


A
Aston Zhang 已提交
6
## 读写NDArrays
M
muli 已提交
7

R
rongruosong 已提交
8
我们首先看如何读写NDArray。我们可以直接使用`save``load`函数分别存储和读取NDArray。下面的例子我们创建`x`,并将其存在文件名同为`x`的文件里。
M
muli 已提交
9

A
Aston Zhang 已提交
10
```{.python .input}
M
muli 已提交
11
from mxnet import nd
A
rw  
Aston Zhang 已提交
12
from mxnet.gluon import nn
M
muli 已提交
13

M
Mu Li 已提交
14 15 16
x = nd.ones(3)
nd.save('x', x)
```
A
Aston Zhang 已提交
17

M
Mu Li 已提交
18
然后我们再将数据从文件读回内存。
A
Aston Zhang 已提交
19

M
Mu Li 已提交
20 21 22
```{.python .input}
x2 = nd.load('x')
x2
M
muli 已提交
23 24
```

S
Sheng Zha 已提交
25
同样我们可以存储一列NDArray并读回内存。
M
muli 已提交
26

M
Mu Li 已提交
27 28 29 30 31
```{.python .input  n=2}
y = nd.zeros(4)
nd.save('xy', [x, y])
x2, y2 = nd.load('xy')
(x2, y2)
M
muli 已提交
32 33
```

M
Mu Li 已提交
34
或者是一个从字符串到NDArray的字典。
M
muli 已提交
35 36

```{.python .input  n=4}
M
Mu Li 已提交
37 38 39 40
mydict = {'x': x, 'y': y}
nd.save('mydict', mydict)
mydict2 = nd.load('mydict')
mydict2
M
muli 已提交
41 42 43 44
```

## 读写Gluon模型的参数

A
Aston Zhang 已提交
45
Block类提供了`save_parameters``load_parameters`函数来读写模型参数。它实际做的事情就是将所有参数组成一个从名称到NDArray的字典并保存到文件。读取的时候会根据参数名称找到对应的NDArray并赋值。下面的例子我们首先创建一个多层感知机,初始化后将模型参数保存到文件里。
M
muli 已提交
46

A
rw  
Aston Zhang 已提交
47
下面,我们创建一个多层感知机。
M
muli 已提交
48

A
rw  
Aston Zhang 已提交
49
```{.python .input  n=6}
M
Mu Li 已提交
50 51 52 53 54
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)
A
Aston Zhang 已提交
55

M
Mu Li 已提交
56 57 58 59
    def forward(self, x):
        return self.output(self.hidden(x))

net = MLP()
M
muli 已提交
60
net.initialize()
M
Mu Li 已提交
61 62 63 64

# 由于延后初始化,我们需要先运行一次前向计算才能实际初始化模型参数。
x = nd.random.uniform(shape=(2, 20))
y = net(x)
M
muli 已提交
65 66
```

A
rw  
Aston Zhang 已提交
67
下面我们把该模型的参数存起来。
M
muli 已提交
68 69

```{.python .input}
A
Aston Zhang 已提交
70
filename = 'mlp.params'
A
Aston Zhang 已提交
71
net.save_parameters(filename)
M
muli 已提交
72 73
```

R
rongruosong 已提交
74
然后,我们再实例化一次我们定义的多层感知机。但跟前面不一样的是我们不是随机初始化模型参数,而是直接读取保存在文件里的参数。
M
muli 已提交
75 76

```{.python .input  n=8}
M
Mu Li 已提交
77
net2 = MLP()
A
Aston Zhang 已提交
78
net2.load_parameters(filename)
M
Mu Li 已提交
79 80 81 82 83 84 85
```

因为这两个实例都有同样的参数,那么对同一个`x`的计算结果将会是一样。

```{.python .input}
y2 = net2(x)
y2 == y
M
muli 已提交
86 87
```

A
Aston Zhang 已提交
88
## 小结
M
muli 已提交
89

A
Aston Zhang 已提交
90
* 通过`save``load`可以很方便地读写NDArray。
A
Aston Zhang 已提交
91
* 通过`load_parameters``save_parameters`可以很方便地读写Gluon的模型参数。
A
rw  
Aston Zhang 已提交
92 93

## 练习
S
Sheng Zha 已提交
94

A
rw  
Aston Zhang 已提交
95
* 即使无需把训练好的模型部署到不同的设备,存储模型参数在实际中还有哪些好处?
A
Aston Zhang 已提交
96 97 98

## 扫码直达[讨论区](https://discuss.gluon.ai/t/topic/1255)

A
rename  
Aston Zhang 已提交
99
![](../img/qr_read-write.svg)