我想知道是否有任何合理的方法来使用tff核心代码为联邦学习模拟生成客户端数据集?在联邦核心的教程中,它使用MNIST数据库,每个客户端在其数据集中只有一个不同的标签。在这种情况下,只有10个不同的标签可用。如果我想拥有更多的客户,我该怎么做呢?提前谢谢。
发布于 2020-05-08 17:20:09
如果想从头开始创建数据集,可以使用tff.simulation.FromTensorSlicesClientData将张量转换为tff clientdata对象。你只需要把客户端id作为key,把数据集作为value来传递字典。
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个客户端。
发布于 2019-09-24 02:41:46
在TFF中有预处理的模拟数据集应该可以很好地服务于这一目的。例如,加载EMNIST,其中图像按编写器分区,对应于用户,而不是标签。这可以非常简单地加载到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。
https://stackoverflow.com/questions/58004272
复制相似问题