2

我试图加载我在训练期间保存的 keras 模型。所以我去了keras 文档,在那里我看到了这个。

从 TensorFlow 格式加载权重时,仅支持拓扑加载 (by_name=False)。请注意,对于继承自 tf.keras.Model 的用户定义类,拓扑加载在 TensorFlow 和 HDF5 格式之间略有不同:HDF5 加载基于扁平化的权重列表,而 TensorFlow 格式加载基于属性的对象本地名称图层在模型的构造函数中分配。

你能解释一下上面的吗?

4

1 回答 1

2

为了清楚起见,让我们考虑两种情况。
案例 1:简单模型,
案例 2:使用继承自的用户定义类的复杂模型tf.keras.Model

案例 1:简单模型(如在 keras 函数和顺序模型中)

当您保存模型权重(使用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)

案例 2:复杂模型(如 Keras 子类模型)

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 相同的状态对象。在构建图形时,一旦网络构建完成,恢复操作就会自动运行(在第一次调用从模型继承的用户定义类时,如果它已经构建,则立即运行)。

要理解的另一点是 kerasFunctionalSequential模型是层的静态图,可以毫无问题地使用扁平权重。Keras 子类模型(如我们的案例 2 中)是一段 Python 代码(一个调用方法)。没有图层图。因此,一旦使用自定义类构建网络,就会运行恢复操作来更新状态对象。希望能帮助到你。

于 2020-05-10T15:52:31.593 回答