Как контролировать данные проверки для интегрированной среды
Я пытаюсь указать данные проверки, которые передаются через интегрированную среду каждому клиенту для обучения / проверки. Я знаю, что тензор потока-федерации берет случайную выборку из набора данных каждого клиента и проверяет ее. Но если мои данные (в подмножестве) очень коррелированы, как я могу указать (в рамках TFF) набор данных проверки для каждого клиента? Как вы думаете, перетасовка данных имеет смысл здесь? (например, используя: DS.repeat(FL_rpt).shuffle(FL_shuf).batch(FL_batch)
) Если да, то какие рекомендации по размеру shuffle_buffer?
В обучении керасу у нас есть следующее, чтобы обучить модель на множестве A и проверить тренировку на множестве B:
model.fit(InA,OutA, validation_data=(In_valid_B,Out_valid_B),batch_size=100,epochs=100)
Как мы можем сделать то же самое с федеративной структурой?
1 ответ
Это может быть записано во внешнем цикле Python во время симуляции. Текущие API не имеют понятия как оценки, так и обучения внутри одного раунда.
Если используются наборы данных моделирования, включенные в TFF (например, tff.simulation.datasets
), они включают разделение поезда / теста, которое делает это легким. Каждый возвращает 2 кортежа объектов tff.simulation.ClientData, тест и поезд ClientData
, И тест, и поезд имеют одинаковое ClientData.client_id
списки, но tf.data.Dataset
вернулся create_tf_dataset_for_client(client_id)
будет иметь непересекающийся набор примеров.
Другими словами, разделение обучающих и тестовых данных происходит на пользовательских примерах, а не на пользовательских.
Цикл федеративного обучения и федеративной оценки может выглядеть следующим образом:
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)