我使用TensorFlow Federated来模拟一个场景,在这个场景中,托管在远程服务器上的客户端可以在联邦设置中处理非常稀疏的数据集。
目前,该代码能够在服务器端加载非常稀疏的数据集的一个小子集的情况下运行,并将其传递给驻留在另一个设备上的远程工作人员。该数据为支持向量机轻型格式,可以通过sklearn的load_svmlight_file函数加载,但需要转换为张量才能在tff中工作。当前的解决方案包括将非常稀疏的数据转换为密集数组,然后通过tf.data.Dataset.from_tensor_slices函数将其设置为与keras模型一起使用(以下是现有的tff示例)。
这可以工作,但占用大量内存资源,不适合于dataset,因为由于稀疏数据的序列化大小,不能对6个以上的样本进行远程运行,也不能在本地运行数百个样本,因为内存中的大小。
为了缓解这种情况,我将数据转换为SparseTensors,但由于tff.learning.from_keras_model函数需要一对TensorSpec input_spec值,而不是标签为TensorSpec的SparseTensorSpec input_spec,这种方法失败了。
那么,是否有任何具体的例子或已知的方法可以在SparseTensors模型中使用?或者他们现在必须是张量?当未转换为常规张量时,数据会很好地加载,因此我需要找到处理稀疏数据的解决方案。
如果目前没有办法这样做,那么tff中是否有一次处理非常小的数据子集的策略示例,要么直接与远程客户端一起加载,要么从服务器传递?
谢谢!
发布于 2022-01-17 10:44:01
我想说,现在最好的方法是使用TF的tf.SparseTensor表示。也就是说,由三个张量组成的元组,indices、values和dense_shape。
因此,当问题是Keras要求输入不是稀疏张量时,您可以传入输入,例如,一个由这三个张量组成的字典,将其作为tf.sparse.SparseTensor管道的一部分进行转换。
请参见本教程,我认为它正在做一些与您正在寻找的相关的事情,如果需要的话,请问更详细的问题!
https://stackoverflow.com/questions/70715524
复制相似问题