TensorFlow Federated: फेडरेटेड डेटासेट में गैर-IIDness कैसे ट्यून करें?
मैं TensorFlow Federated (TFF) में कुछ एल्गोरिदम का परीक्षण कर रहा हूं। इस संबंध में, मैं एक ही फ़ेडरेटेड डेटासेट पर अलग-अलग "स्तरों" के साथ डेटा विविधता, यानी गैर-IIDness का परीक्षण करना और उनकी तुलना करना चाहूंगा।
इसलिए, मैं जानना चाहूंगा कि क्या किसी विशिष्ट फेडेरेट में गैर-IIDness के "स्तर" को नियंत्रित करने और ट्यून करने का कोई तरीका है, एक स्वचालित या अर्ध-स्वचालित फैशन में, जैसे कि TFF एपीआई या सिर्फ पारंपरिक TF API के माध्यम से। (शायद दैटसेट बर्तनों के अंदर)।
अधिक व्यावहारिक होने के लिए: उदाहरण के लिए, TFF द्वारा प्रदान की गई EMNIST फ़ेडरेटेड डेटासेट में 3383 ग्राहक हैं, जिनमें से प्रत्येक के पास उनके हस्तलिखित अक्षर हैं। हालाँकि, ये स्थानीय डेटासेट स्थानीय उदाहरणों की संख्या और प्रतिनिधित्व वाली कक्षाओं के संदर्भ में काफी संतुलित लगते हैं (सभी वर्ग स्थानीय स्तर पर कमोबेश सभी प्रतिनिधित्व करते हैं)। अगर मैं एक फ़ेडरेटेड डेटासेट लेना चाहता हूँ (जैसे, TFF के EMNIST एक से शुरू करना) जो है:
- उदाहरण के लिए, गैर-आईआईडी, ऐसे क्लाइंट्स के लिए जो एन क्लासेस से केवल एक क्लास को पकड़ते हैं (हमेशा एक क्लासिफिकेशन टास्क का जिक्र करते हुए)। क्या यह
tff.simulation.datasets.build_single_label_datasetयहाँ प्रलेखन का उद्देश्य है । यदि ऐसा है, तो मुझे इसे एक फ़ेडरेटेड डेटासेट से कैसे उपयोग करना चाहिए जैसे कि TFF द्वारा पहले से ही उपलब्ध कराया गया है ?; - स्थानीय उदाहरणों की मात्रा के संदर्भ में असंतुलित (उदाहरण के लिए, एक ग्राहक के 10 उदाहरण हैं, दूसरे में 100 उदाहरण हैं);
- दोनों संभावनाएं;
उन विशेषताओं के साथ एक फ़ेडरेटेड डेटासेट तैयार करने के लिए मुझे TFF फ्रेमवर्क के अंदर कैसे आगे बढ़ना चाहिए?
क्या मुझे सारा सामान हाथ से करना चाहिए? या आप में से कुछ लोगों के पास इस प्रक्रिया को स्वचालित करने के लिए कुछ सलाह हैं?
एक अतिरिक्त प्रश्न: इस पत्र में "फेडरेटेड विज़ुअल क्लासिफिकेशन के लिए गैर-पहचान डेटा वितरण के प्रभावों को मापना" , ह्सु एट अल द्वारा, वे गैर-समान ग्राहकों की आबादी को संश्लेषित करने के लिए डिरिक्लेट वितरण का फायदा उठाते हैं, और वे एक एकाग्रता पैरामीटर का उपयोग करते हैं। ग्राहकों के बीच समानता को नियंत्रित करने के लिए। यह विषमता के विभिन्न स्तरों के साथ डेटासेट बनाने के लिए एक वॉइ-टू-ट्यून तरीका है। इस रणनीति (या इसी तरह के एक) को TFF फ्रेमवर्क के अंदर लागू करने के बारे में कोई भी सलाह, या केवल EMNIST जैसे सरल डेटासेट पर विचार करते हुए TensorFlow (पायथन) में, बहुत उपयोगी होगी।
आपका बहुत बहुत धन्यवाद।
जवाब
वांछित वितरण प्राप्त करने के लिए, प्रयोग चालक में फेडरेटेड लर्निंग सिमुलेशन के लिए, पायथन में क्लाइंट डेटासेट सेटअप करने के लिए यह काफी उचित है। कुछ उच्च-स्तर पर, TFF मॉडलिंग डेटा स्थान (प्रकार सिस्टम में "प्लेसमेंट") और संगणना तर्क को संभालता है। सिमुलेशन डेटासेट को री-मिक्सिंग / जेनरेट करना लाइब्रेरी के लिए बहुत महत्वपूर्ण नहीं है, हालांकि आपके द्वारा पाई गई उपयोगी लाइब्रेरी भी हैं। यह सीधे अजगर में हेरफेर करके tf.data.Datasetऔर फिर TFF गणना में ग्राहक डेटासेट को "पुश" करके सीधा लगता है।
लेबल नॉन-आईआईडी
हां, tff.simulation.datasets.build_single_label_datasetइस उद्देश्य के लिए है।
यह 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]