Fas*_*sty 4 python computer-vision keras tensorflow machine-learning-model
我试图加载我在训练期间保存的 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 saving_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)
Run Code Online (Sandbox Code Playgroud)
如果您想加载已保存模型的特定层的权重,则需要使用by_name=True. 有些用例需要这种类型的加载。
loadedh5_model.load_weights('./MyModel_h5.h5',by_name=True, skip_mismatch=False)
Run Code Online (Sandbox Code Playgroud)
到目前为止,仅当tf.keras.Model在模型创建中使用继承自的用户定义类时才支持“tf”格式。
从 TensorFlow 格式加载权重时,仅支持拓扑加载 (by_name=False)。请注意,对于从 tf.keras.Model 继承的用户定义类,TensorFlow 和 HDF5 格式之间的拓扑加载略有不同:HDF5 基于权重的扁平列表进行加载,而 TensorFlow 格式则基于属性的对象局部名称进行加载。层在模型的构造函数中分配。
主要原因是权重的h5格式和tf格式的方式。例如,考虑Case 1HDF5 根据权重扁平列表加载的位置。加载重量时没有任何错误。然而,在 中Case 2,模型user defined classes需要不同的方法,而不仅仅是加载扁平权重。为了负责分配自定义类的权重,“tf”格式根据模型构造函数中分配给层的属性的对象本地名称加载权重。
keras网站中提到的以下段落,进一步阐明了
加载 TensorFlow 格式的权重文件时,返回与 tf.train.Checkpoint.restore 相同的状态对象。构建图形时,一旦网络构建完成,恢复操作就会自动运行(第一次调用继承自 Model 的用户定义类时,如果已经构建,则立即运行)。
另一点需要理解的是,kerasFunctional或Sequential模型是层的静态图,可以毫无问题地使用扁平权重。Keras 子类化模型(如我们的案例 2 所示)是一段 Python 代码(一个调用方法)。没有图层图。因此,一旦使用自定义类构建了网络,就会运行恢复操作来更新状态对象。希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
2416 次 |
| 最近记录: |