【发布时间】:2019-09-19 05:32:04
【问题描述】:
我想知道是否有任何合理的方法可以使用 tff 核心代码为联邦学习模拟生成客户端数据集?在联邦核心的教程中,它使用 MNIST 数据库,每个客户端在他的数据集中只有一个不同的标签。在这种情况下,只有 10 个不同的标签可用。如果我想拥有更多的客户,我该怎么做?提前致谢。
【问题讨论】:
标签: tensorflow-datasets tensorflow-federated
我想知道是否有任何合理的方法可以使用 tff 核心代码为联邦学习模拟生成客户端数据集?在联邦核心的教程中,它使用 MNIST 数据库,每个客户端在他的数据集中只有一个不同的标签。在这种情况下,只有 10 个不同的标签可用。如果我想拥有更多的客户,我该怎么做?提前致谢。
【问题讨论】:
标签: tensorflow-datasets tensorflow-federated
如果您想从头开始创建数据集,可以使用 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)
您可以查看我的完整实现 here,我已将 mnist 拆分为 4 个客户端。
【讨论】:
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 帖子(按用户分区),现有数据集以类似的方式分区。这些数据集的文档可以在here找到。
如果您想创建自己的自定义数据集,请查看答案here。
【讨论】:
tff.learning.build_federated_averaging_process 返回的计算将接受此数据集列表作为其客户端数据参数。如果您需要检查类型签名的值,只需访问任何tff.Computation 上的type_signature 属性。希望这是有道理的!