2

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

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 federtaed 中的教程一样创建 sample_batch 以进行图像分类时

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

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

错误


1 training_set1.element_type_structure 中的 TypeError Traceback(最近一次调用)----> 2 example_dataset = training_set1.create_tf_dataset_for_client(training_set1.client_ids[0])

TypeError: 'abstractproperty' 对象不支持索引


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

4

1 回答 1

2

感谢您对 TFF 的关注!

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

好消息是,有一个现有的教程展示了这样做的例子。在上面,类似以下的东西应该起作用:

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

通常,可以将ClientData对象视为dict将客户端 ID 映射到tf.data.Datasets. ClientData本身是一个抽象类,所以不能直接实例化,提供了类方法来构造ClientData. 一种应该在这里工作的类方法是tff.simulation.ClientData.from_clients_and_fn. 在这里,如果您传递一个列表client_ids和一个函数,该函数在给定客户端 ID 时返回适当的数据集,您将拥有一个功能齐全的ClientData.

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

希望这会有所帮助!

于 2020-01-16T17:20:42.097 回答