联合学习:将我自己的图像数据集转换为tff模拟Clientdata

时间:2020-01-14 20:33:42

标签: python tensorflow keras tensorflow-federated federated-learning

这是我的联合学习测试的代码

from __future__ import absolute_import, division, print_function
import os
import collections
import warnings
from six.moves import range
import numpy as np
import six
import tensorflow as tf
import tensorflow_federated as tff
from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint
import PIL


#pretrain

train_datagen1 = tf.keras.preprocessing.image.ImageDataGenerator(vertical_flip=True)
training_set1= train_datagen1.flow_from_directory('folder1/train',target_size=(200, 200), batch_size=32)



)




现在,当我想像tensorflow联合中的教程那样创建sample_batch进行图像分类时

我写了这行,发现了这个错误

example_dataset = training_set1.create_tf_dataset_for_client(training_set1.client_ids[0])

错误


TypeError跟踪(最近一次通话最近) 在 1 training_set1.element_type_structure ----> 2个example_dataset = training_set1.create_tf_dataset_for_client(training_set1.client_ids [0])

TypeError:“抽象属性”对象不支持索引


能告诉我如何创建dummy_batch以便将keras模型转换为tff.learning.from_compiled_keras_model(model,dummy_batch)

1 个答案:

答案 0 :(得分:1)

感谢您对TFF的关注!

通常,TFF被设计为摄取tf.data.Dataset对象,因此上面的示例需要一些额外的预处理。

好消息是,有一个existing tutorial显示了执行此操作的示例。在上面,应该执行以下操作:

ds = tf.data.Dataset.from_generator(
    img_gen.flow_from_directory, args=[<your_directory>], 
    output_types=<your_types>, 
    output_shapes=<your_shapes>
)

通常,人们可以认为ClientData对象是将客户端ID映射到dict的幻想tf.data.DatasetsClientData本身是一个抽象类,因此无法直接实例化,并且提供了类方法来构造ClientData的实际实例。 tff.simulation.ClientData.from_clients_and_fn是一种应该在这里使用的类方法。在这里,如果传递一个client_ids列表和一个函数,该函数在给定客户端ID时返回适当的数据集,那么您将可以使用功能全面的ClientData

我认为在这里,定义您可能使用的功能的一种方法是构造一个Python dict,它将客户端ID映射到tf.data.Dataset对象-然后,您可以定义一个接受客户端ID的函数,在字典中查找数据集,然后返回数据集。

希望这会有所帮助!