我的目标是从.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模型?
答案 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
])
对象的适当元素。