AttributeError: 'MapDataset' object has no attribute 'preprocess' in tensorflow_federated tff
AttributeError: 'MapDataset' object has no attribute 'preprocess' in tensorflow_federated tff
我正在使用非 IID 分布测试本教程以进行联合学习:
https://www.tensorflow.org/federated/tutorials/tff_for_federated_learning_research_compression
在这个已发布的问题 中,它建议使用 tff.simulation.datasets.build_single_label_dataset() 作为为数据集生成非 IID 分布的方法。
我尝试先应用它(查看代码)但出现错误!
emnist_train, emnist_test = tff.simulation.datasets.emnist.load_data(
only_digits=False)
emnist_train1 = tff.simulation.datasets.build_single_label_dataset(
emnist_train.create_tf_dataset_from_all_clients(),
label_key='label', desired_label=1)
print(emnist_train1.element_spec)
OrderedDict([('label', TensorSpec(shape=(), dtype=tf.int32, name=None)), ('pixels', TensorSpec(shape=(28, 28), dtype=tf.float32, name=None))])
print(next(iter(emnist_train1))['label'])
tf.Tensor(1, shape=(), dtype=int32)
MAX_CLIENT_DATASET_SIZE = 418
CLIENT_EPOCHS_PER_ROUND = 1
CLIENT_BATCH_SIZE = 20
TEST_BATCH_SIZE = 500
def reshape_emnist_element(element):
return (tf.expand_dims(element['pixels'], axis=-1), element['label'])
def preprocess_train_dataset(dataset):
return (dataset
.shuffle(buffer_size=MAX_CLIENT_DATASET_SIZE)
.repeat(CLIENT_EPOCHS_PER_ROUND)
.batch(CLIENT_BATCH_SIZE, drop_remainder=False)
.map(reshape_emnist_element))
emnist_train1 = emnist_train1.preprocess(preprocess_train_dataset)
>> ---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-17-cda96c33a0f6> in <module>()
15 .map(reshape_emnist_element))
16
---> 17 emnist_train1 = emnist_train1.preprocess(preprocess_train_dataset)
AttributeError: 'MapDataset' object has no attribute 'preprocess'
由于数据集被过滤,无法进行预处理!
那么,在这种情况下,它是根据什么标签过滤的?
... label_key='label', desired_label=1)
所需标签 = 1 EMNIST 中的哪个标签?
我的问题是:
如何应用此功能tff.simulation.datasets.build_single_label_dataset()
在此特定教程中获取非 IID 数据集 (每个客户端的样本数量不同)! https://www.tensorflow.org/federated/tutorials/tff_for_federated_learning_research_compression 过滤数据集的详细信息没有错误!
感谢任何帮助!
非常感谢!
tff.simulation.datasets.ClientData
and tf.data.Dataset
API 之间可能存在一些混淆,这些混淆将有助于涵盖。
tf.data.Dataset
没有有preprocess
方法,tff.simulation.datasets.ClientData.preprocess
确实存在。
但是,tff.simulation.datasets.build_single_label_dataset
使用 tf.data.Dataset
个实例:输入参数和输出结果都作为 tf.data.Dataset
个实例。在这种情况下,emnist_train1
是一个 tf.data.Dataset
,它 而不是 有一个 preprocess
方法。
但是,并非一无所有! preprocess_train_dataset
函数接受一个 tf.data.Dataset
参数,returns 一个 tf.data.Dataset
结果。这应该意味着替换:
emnist_train1 = emnist_train1.preprocess(preprocess_train_dataset)
与
emnist_train1 = preprocess_train_dataset(emnist_train1)
将创建一个只有一个标签(“标签 non-IID”)的 tf.data.Dataset
,该标签经过打乱、重复、批处理和重塑。注意,联邦算法中一般用单个tf.data.Dataset
表示一个用户。要使用随机数量的批次创建更多,可以使用类似以下的方法:
client_datasets = [
emnist_train1.take(random.randint(1, MAX_BATCHES))
for _ in range(NUM_CLIENTS)
]
我正在使用非 IID 分布测试本教程以进行联合学习: https://www.tensorflow.org/federated/tutorials/tff_for_federated_learning_research_compression
在这个已发布的问题
我尝试先应用它(查看代码)但出现错误!
emnist_train, emnist_test = tff.simulation.datasets.emnist.load_data(
only_digits=False)
emnist_train1 = tff.simulation.datasets.build_single_label_dataset(
emnist_train.create_tf_dataset_from_all_clients(),
label_key='label', desired_label=1)
print(emnist_train1.element_spec)
OrderedDict([('label', TensorSpec(shape=(), dtype=tf.int32, name=None)), ('pixels', TensorSpec(shape=(28, 28), dtype=tf.float32, name=None))])
print(next(iter(emnist_train1))['label'])
tf.Tensor(1, shape=(), dtype=int32)
MAX_CLIENT_DATASET_SIZE = 418
CLIENT_EPOCHS_PER_ROUND = 1
CLIENT_BATCH_SIZE = 20
TEST_BATCH_SIZE = 500
def reshape_emnist_element(element):
return (tf.expand_dims(element['pixels'], axis=-1), element['label'])
def preprocess_train_dataset(dataset):
return (dataset
.shuffle(buffer_size=MAX_CLIENT_DATASET_SIZE)
.repeat(CLIENT_EPOCHS_PER_ROUND)
.batch(CLIENT_BATCH_SIZE, drop_remainder=False)
.map(reshape_emnist_element))
emnist_train1 = emnist_train1.preprocess(preprocess_train_dataset)
>> ---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-17-cda96c33a0f6> in <module>()
15 .map(reshape_emnist_element))
16
---> 17 emnist_train1 = emnist_train1.preprocess(preprocess_train_dataset)
AttributeError: 'MapDataset' object has no attribute 'preprocess'
由于数据集被过滤,无法进行预处理! 那么,在这种情况下,它是根据什么标签过滤的?
... label_key='label', desired_label=1)
所需标签 = 1 EMNIST 中的哪个标签?
我的问题是:
如何应用此功能tff.simulation.datasets.build_single_label_dataset() 在此特定教程中获取非 IID 数据集 (每个客户端的样本数量不同)! https://www.tensorflow.org/federated/tutorials/tff_for_federated_learning_research_compression 过滤数据集的详细信息没有错误!
感谢任何帮助!
非常感谢!
tff.simulation.datasets.ClientData
and tf.data.Dataset
API 之间可能存在一些混淆,这些混淆将有助于涵盖。
tf.data.Dataset
没有有preprocess
方法,tff.simulation.datasets.ClientData.preprocess
确实存在。
但是,tff.simulation.datasets.build_single_label_dataset
使用 tf.data.Dataset
个实例:输入参数和输出结果都作为 tf.data.Dataset
个实例。在这种情况下,emnist_train1
是一个 tf.data.Dataset
,它 而不是 有一个 preprocess
方法。
但是,并非一无所有! preprocess_train_dataset
函数接受一个 tf.data.Dataset
参数,returns 一个 tf.data.Dataset
结果。这应该意味着替换:
emnist_train1 = emnist_train1.preprocess(preprocess_train_dataset)
与
emnist_train1 = preprocess_train_dataset(emnist_train1)
将创建一个只有一个标签(“标签 non-IID”)的 tf.data.Dataset
,该标签经过打乱、重复、批处理和重塑。注意,联邦算法中一般用单个tf.data.Dataset
表示一个用户。要使用随机数量的批次创建更多,可以使用类似以下的方法:
client_datasets = [
emnist_train1.take(random.randint(1, MAX_BATCHES))
for _ in range(NUM_CLIENTS)
]