我正在TensorFlow联邦(TFF)中测试一些算法。在这方面,我想在相同的联邦数据集上测试和比较不同“级别”的数据异构性,即非IIDness。
因此,我想知道是否有任何方法来控制和调优特定联邦数据集中的非IIDness“级别”、自动或半自动方式,例如通过TFF API或仅通过传统的TF API(可能在dataset中使用)。
更实用的是:例如,TFF提供的EMNIST联合数据集有3383个客户机,每个客户机都有手写字符。但是,这些本地数据集在本地示例和表示类的数量上似乎相当平衡(所有类或多或少都是本地表示的)。如果我想要一个联邦数据集(例如,从TFF的EMNIST 1开始),即:
tff.simulation.datasets.build_single_label_dataset 这里的文件的目的吗?如果是这样的话,我应该如何从联邦数据集中使用它,比如TFF已经提供的数据集?我应该如何在TFF框架内准备具有这些特征的联邦数据集?
我应该用手做所有的事情吗?或者你们中的一些人有一些建议来实现这个过程的自动化?
另一个问题:在本文中,of /T1597-1988联邦视觉分类数据分布不一致影响的测量等人利用Dirichlet分布来合成一个非完全相同的客户群体,并使用一个浓度参数来控制客户之间的同一性。这似乎是一种非常方便的方法来生成具有不同层次异质性的数据集。任何关于如何在TFF框架内实现这个策略(或类似的策略)的建议,或者仅仅在TensorFlow (Python)中考虑一个简单的数据集(如EMNIST ),也是非常有用的。
非常感谢。
发布于 2020-11-25 00:46:22
对于联邦学习模拟,在Python中设置客户机数据集(在实验驱动程序中)是非常合理的,以实现所需的发行版。在某些高层,TFF处理建模数据位置(类型系统中的“位置”)和计算逻辑。尽管您已经发现了一些有用的库,但是重新混合/生成模拟数据集并不是库的核心。在python中直接操作tf.data.Dataset,然后将客户端数据集“推送”到TFF计算中,这看起来很简单。
标签非IID
是的,tff.simulation.datasets.build_single_label_dataset就是为了这个目的而设计的。
它需要一个tf.data.Dataset,本质上过滤掉与label_key的desired_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.repeat和tf.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]https://stackoverflow.com/questions/64970504
复制相似问题