【问题标题】:TFF: How define tff.simulation.ClientData.from_clients_and_fn Function?TFF:如何定义 tff.simulation.ClientData.from_clients_and_fn 函数?
【发布时间】:2020-02-17 15:37:41
【问题描述】:

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

我认为在这里,定义我可能使用的函数的一种方法是构造一个 Python 字典,它将客户端 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'

【问题讨论】:

    标签: tensorflow-federated


    【解决方案1】:

    创建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 中使用的方法。以该类的代码为例可能会有用。

    【讨论】:

    • 非常感谢..很好的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多