TFF加载预训练的Keras模型

时间:2020-05-13 22:57:06

标签: tensorflow-federated

我的目标是从.hdf5文件(这是Keras模型)加载基本模型,并继续通过联合学习对其进行训练。这是我初始化FL基本模型的方法:

$ sed -n '/^{/,/^}/p' ./tojq
{
  "cars" : [ {
    "make" : "honda",
    "model" : "accord",
    "trim" : "ex"
  } ],
  "status" : "passed",
  "log-url" : "https://somesite.com/logurl"
}

但是,似乎状态state.model的权重是随机初始化的,并且与我保存的模型不同。当我甚至在进行任何联合训练之前就评估模型的性能时,它的表现都是随机初始化的模型:50%的准确性。这是我评估效果的方法:

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()

如何使用保存的模型权重初始化tff模型?

1 个答案:

答案 0 :(得分:1)

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

但是,有一种方法可以使用TFF进行此类操作。 TFF具有强类型和功能性-如果我们可以构造一个具有正确值的参数,该值与上述联邦平均过程期望的类型相匹配,则事情应该“正常”。因此,这里的目标是构造一个满足这些要求的参数。

您可以在这里向FileCheckpointManager's load implementation寻求一些启发,但我认为您与Keras的关系比较简单。

假设您像上面一样{@ {1}}和state的Keras模型动手了,这里有一个解压缩和重新打包所有内容的捷径-如TFF之一的this section所示教程-即tff.learning.state_with_new_model_weights的用法。如果您具有如上所述的状态和模型(并且TF处于急切模式),那么以下内容将为您工作:

model

这应该将模型的权重重新分配给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 ]) 对象的适当元素。