TFF: Как определить функцию tff.simulation.ClientData.from_clients_and_fn? - PullRequest
1 голос
/ 17 февраля 2020

В контексте федеративного обучения одним из таких методов класса, который должен работать, был бы tff.simulation.ClientData.from_clients_and_fn. Здесь, если я передам список client_ids и функцию, которая возвращает соответствующий набор данных при получении идентификатора клиента, вы получите полностью функциональные ClientData.

Я думаю, что здесь есть подход для определения функции Я могу использовать это для создания Python dict, который сопоставляет идентификаторы клиента с объектами tf.data.Dataset - тогда вы можете определить функцию, которая принимает идентификатор клиента, ищет набор данных в dict и возвращает набор данных. Итак, я определяю функцию как ниже, но я думаю, что это неправильно, как вы думаете?

list = ["0","1","2"]
tab = {"0":ds, "1":ds, "2":ds}
def create_tf_dataset_for_client_fn(id):
    return ds

source = tff.simulation.ClientData.from_clients_and_fn(list, create_tf_dataset_for_client_fn) 

Я предполагаю, что 4 клиента имеют одинаковый набор данных: 'ds'

1 Ответ

0 голосов
/ 17 февраля 2020

Создание пар * ключ-значение dict из (client_id, dataset) - разумный способ установить tff.simulation.ClientData. Действительно, код в вопросе приведет к тому, что все клиенты будут иметь одинаковый набор данных, поскольку ds возвращается для всех значений параметра id. При предварительном построении dict наборов данных следует обратить внимание на то, что для этого может потребоваться загрузка всего содержимого данных в память (может произойти сбой для больших наборов данных).

В качестве альтернативы, создание набора данных по спрос может уменьшить использование памяти. Одним из примеров может быть наличие пары ключ-значение dict из (client_id, file path). Что-то вроде:

dataset_paths = {
  'client_0': '/tmp/A.txt',
  'client_1': '/tmp/B.txt',
  'client_2': '/tmp/C.txt',
}

def create_tf_dataset_for_client_fn(id):
   path = dataset_paths.get(id)
   if path is None:
     raise ValueError(f'No dataset for client {id}')
   return tf.data.Dataset.TextLineDataset(path)

source = tff.simulation.ClientData.from_clients_and_fn(
  dataset_paths.keys(), create_tf_dataset_for_client_fn)

Это похоже на подход, используемый в tff.simulation.FilePerUserClientData. Может быть полезно взглянуть на код этого класса в качестве примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...