首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TFF:如何定义tff.simulation.ClientData.from_clients_and_fn函数?

TFF:如何定义tff.simulation.ClientData.from_clients_and_fn函数?
EN

Stack Overflow用户
提问于 2020-02-17 23:37:41
回答 1查看 794关注 0票数 1

在联邦学习环境中,其中一个应该有效的类方法是tff.simulation.ClientData.from_clients_and_fn.在这里,如果我传递一个client_ids列表和一个函数,该函数在给定客户机id时返回适当的数据集,您将获得一个功能完整的ClientData。

我认为在这里,定义我可能使用的函数的一种方法是构造一个Python dict,它将客户机id映射到tf.data.Dataset对象--然后您可以定义一个函数,该函数接受客户机id,在字典中查找数据集,然后返回数据集。所以我将函数定义如下,但我认为它是错误的,你怎么看?

代码语言:javascript
复制
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‘

EN

回答 1

Stack Overflow用户

发布于 2020-02-18 00:22:45

创建(client_id, dataset)键值对的dict是设置tff.simulation.ClientData的一种合理方法。实际上,问题中的代码将导致所有客户端都具有相同的数据集,因为参数id的所有值都返回ds。在预先构建数据集的dict时需要注意的一件事是,它可能需要将数据的全部内容加载到内存中(对于大型数据集,可能会失败)。

或者,按需构造数据集可以减少内存使用量。一个例子可能是具有(client_id, file path)键-值对的dict。类似于:

代码语言:javascript
复制
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中使用的方法。以该类的代码为例进行查看可能会很有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60265798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档