首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TensorFlow联邦:如何调优联邦数据集中的非IIDness?

TensorFlow联邦:如何调优联邦数据集中的非IIDness?
EN

Stack Overflow用户
提问于 2020-11-23 14:36:43
回答 1查看 459关注 0票数 4

我正在TensorFlow联邦(TFF)中测试一些算法。在这方面,我想在相同的联邦数据集上测试和比较不同“级别”的数据异构性,即非IIDness。

因此,我想知道是否有任何方法来控制和调优特定联邦数据集中的非IIDness“级别”、自动或半自动方式,例如通过TFF API或仅通过传统的TF API(可能在dataset中使用)。

更实用的是:例如,TFF提供的EMNIST联合数据集有3383个客户机,每个客户机都有手写字符。但是,这些本地数据集在本地示例和表示类的数量上似乎相当平衡(所有类或多或少都是本地表示的)。如果我想要一个联邦数据集(例如,从TFF的EMNIST 1开始),即:

  • 例如,在模式非IID的情况下,客户端只持有N个类中的一个类(总是指分类任务)。这是tff.simulation.datasets.build_single_label_dataset 这里的文件的目的吗?如果是这样的话,我应该如何从联邦数据集中使用它,比如TFF已经提供的数据集?
  • 当地实例数量不平衡(例如,一个客户有10个例子,另一个客户有100个例子);
  • 这两种可能性;

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

我应该用手做所有的事情吗?或者你们中的一些人有一些建议来实现这个过程的自动化?

另一个问题:在本文中,of /T1597-1988联邦视觉分类数据分布不一致影响的测量等人利用Dirichlet分布来合成一个非完全相同的客户群体,并使用一个浓度参数来控制客户之间的同一性。这似乎是一种非常方便的方法来生成具有不同层次异质性的数据集。任何关于如何在TFF框架内实现这个策略(或类似的策略)的建议,或者仅仅在TensorFlow (Python)中考虑一个简单的数据集(如EMNIST ),也是非常有用的。

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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_keydesired_label值不匹配的所有示例(假设数据集产生类似于dict的结构)。

对于EMNIST,要创建所有数据集(不论用户),这可以通过以下方式实现:

代码语言:javascript
复制
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的组合可以造成数据不平衡。

代码语言:javascript
复制
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]
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64970504

复制
相关文章

相似问题

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