TFF 加载预训练的 Keras 模型

TFF loading a pre-trained Keras model

我的目标是从 .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 会重新运行初始化程序,并且 return 这个值。

但是,有一种方法可以用 TFF 做这样的事情。 TFF 是强类型和函数式的——如果我们可以构造一个具有正确值的参数,该参数与上面的联合平均过程所期望的类型相匹配,那么事情应该 "just work"。所以这里的目标是构建一个满足这些要求的论证。

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

假设您像上面那样亲手 state 并且 model 您的 Keras 模型,这里有一个解包和重新打包所有内容的快捷方式——如 this section of one of TFF's tutorials--that is, the usage of 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 对象的适当元素。