1

在联邦学习环境中,应该工作的这样一种类方法是 tff.simulation.ClientData.from_clients_and_fn。在这里,如果我传递一个 client_ids 列表和一个在给定客户端 ID 时返回适当数据集的函数,您将获得一个功能齐全的 ClientData。

我认为在这里,定义我可能使用的函数的一种方法是构建一个 Python 字典,它将客户端 ID 映射到 tf.data.Dataset 对象——然后你可以定义一个接受客户端 ID 的函数,在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'

4

1 回答 1

1

创建 a dictof(client_id, dataset)键值对是设置 a 的合理方法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。以该类的代码为例可能会很有用。

于 2020-02-17T16:22:45.013 回答