TensorFlow Federated : 페더레이션 된 데이터 세트에서 비 IID를 조정하는 방법은 무엇입니까?
TensorFlow Federated (TFF)에서 일부 알고리즘을 테스트하고 있습니다. 이와 관련하여 동일한 통합 데이터 세트에서 서로 다른 "수준"의 데이터 이질성 (예 : 비 IIDness)을 테스트하고 비교하고 싶습니다.
따라서 특정 연합 데이터 세트에서 자동 또는 반자동 방식 (예 : TFF API 또는 기존 TF API를 통해)에서 비 IIDness의 "수준"을 제어하고 조정할 수있는 방법이 있는지 알고 싶습니다. (데이터 셋 유틸리티 내부에있을 수 있습니다).
예를 들어, TFF에서 제공하는 EMNIST 통합 데이터 세트에는 각각 손으로 쓴 문자가있는 3383 개의 클라이언트가 있습니다. 그러나 이러한 로컬 데이터 세트는 로컬 예제의 수와 표현 된 클래스 측면에서 상당히 균형 잡힌 것처럼 보입니다 (모든 클래스는 다소간 로컬로 표현됨). 페더레이션 된 데이터 세트 (예 : TFF의 EMNIST로 시작)를 갖고 싶다면 다음과 같습니다.
- 예를 들어 N 개의 클래스 중 하나의 클래스 만 보유하는 클라이언트가있는 경우 (항상 분류 작업을 참조) Patologically non-IID. 이것은의 목적이다
tff.simulation.datasets.build_single_label_dataset
여기에 문서 . 그렇다면 TFF에서 이미 제공 한 것과 같은 연합 데이터 세트에서 어떻게 사용해야합니까?; - 로컬 예제의 양 측면에서 불균형 (예 : 한 클라이언트에는 10 개의 예제가 있고 다른 클라이언트에는 100 개의 예제가 있음)
- 두 가지 가능성;
이러한 특성을 가진 연합 된 데이터 세트를 준비하려면 TFF 프레임 워크 내에서 어떻게 진행해야합니까?
모든 것을 손으로해야합니까? 아니면이 프로세스를 자동화하기위한 조언이 있습니까?
추가 질문 :이 백서 "Federated Visual Classification을위한 동일하지 않은 데이터 분포의 효과 측정" 에서, 그들은 Dirichlet 분포를 이용하여 동일하지 않은 클라이언트 집단을 합성하고 집중 매개 변수 를 사용합니다. 클라이언트 간의 동일성을 제어합니다. 이것은 서로 다른 수준의 이질성을 가진 데이터 세트를 생성하는 조정하기 쉬운 방법으로 보입니다. TFF 프레임 워크 내에서 또는 EMNIST와 같은 간단한 데이터 세트를 고려하여 TensorFlow (Python)에서이 전략 (또는 유사한 전략)을 구현하는 방법에 대한 조언도 매우 유용 할 것입니다.
정말 고마워.
답변
연합 학습 시뮬레이션의 경우 원하는 배포를 달성하기 위해 실험 드라이버에서 Python으로 클라이언트 데이터 세트를 설정하는 것이 매우 합리적입니다. 일부 상위 수준에서 TFF는 모델링 데이터 위치 (유형 시스템의 "배치") 및 계산 논리를 처리합니다. 시뮬레이션 데이터 세트를 다시 혼합 / 생성하는 것은 라이브러리의 핵심이 아니지만 찾은 유용한 라이브러리가 있습니다. 파이썬에서 직접 tf.data.Dataset
클라이언트 데이터 셋을 조작 한 다음 TFF 계산으로 "푸시"하는 것은 간단 해 보입니다.
비 IID 레이블
예, tff.simulation.datasets.build_single_label_dataset이 목적을위한 것입니다.
a를 취하고 tf.data.Dataset
본질적으로에 desired_label
대한 값 과 일치하지 않는 모든 예제를 필터링 합니다 label_key
(데이터 세트가 dict
구조와 같은 결과를 산출한다고 가정 ).
EMNIST 의 경우 (사용자에 관계없이) 모든 데이터 세트를 생성 하려면 다음을 수행 할 수 있습니다.
train_data, _ = tff.simulation.datasets.emnist.load_data()
ones = tff.simulation.datasets.build_single_label_dataset(
train_data.create_tf_dataset_from_all_clients(),
label_key='label', desired_label=1)
print(ones.element_spec)
>>> OrderedDict([('label', TensorSpec(shape=(), dtype=tf.int32, name=None)), ('pixels', TensorSpec(shape=(28, 28), dtype=tf.float32, name=None))])
print(next(iter(ones))['label'])
>>> tf.Tensor(1, shape=(), dtype=int32)
데이터 불균형
tf.data.Dataset.repeat및 의 조합을 tf.data.Dataset.take사용하여 데이터 불균형을 생성 할 수 있습니다.
train_data, _ = tff.simulation.datasets.emnist.load_data()
datasets = [train_data.create_tf_dataset_for_client(id) for id in train_data.client_ids[:2]]
print([tf.data.experimental.cardinality(ds).numpy() for ds in datasets])
>>> [93, 109]
datasets[0] = datasets[0].repeat(5)
datasets[1] = datasets[1].take(5)
print([tf.data.experimental.cardinality(ds).numpy() for ds in datasets])
>>> [465, 5]