Как контролировать данные проверки для интегрированной среды

Я пытаюсь указать данные проверки, которые передаются через интегрированную среду каждому клиенту для обучения / проверки. Я знаю, что тензор потока-федерации берет случайную выборку из набора данных каждого клиента и проверяет ее. Но если мои данные (в подмножестве) очень коррелированы, как я могу указать (в рамках 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)
Другие вопросы по тегам