我的目标是从 .hdf5 文件加载基本模型(它是 Keras 模型),并继续通过联合学习对其进行训练。以下是我初始化 FL 基本模型的方法:
def model_fn():
model = tf.keras.load_model(path/to/model.hdf5)
return tff.learning.from_keras_model(model=model,
dummy_batch=db,
loss=loss,
metrics=metrics)
trainer = tff.learning.build_federated_averaging_process(model_fn)
state = trainer.initialize()
然而,似乎生成的 state.model 权重是随机初始化的,并且与我保存的模型不同。当我在任何联合训练之前评估模型的性能时,它的性能就像随机初始化的模型一样:准确度为 50%。以下是我评估性能的方式:
def evaluate(state):
keras_model = tf.keras.models.load_model(path/to/model.hdf5, compile=False)
tff.learning.assign_weights_to_keras_model(keras_model, state.model)
keras_model.compile(loss=loss, metrics=metrics)
return keras_model.evaluate(features, values)
如何使用保存的模型权重初始化 tff 模型?
是的,我认为预计initialize
将重新运行初始化程序并返回该值。
然而,有一种方法可以用 TFF 来做这样的事情。 TFF 是强类型和函数式的 - 如果我们可以使用正确的值构造一个参数,该参数与上面的联合平均过程所期望的类型相匹配,那么事情应该“正常工作”。所以这里的目标是构造满足这些要求的论证。
您可以查看FileCheckpointManager's加载实施在这里寻求一点灵感,但我认为 Keras 的情况更简单。
假设你有手state
就像上面和model
您的 Keras 模型,这里有一个解包和重新打包所有内容的快捷方式 - 如中所示本节TFF 的教程之一——即使用tff.learning.state_with_new_model_weights。如果您具有上述状态和模型(并且 TF 处于 eager 模式),则以下内容应该适合您:
state = tff.learning.state_with_new_model_weights(
state,
trainable_weights=[v.numpy() for v in model.trainable_weights],
non_trainable_weights=[
v.numpy() for v in model.non_trainable_weights
])
这应该将模型的权重重新分配给模型的适当元素state
object.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)