在联邦学习环境中,其中一个应该有效的类方法是tff.simulation.ClientData.from_clients_and_fn.在这里,如果我传递一个client_ids列表和一个函数,该函数在给定客户机id时返回适当的数据集,您将获得一个功能完整的ClientData。
我认为在这里,定义我可能使用的函数的一种方法是构造一个Python dict,它将客户机id映射到tf.data.Dataset对象--然后您可以定义一个函数,该函数接受客户机id,在字典中查找数据集,然后返回数据集。所以我将函数定义如下,但我认为它是错误的,你怎么看?
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‘
发布于 2020-02-18 00:22:45
创建(client_id, dataset)键值对的dict是设置tff.simulation.ClientData的一种合理方法。实际上,问题中的代码将导致所有客户端都具有相同的数据集,因为参数id的所有值都返回ds。在预先构建数据集的dict时需要注意的一件事是,它可能需要将数据的全部内容加载到内存中(对于大型数据集,可能会失败)。
或者,按需构造数据集可以减少内存使用量。一个例子可能是具有(client_id, file path)键-值对的dict。类似于:
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中使用的方法。以该类的代码为例进行查看可能会很有用。
https://stackoverflow.com/questions/60265798
复制相似问题