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
对象的适当元素。
我的目标是从 .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
对象的适当元素。