1. save 方法
- 以Tensorflow SavedModel(文件夹)或者一个单个的HDF5文件保存一个模型.
- 保存文件里边包括以下信息:
1.模型的网络结构,这允许重新实例化模型
2.模型的权重信息
3.优化器的状态,允许在你停止的地方重新开始训练
Model.save(
filepath,
overwrite=True,
include_optimizer=True,
save_format=None,
signatures=None,
options=None,
)
-
这允许您将模型的整个状态保存在一个文件中
-
被保存的模型可以通过keras.models.load_model来重新实例化load_model返回的模型是一个已编译的模型,可以直接使用(除非保存的模型从未被编译过)
-
通过Model或者Squential建立的模型可以被保存为HDF5文件或者SavedModel 格式(一个文件夹);而通过继承Model或者Squential来创建的模型只能被保存为SavedModel格式
-
如果没有对模型中的参数,layer命名(使用默认命名规则),则再次加载模型时,名字可能不太一样。所以推荐对模型的layer等参数自定义名字
-
参数:
- filepath:字符串,路径类似,SavedModel或H5文件的存储路径,以保存模型
- overwrite:如果目标路径存在,是否覆盖,或者为用户提供一个手动的提示,默认为True
- include_optimizer:如果为True,则保存优化器的状态
- save_format:值为"tf"或者"h5"是否将模型保存为Tensorflow SavedModel或HDF5。在TF2.X中默认为“tf”。和TF 1.X中的’h5’
- 例子
from keras.models import load_model
model.save('my_model.h5') # creates a HDF5 file 'my_model.h5'
del model # deletes the existing model
# returns a compiled model
# identical to the previous one
model = load_model('my_model.h5') # 模型被保存为my_model.h5文件,文件包括三个内容上面讲过了
2. save_model 方法
- 它和save方法的区别为:save方法需要通过对象进行调用,save_model可以直接调用,里边第一个参数是需要保存的模型,其他均一样,两者异曲同工
tf.keras.models.save_model(
model,
filepath,
overwrite=True,
include_optimizer=True,
save_format=None,
signatures=None,
options=None,
)
- SavedModel序列化:
SavedModel序列化路径使用tf.saved_model.save去保存模型和所有附加在模型上可追踪的对象(例如:layers和variables)。同时被 ‘@tf.function’ 修饰的函数也将会被保存
3. load_model 方法
- 加载已经保存的模型
tf.keras.models.load_model(
filepath, custom_objects=None, compile=True, options=None
)
- 用法:
>>> model = tf.keras.Sequential([
... tf.keras.layers.Dense(5, input_shape=(3,)),
... tf.keras.layers.Softmax()])
>>> model.save('/tmp/model')
>>> loaded_model = tf.keras.models.load_model('/tmp/model')
>>> x = tf.random.uniform((10, 3))
>>> assert np.allclose(model.predict(x), loaded_model.predict(x))
- 参数:
- Return:
返回一个keras model对象。如果原模型被compile了,并且记录了optimizer的信息,那么返回的模型将会被compile;否则模型会处于uncompiled的状态。如果返回了一个uncompiled模型,并且参数compile参数被设置成了True,会引发一个Warning
4. get_weights 方法
- 获取模型的权重信息
Model.get_weights()
- Return:
Numpy数组的列表
5. set_weights 方法
- 设置layer的权重,从Numpy数组
Model.set_weights(weights)
- layer的权重表示layer的状态。这个函数通过传入的numpy数组来设置layer的权重。权重值应该按照layer创建的顺序传递。请注意,layer的权重必须在通过调用层调用此函数之前实例化,也即是说调用该函数时,layer一定要有weights
- 例子
>>> a = tf.keras.layers.Dense(1,
... kernel_initializer=tf.constant_initializer(1.))
>>> a_out = a(tf.convert_to_tensor([[1., 2., 3.]]))
>>> a.get_weights()
[array([[1.],
[1.],
[1.]], dtype=float32), array([0.], dtype=float32)]
>>> b = tf.keras.layers.Dense(1,
... kernel_initializer=tf.constant_initializer(2.))
>>> b_out = b(tf.convert_to_tensor([[10., 20., 30.]]))
>>> b.get_weights()
[array([[2.],
[2.],
[2.]], dtype=float32), array([0.], dtype=float32)]
>>> b.set_weights(a.get_weights())
>>> b.get_weights()
[array([[1.],
[1.],
[1.]], dtype=float32), array([0.], dtype=float32)]
6. load_weights 方法
- 从Tensorflow或者HDF5权重文件中加载所有layer的权重信息
Model.load_weights(filepath, by_name=False, skip_mismatch=False, options=None)
-
如果’by_name’为False,那么将会基于网络的拓扑结构进行加载。这意味着架构应该与保存权重时相同。请注意,没有权重的层在拓扑排序中是不考虑的,所以添加或删除层是好的,只要它们没有权重
-
如果’by_name’为True,权重只有在具有相同名称的层中才被加载。这对于在某些层发生变化的情况下进行微调或迁移学习模型非常有用。
-
当从Tensorflow格式文件中加载权重时,仅支持拓扑加载;
-
注意,对于从tf.keras.Model继承的用户定义类,TensorFlow和HDF5格式之间的拓扑加载略有不同:HDF5加载基于一个扁平的权重列表,而TensorFlow格式加载基于对象-属性的本地名称,这些属性在模型的构造函数中被分配
7. get_config 方法
- 返回layer的配置信息
Model.get_config()
- 层配置是Python字典(可序列化),包含层的配置。以后可以从这个配置中重新恢复一模一样的层(不包括经过训练的权重)
- 层的配置不包括连接信息,也不包括层类名。这些是由网络(上面的抽象层)处理的。
8. from_config 方法
- **创建一个layer通过它的配置信息,这个方法是get_config的反向操作,能够从配置字典实例化同一层。它不处理层连接(由Network处理),也不处理权重(由set_weights处理)
**
Model.from_config(config, custom_objects=None)
9. model_from_config 方法
- 实例化一个keras model从配置信息(字典)中,用处不大暂时
tf.keras.models.model_from_config(config, custom_objects=None)