python - 你能解释 keras 模型中 tensorflow 加载和 hdf5 加载之间的区别吗

标签 python tensorflow keras computer-vision machine-learning-model

我试图加载我在训练期间保存的 keras 模型。所以我去了 keras documentation我在哪里看到的。

Only topological loading (by_name=False) is supported when loading weights from the TensorFlow format. Note that topological loading differs slightly between TensorFlow and HDF5 formats for user-defined classes inheriting from tf.keras.Model: HDF5 loads based on a flattened list of weights, while the TensorFlow format loads based on the object-local names of attributes to which layers are assigned in the Model's constructor.



你能解释一下上面的吗?

最佳答案

为了清楚起见,让我们考虑两种情况。
案例 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' 格式。用于模型创建。

Only topological loading (by_name=False) is supported when loading weights from the TensorFlow format. Note that topological loading differs slightly between TensorFlow and HDF5 formats for user-defined classes inheriting from tf.keras.Model: HDF5 loads based on a flattened list of weights, while the TensorFlow format loads based on the object-local names of attributes to which layers are assigned in the Model's constructor.



主要原因是权重在 h5 中的方式格式和 tf格式。
例如,考虑 Case 1其中 HDF5 基于扁平的权重列表加载。加载重量没有任何错误。然而,在 Case 2 , 型号有user defined classes这需要不同的方法,而不仅仅是加载扁平的权重。为了照顾分配自定义类的权重,“tf”格式根据在模型的构造函数中分配给图层的属性的对象本地名称加载权重。

keras 网站中提到的以下段落进一步阐明了

When loading a weight file in TensorFlow format, returns the same status object as tf.train.Checkpoint.restore. When graph building, restore ops are run automatically as soon as the network is built (on first call for user-defined classes inheriting from Model, immediately if it is already built).



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

关于python - 你能解释 keras 模型中 tensorflow 加载和 hdf5 加载之间的区别吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61678924/

相关文章:

python - 关于代码段的时间复杂度

python - 使用正则表达式替换文件数据

python - Matplotlib Contour Clabel 位置

python - Lucid 包使用 Tensorflow 包时出现问题

tensorflow - 降级 tensorflow 以使用 cuda 8

tensorflow - keras中提出的tree-lstm如何实现,树结构是如何构建的?

python - 如何向keras添加自定义指标? (平均绝对误差百分比)

python - Django 1.8 以及如何更改应用程序的迁移顺序

machine-learning - 为什么我的早期纪元比后续纪元花费的时间更长?

python - 如何将 `tf.scatter_nd` 与多维张量一起使用