我试图加载我在训练期间保存的 keras 模型。所以我去了keras 文档,在那里我看到了这个。
从 TensorFlow 格式加载权重时,仅支持拓扑加载 (by_name=False)。请注意,对于继承自 tf.keras.Model 的用户定义类,拓扑加载在 TensorFlow 和 HDF5 格式之间略有不同:HDF5 加载基于扁平化的权重列表,而 TensorFlow 格式加载基于属性的对象本地名称图层在模型的构造函数中分配。
你能解释一下上面的吗?
我试图加载我在训练期间保存的 keras 模型。所以我去了keras 文档,在那里我看到了这个。
从 TensorFlow 格式加载权重时,仅支持拓扑加载 (by_name=False)。请注意,对于继承自 tf.keras.Model 的用户定义类,拓扑加载在 TensorFlow 和 HDF5 格式之间略有不同:HDF5 加载基于扁平化的权重列表,而 TensorFlow 格式加载基于属性的对象本地名称图层在模型的构造函数中分配。
你能解释一下上面的吗?
为了清楚起见,让我们考虑两种情况。
案例 1:简单模型,
案例 2:使用继承自的用户定义类的复杂模型tf.keras.Model
。
当您保存模型权重(使用model.save_weights
)然后加载权重(使用model.load_weights
)时,默认情况下该load_weights
方法使用拓扑加载。这对于 Tensorflow saved_model ('tf') 格式和 'h5' 格式是一样的。例如,
loadedh5_model.load_weights('./MyModel_h5.h5')
# the line above is same as the line below (as second and third arguments are default)
#loadedh5_model.load_weights('./MyModel_h5.h5',by_name=False, skip_mismatch=False)
如果要加载已保存模型的特定层的权重,则需要使用by_name=True
. 有些用例需要这种类型的加载。
loadedh5_model.load_weights('./MyModel_h5.h5',by_name=True, skip_mismatch=False)
tf.keras.Model
到目前为止,仅当在模型创建中使用继承自的用户定义类时才支持“tf”格式。
从 TensorFlow 格式加载权重时,仅支持拓扑加载 (by_name=False)。请注意,对于继承自 tf.keras.Model 的用户定义类,拓扑加载在 TensorFlow 和 HDF5 格式之间略有不同:HDF5 加载基于扁平化的权重列表,而 TensorFlow 格式加载基于属性的对象本地名称图层在模型的构造函数中分配。
主要原因是权重的h5
格式和tf
格式。例如,考虑Case 1
基于扁平化权重列表加载 HDF5 的位置。重量加载没有任何错误。然而,在 中Case 2
,模型user defined classes
需要不同的方法,而不仅仅是加载扁平权重。为了照顾分配自定义类的权重,'tf' 格式根据模型构造函数中分配层的属性的对象本地名称加载权重。
keras网站中提到的以下段落,进一步阐明
加载 TensorFlow 格式的权重文件时,返回与 tf.train.Checkpoint.restore 相同的状态对象。在构建图形时,一旦网络构建完成,恢复操作就会自动运行(在第一次调用从模型继承的用户定义类时,如果它已经构建,则立即运行)。
要理解的另一点是 kerasFunctional
或Sequential
模型是层的静态图,可以毫无问题地使用扁平权重。Keras 子类模型(如我们的案例 2 中)是一段 Python 代码(一个调用方法)。没有图层图。因此,一旦使用自定义类构建网络,就会运行恢复操作来更新状态对象。希望能帮助到你。