【问题标题】:Is there a reasonable way to create tff clients datat sets?是否有合理的方法来创建 ttf 客户端数据集?
【发布时间】:2019-09-19 05:32:04
【问题描述】:

我想知道是否有任何合理的方法可以使用 tff 核心代码为联邦学习模拟生成客户端数据集?在联邦核心的教程中,它使用 MNIST 数据库,每个客户端在他的数据集中只有一个不同的标签。在这种情况下,只有 10 个不同的标签可用。如果我想拥有更多的客户,我该怎么做?提前致谢。

【问题讨论】:

    标签: tensorflow-datasets tensorflow-federated


    【解决方案1】:

    如果您想从头开始创建数据集,可以使用 tff.simulation.FromTensorSlicesClientData 将张量转换为 tff clientdata 对象。只需要传递具有客户端 ID 作为键和数据集作为值的字典。

    client_train_dataset = collections.OrderedDict()
    for i in range(1, split+1):
        client_name = "client_" + str(i)
        start = image_per_set * (i-1)
        end = image_per_set * i
    
        print(f"Adding data from {start} to {end} for client : {client_name}")
        data = collections.OrderedDict((('label', y_train[start:end]), ('pixels', x_train[start:end])))
        client_train_dataset[client_name] = data
    
    train_dataset = tff.simulation.FromTensorSlicesClientData(client_train_dataset)
    

    您可以查看我的完整实现 here,我已将 mnist 拆分为 4 个客户端。

    【讨论】:

      【解决方案2】:

      TFF 中有经过预处理的模拟数据集,可以很好地服务于这个目的。例如,加载 EMNIST,其中图像由 writer 分区,对应于用户,而不是标签。这可以很简单地加载到 Python 运行时(这里使用 100 个客户端创建训练数据):

      source, _ = tff.simulation.datasets.emnist.load_data()
      
      def map_fn(example):
        return {'x': tf.reshape(example['pixels'], [-1]), 'y': example['label']}
      
      def client_data(n):
        ds = source.create_tf_dataset_for_client(source.client_ids[n])
        return ds.repeat(10).map(map_fn).shuffle(500).batch(20)
      
      train_data = [client_data(n) for n in range(100)]
      

      对于扩展 MNIST(IE,除了数字之外还包括手写字符)、莎士比亚戏剧(按字符分区)和 Stackoverflow 帖子(按用户分区),现有数据集以类似的方式分区。这些数据集的文档可以在here找到。

      如果您想创建自己的自定义数据集,请查看答案here

      【讨论】:

      • Thx Keith,我正好有时间练习这个方法。但似乎“train_dara”是 BatchDataSet 的列表?有什么办法可以直接在tf.keras.model.fit()中使用?
      • keras 将支持以串行方式输入这些数据集(即遍历列表并一次输入一个)。但是任何具有类型签名的 TFF 联合计算都接受放置在客户端的值,将接受代表这些客户端的列表。例如,tff.learning.build_federated_averaging_process 返回的计算将接受此数据集列表作为其客户端数据参数。如果您需要检查类型签名的值,只需访问任何tff.Computation 上的type_signature 属性。希望这是有道理的!
      猜你喜欢
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 2011-11-19
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      相关资源
      最近更新 更多