【问题标题】:TensorFlow Federated: How to tune non-IIDness in federated dataset?TensorFlow Federated:如何调整联合数据集中的非独立同分布?
【发布时间】:2020-11-23 14:36:43
【问题描述】:

我正在 TensorFlow Federated (TFF) 中测试一些算法。在这方面,我想在具有不同“级别”数据异质性(即非独立同分布)的同一个联合数据集上测试和比较它们。

因此,我想知道是否有任何方法可以自动或半自动方式控制和调整特定联合数据集中非独立同分布的“级别”,例如通过 TFF API 或传统的 TF API(可能在 Dataset utils 中)。

为了更实用:例如,TFF 提供的 EMNIST 联合数据集有 3383 个客户端,每个客户端都有自己的手写字符。然而,这些本地数据集在本地示例的数量和表示的类方面似乎相当平衡(所有类或多或少都在本地表示)。 如果我想要一个联合数据集(例如,从 TFF 的 EMNIST 开始),那就是:

  • 病理学上非 IID,例如,客户端仅持有 N 个类别中的一个类别(总是指分类任务)。这是tff.simulation.datasets.build_single_label_datasetdocumentation here的目的吗。如果是这样,我应该如何从联合数据集(例如 TFF 已经提供的数据集)中使用它?;
  • 本地示例数量不平衡(例如,一个客户端有 10 个示例,另一个客户端有 100 个示例);
  • 两种可能性;

我应该如何在 TFF 框架内继续准备具有这些特征的联合数据集?

我应该手工做所有的事情吗?或者你们中的一些人对自动化这个过程有什么建议吗?

另一个问题:在 Hsu 等人的这篇论文 "Measuring the Effects of Non-Identical Data Distribution for Federated Visual Classification" 中,他们利用 Dirichlet 分布来合成一组不同的客户端,并使用 浓度参数 来控制客户之间的一致性。这似乎是一种易于调整的方式来生成具有不同异质性水平的数据集。任何关于如何在 TFF 框架内实现此策略(或类似策略)的建议,或者仅在 TensorFlow (Python) 中考虑一个简单的数据集(例如 EMNIST),都会非常有用。

非常感谢。

【问题讨论】:

    标签: python tensorflow tensorflow2.0 tensorflow-federated


    【解决方案1】:

    对于联邦学习模拟,在 Python 中的实验驱动程序中设置客户端数据集以实现所需的分布是非常合理的。在某些高层次上,TFF 处理建模数据位置(类型系统中的“放置”)和计算逻辑。重新混合/生成模拟数据集并不是该库的核心,尽管您已经找到了一些有用的库。通过操作tf.data.Dataset 直接在 python 中执行此操作,然后将客户端数据集“推送”到 TFF 计算中似乎很简单。

    标签非 IID

    是的,tff.simulation.datasets.build_single_label_dataset 就是为此目的而设计的。

    它采用tf.data.Dataset 并从本质上过滤掉与label_keydesired_label 值不匹配的所有示例(假设数据集产生类似dict 的结构)。

    对于 EMNIST,要创建 所有 个(无论用户如何)的数据集,可以通过以下方式实现:

    train_data, _ = tff.simulation.datasets.emnist.load_data()
    ones = tff.simulation.datasets.build_single_label_dataset(
      train_data.create_tf_dataset_from_all_clients(),
      label_key='label', desired_label=1)
    print(ones.element_spec)
    >>> OrderedDict([('label', TensorSpec(shape=(), dtype=tf.int32, name=None)), ('pixels', TensorSpec(shape=(28, 28), dtype=tf.float32, name=None))])
    print(next(iter(ones))['label'])
    >>> tf.Tensor(1, shape=(), dtype=int32)
    

    数据不平衡

    使用tf.data.Dataset.repeattf.data.Dataset.take 的组合可用于创建数据不平衡。

    train_data, _ = tff.simulation.datasets.emnist.load_data()
    datasets = [train_data.create_tf_dataset_for_client(id) for id in train_data.client_ids[:2]]
    print([tf.data.experimental.cardinality(ds).numpy() for ds in datasets])
    >>> [93, 109]
    datasets[0] = datasets[0].repeat(5)
    datasets[1] = datasets[1].take(5)
    print([tf.data.experimental.cardinality(ds).numpy() for ds in datasets])
    >>> [465, 5]
    

    【讨论】:

    • 非常感谢您提供非常完整的答案。
    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多