2

我的目标是从 .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 模型?

4

1 回答 1

1

是的,我认为预计initialize会重新运行初始化程序并返回此值。

但是,有一种方法可以用 TFF 做这样的事情。TFF 是强类型和功能性的——如果我们可以构造一个具有正确值的参数,它与上述联合平均过程所期望的类型相匹配,那么事情应该“正常工作”。所以这里的目标是构建一个满足这些要求的论点。

您可以在这里查看FileCheckpointManager's加载实现以获得一些灵感,但我认为您使用 Keras 的情况更简单。

假设您已经掌握了state上述内容和modelKeras 模型,这里有一个解包和重新打包所有内容的快捷方式——如TFF 教程之一的本节所述——即tff.learning.state_with_new_model_weights. 如果您具有上述状态和模型(并且 TF 处于渴望模式),则以下内容应该适合您:

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

于 2020-05-14T04:17:12.437 回答