2

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

4

2 回答 2

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)

你可以在这里查看我的完整实现,我将 mnist 拆分为 4 个客户端。

于 2020-05-08T09:20:08.520 回答
0

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 帖子(按用户分区),现有的数据集以类似的方式分区。可以在此处找到有关这些数据集的文档。

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

于 2019-09-23T18:41:46.497 回答