Это может быть записано во внешнем цикле Python во время симуляции.Текущие API не имеют понятия как оценки, так и обучения внутри одного раунда.
Если используются наборы данных моделирования, включенные в TFF (например, те, которые под tff.simulation.datasets
), они включаютразделение поезда / теста, которое делает это легко.Каждый возвращает 2 кортежа из tff.simulation.ClientData объектов, теста и поезда ClientData
.И test, и train имеют одинаковые списки ClientData.client_id
, но tf.data.Dataset
, возвращаемый create_tf_dataset_for_client(client_id)
, будет иметь несвязанный набор примеров.
Другими словами, разделение train и test разделено на пользовательские примеры, не для пользователей.
Федеративный цикл обучения и федеративной оценки может выглядеть следующим образом:
train_data, test_data = tff.simulation.datasets.shakespeare.load_data()
federated_average = tff.learning.build_federated_averaging_process(model_fn, ...)
federated_eval = tff.learning.build_federated_evaluation(model_fn)
state = federated_average.initialize()
for _ in range(NUM_ROUNDS):
participating_clients = numpy.random.choice(train_data.client_ids, size=5)
# Run a training pass
clients_train_datasets = [
train_data.create_tf_dataset_for_client(c) for c in participating_clients
]
state, train_metrics = federated_average.next(state, client_train_datasets)
# Run an evaluation pass
client_eval_datasets = [
test_data.create_tf_dataset_for_client(c) for c in participating_clients
]
eval_metrics = federated_eval(state.model, client_eval_datasets)