我正在与Tensorflow联合进行一个项目。我已经设法使用TensorFlow联合学习模拟提供的库来加载,训练和测试一些数据集。
例如,我加载emnist数据集
emnist_train, emnist_test = tff.simulation.datasets.emnist.load_data()
,它获得了load_data()作为tff.simulation.ClientData实例返回的数据集。该界面使我可以遍历客户端ID,并允许我选择数据的子集进行仿真。
len(emnist_train.client_ids)
3383
emnist_train.element_type_structure
OrderedDict([('pixels', TensorSpec(shape=(28, 28), dtype=tf.float32, name=None)), ('label', TensorSpec(shape=(), dtype=tf.int32, name=None))])
example_dataset = emnist_train.create_tf_dataset_for_client(
emnist_train.client_ids[0])
我正在尝试使用Keras加载fashion_mnist数据集以执行一些联合操作:
fashion_train,fashion_test=tf.keras.datasets.fashion_mnist.load_data()
但是我得到这个错误
AttributeError: 'tuple' object has no attribute 'element_spec'
因为Keras返回一个Numpy数组的元组,而不是像以前那样返回tff.simulation.ClientData:
def tff_model_fn() -> tff.learning.Model:
return tff.learning.from_keras_model(
keras_model=factory.retrieve_model(True),
input_spec=fashion_test.element_spec,
loss=loss_builder(),
metrics=metrics_builder())
iterative_process = tff.learning.build_federated_averaging_process(
tff_model_fn, Parameters.server_adam_optimizer_fn, Parameters.client_adam_optimizer_fn)
server_state = iterative_process.initialize()
总结一下,
是否可以通过Keras Tuple Numpy数组创建tff.simulation.ClientData
的元组元素?
我想到的另一种解决方案是使用
tff.simulation.HDF5ClientData
并加载
手动以HDF5
格式(train.h5, test.h5)
的适当文件以获取tff.simulation.ClientData
,但是我的问题是我找不到fashion_mnist HDF5
文件格式的网址,我的意思是就像训练和测试一样:
fileprefix = 'fed_emnist_digitsonly'
sha256 = '55333deb8546765427c385710ca5e7301e16f4ed8b60c1dc5ae224b42bd5b14b'
filename = fileprefix + '.tar.bz2'
path = tf.keras.utils.get_file(
filename,
origin='https://storage.googleapis.com/tff-datasets-public/' + filename,
file_hash=sha256,
hash_algorithm='sha256',
extract=True,
archive_format='tar',
cache_dir=cache_dir)
dir_path = os.path.dirname(path)
train_client_data = hdf5_client_data.HDF5ClientData(
os.path.join(dir_path, fileprefix + '_train.h5'))
test_client_data = hdf5_client_data.HDF5ClientData(
os.path.join(dir_path, fileprefix + '_test.h5'))
return train_client_data, test_client_data
我的最终目标是使fashion_mnist数据集与TensorFlow联合学习一起工作。
答案 0 :(得分:3)
您在正确的轨道上。回顾一下:tff.simulation.dataset
API返回的数据集是tff.simulation.ClientData
对象。 tf.keras.datasets.fashion_mnist.load_data
返回的对象是tuple
个numpy数组。
因此,需要实现一个tff.simulation.ClientData
来包装tf.keras.datasets.fashion_mnist.load_data
返回的数据集。以前有关实现ClientData
对象的一些问题:
这确实需要回答一个重要的问题:Fashion MNIST数据应如何划分为单个用户?数据集不包含可用于分区的要素。研究人员提出了几种方法来对数据进行综合分区,例如为每个参与者随机抽取一些标签,但这将对模型训练产生很大影响,并且有助于在此处进行一些思考。