【发布时间】:2021-03-24 06:53:00
【问题描述】:
我想使用emnist 数据集训练两个独立的TFF 模型。每个模型都应该在从数据集中随机抽取的 1000 不同的参与者上进行训练。
代码如下
emnist_train, emnist_test = tff.simulation.datasets.emnist.load_data()
participants_ids = np.random.choice(a=emnist_train.client_ids,
size=1000,
replace=False)
federated_dataset =
[data_train.create_tf_dataset_for_client(i) for i in participants_ids]
nested_dataset = tf.data.Dataset.from_tensor_slices(federated_dataset)
尝试保存数据集
tf.data.experimental.save(nested_dataset, 'model_dataset')
生成以下警告。但是,保存已完成。
E tensorflow/core/framework/dataset.cc:89] The Encode() method is not implemented for DatasetVariantWrapper objects.
加载数据集并尝试检查其内容时会出现问题
dataset = tf.data.experimental.load('model_dataset',
element_spec=
DatasetSpec(collections.OrderedDict([
('label', TensorSpec(shape=(), dtype=tf.int32)),
('pixels', TensorSpec(shape=(28, 28), dtype=tf.float32))]),
TensorShape([])
# verifying elements
for example in dataset:
print(example)
以下错误
tensorflow.python.framework.errors_impl.DataLossError: Unable to parse tensor from stored proto.
尝试其他方法如pickle.dump和np.save,均出现如下错误
tensorflow.python.framework.errors_impl.InternalError: Tensorflow type 21 not convertible to numpy dtype.
有什么好的方法可以保存新创建的数据集吗?
【问题讨论】:
-
阅读上面的描述:数据集真的需要保存吗? TFF 应该在每次调用
load_data时返回相同的 cliend_id -> 数据集映射——所以我们可以通过仅保存 ID 并在函数调用中重新创建单个数据集对象来实现相同的效果吗? -
@KeithRush,最终目标是使用联合数据集训练一个
federated model,然后将相同的数据集转换为flatten dataset,并保存以供以后训练几个传统的centralized models。这是为了在federated模型和centralized模型之间建立一些比较,在相同的数据集上进行训练。
标签: tensorflow tensorflow-datasets tensorflow-federated