【问题标题】:Implement data generator in federated training在联合训练中实现数据生成器
【发布时间】:2020-01-21 07:04:28
【问题描述】:

(我已经在https://github.com/tensorflow/federated/issues/793 上发布了这个问题,也许也在这里!)

我已将我自己的数据和模型定制为联合接口并且训练融合。但是我对一个问题感到困惑,即在图像分类任务中,整个数据集非常大,不能存储在单个federated_train_data 中,也不能一次性导入内存。所以我需要将数据集从硬盘实时批量加载到内存中,并在训练时使用Keras model.fit_generator而不是model.fit,这是人们处理大数据的方法。

我想在图像分类教程中显示的iterative_process 中,模型是在一组固定的数据上拟合的。有没有办法调整代码以使其适合数据生成器?我已经查看了源代码,但仍然很困惑。非常感谢任何提示。

【问题讨论】:

    标签: tensorflow keras tensorflow-federated federated-learning


    【解决方案1】:

    通常,TFF 将数据馈送视为“Python 驱动程序循环”的一部分,这在编写 TFF 代码时有助于区分。

    其实在写TFF的时候,一般有3个层次可以写:

    1. TensorFlow 定义本地处理(IE,将在客户端、服务器、聚合器或任何其他可能需要的位置进行的处理,但仅单个位置。
    2. 本机 TFF 定义了展示位置的数据通信方式。例如,在 tff.federated_computation 装饰器中写入 tff.federated_sum;编写此行声明“此数据从客户端移动到服务器,并通过求和运算符聚合”。
    3. Python “驱动” TFF 循环,例如运行一个回合。最后一层的工作是做一个“真正的”联邦学习运行时会做的事情;这里的一个例子是为给定的一轮选择客户。

    如果牢记这一细分,使用生成器或其他一些惰性求值风格的构造将数据输入到联合计算中会变得相对简单;它只是在 Python 级别完成的。

    一种方法是通过ClientData 对象上的create_tf_dataset_for_client 方法;当您循环循环时,您的 Python 代码可以从client_ids 列表中进行选择,然后您可以实例化一个新的tf.data.Datasets 列表并将它们作为您的新客户端数据集传递。这种相对简单的用法示例是here,而更高级的用法(包括定义一个自定义client_datasets_fn,它将client_id 作为参数,并将其传递给单独定义的训练循环将是here , 在与this paper 关联的代码中。

    最后一点:实例化tf.data.Dataset 并不会真正将数据集加载到内存中;数据集仅在迭代时加载。我从tf.data.Dataset 的主要作者那里收到的一个有用的提示是将tf.data.Dataset 更多地视为“数据集配方”,而不是数据集本身的文字实例化。有人建议,对于这个构造,也许一个更好的名字是DataSource;希望这可能有助于心理模型了解实际发生的情况。同样,使用tff.simulation.ClientData 对象通常不应该真正将任何东西加载到内存中,直到它在客户端训练中被迭代;这应该会使管理数据集内存的一些细微差别变得更简单。

    【讨论】:

    • 感谢您的详细说明,我现在了解如何采样客户端 ID。我在使用生成器时面临的问题是Tensorflow.from_generator 从磁盘中批量读取数据。我想使用它,但我发现create_tf_dataset_for_client 生成的每一轮中的客户端数据是该轮的整个数据集(或数据集配方)。如果我想使用批量数据生成器,我可能需要更改模型拟合函数以让它驱动批量迭代器/生成器,但我无法触及客户端模型拟合函数。
    • 你好@miaoz18 我正在解决同样的问题。您是否设法找到解决方案(使用 TFL 的批处理生成器)?
    猜你喜欢
    • 2015-05-15
    • 2020-07-02
    • 1970-01-01
    • 2019-04-07
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2020-09-25
    相关资源
    最近更新 更多