这一章我们主要介绍一下模型保存的方式,我们训练fashion_mnist这个数据集作为例子
首先导入库
之后导入数据集
归一化
建立模型
编译模型
训练模型,我们训练三个epoch就行
之后我们评估一下这个模型
其中有一个参数verbose,它有两个可选值,0或1,0是不显示,1是显示,默认为1
下面我们来保存模型,模型有三个部分组成,分别是
- 模型权重(每一层的可训练参数是多少)
- 模型架构(神经网络的每一层是什么)
- 优化器配置(神经网络的编译情况)
我们下面先保存整个模型,我们下面的所有代码均是在进行完model.fit之后再执行的
目录
1 保存整个模型
我们之前保存的都是非h5文件,保存的是整个文件夹,那个是之前的写法,今后会逐渐废弃,我们一般将其保存为h5文件
之后我们依然使用tf.keras.models.load_model()就可以读取模型,我们新建一个文件
我们看一下这个模型
我们验证一下有没有保存权重,我们首先导入数据集,然后使用model.evaluate()评估一下
- 没有优化器是无法使用evaluate()进行评估的
2 仅保存架构
我们使用to_json()方法提取出模型架构
我们看一下json_config
可以发现json_config中记录了模型的很多属性,并且是一个str,我们可以把以上内容写到一个txt中
- json_config.txt如果没有的话会自动创建
- 仅保存架构就不需要再进行编译与训练了
我们打开看一下
发现字符串已经写入了json_config.txt,之后我们再另一个文件中进行调用
我们看一下这个模型
发现模型的架构被保存了下来
之后我们对这个模型评估一下
发现是无法评估的,因为我们当前的模型仅有架构,没有优化器
我们可以编译一下它再进行评估
发现可以评估
但效果不行,这个就表示,我们没有保存权重
3 仅保存权重
仅保存权重就使用在我们训练的过程中,我们训练中很有可能遇到突发情况打断训练,这个时候如果没有进行保存,我们就要重新开始训练,非常浪费时间,这个时候我们就需要保存一些东西,如果我们仅仅为了继续训练,我们仅保存权重就可以了,因为架构与编译在训练代码中一定是有的,如果将架构,权重,编译环境都保存就非常的浪费资源
3.1 获取与设置权重
我们先使用get_weights(),看一下权重是什么东西
发现是一个列表中包含了多个array
我们可以使用set_weight()将权重赋给模型,当然这对现在并没有什么用,只是展示一下有这样一个函数
3.2 保存与读取
我们可以使用save_weights()来仅仅保存权重
我们对比一下仅保存权重与刚刚全部保存模型的文件大小
发现权重文件比整体模型文件小了许多,这还是仅仅在只有三层的情况下
之后我们再另一个文件中使用load_weights()加载权重,刚刚我们先加载了模型架构,又增加了编译环节,之后我们对其加载权重
现在我们再对其进行评估
发现与我们之前训练的两个指标差不多