今天開始跑聯邦學習論文實驗了,這里介紹一下論文的常用benchmark數據集(因為我的研究領域是聯邦/分布式學習,所以下面列出的數據集可能偏向這方面,做其他方向的童鞋參考下就好)。
1. CV數據集
(1)FEMINIST
任務:手寫字符識別
參數說明: 62種不同的字符類別 (10種數字, 26種小寫, 26種大寫)的像素(灰度)圖片, 圖片全為28乘28像素大小 (可以選擇將其轉為128×128), 總樣本數805263,可使用官方給出的代碼按3500個client非獨立同分布划分。
介紹: FEMNIST數據集全名Federated-MNIST, 屬於專門給聯邦學習用的基准數據集leaf的成員之一。
官方數據預處理與划分代碼:https://github.com/TalwalkarLab/leaf
引用方式:S Caldas, LEAF: A Benchmark for Federated Settings, 2018.
獲取方式:采用腳本獲取
wget https://s3.amazonaws.com/nist-srd/SD19/by_class.zip
wget https://s3.amazonaws.com/nist-srd/SD19/by_write.zip
(2)EMINIST
任務:手寫字符識別
參數說明: 按照byclass方式split的話是62種不同的字符類別(各類別數量不均衡) (10種數字, 26種小寫, 26種大寫)的像素(灰度)圖片, 圖片全為28乘28像素大小, 樣本數814255,在聯邦學習場景下需要自行設計划分算法進行划分。
介紹: EMNIST數據集全名extension of MNIST,是MINIST數據集的擴展版。
官網:https://www.nist.gov/itl/products-and-services/emnist-dataset
引用方式:Cohen G, EMNIST: an extension of MNIST to handwritten letters, 2017
獲取方式:可以采用腳本獲取
wget https://www.itl.nist.gov/iaui/vip/cs_links/EMNIST/gzip.zip
也可以直接從torchvision中開箱即用
from torchvision.datasets import EMNIST
from torchvision.transforms import Compose, ToTensor, Normalize
RAW_DATA_PATH = './rawdata'
transform = Compose(
[ToTensor(),
Normalize((0.1307,), (0.3081,))
]
)
train_dataset = EMNIST(
root=RAW_DATA_PATH,
split="byclass",
download=True,
train=True, #True加載訓練集,False加載測試集
transform=transform
)
一定要注意參數 train
的設置,訓練集和測試集要分開加載,直接加載出來的不是全部數據集!
該數據集可視化呈現結果如下:

(3)FashionMINIST
任務:時尚物品圖像識別
參數說明: 一共10種不同的時尚物品類別 (10種數字, 26種小寫, 26種大寫)的像素圖片, 圖片全為28乘28像素大小的像素(灰度)圖, 樣本數70000(訓練集60000測試集10000),在聯邦學習場景下需要自行設計划分算法進行划分。
介紹: FashionMNIST數據集取材於Zalando文章中的圖片,是MINIST數據集的擴展版。
官網:https://github.com/zalandoresearch/fashion-mnist
引用方式:Xiao H, Rasul K, Vollgraf R. Fashion-mnist: a novel image dataset for benchmarking machine learning algorithms, 2017
獲取方式:可以直接git clone 原始項目
git clone https://github.com/zalandoresearch/fashion-mnist.git
或從Kaggle上下載:https://www.kaggle.com/zalando-research/fashionmnist
也可以直接從torchvision中開箱即用
from torchvision.datasets import FashionMNIST
from torchvision.transforms import Compose, ToTensor, Normalize
RAW_DATA_PATH = './rawdata'
transform = Compose(
[ToTensor(),
Normalize((0.1307,), (0.3081,))
]
)
train_dataset = FashionMNIST(
root=RAW_DATA_PATH,
download=True,
train=True, #True加載訓練集,False加載測試集
transform=transform
)
一定要注意參數 train
的設置,訓練集和測試集要分開加載,直接加載出來的不是全部數據集!
該數據集可視化呈現結果如下:

(4)CIFAR10
任務:圖像分類
參數說明: 10種32x32的彩色圖片(包括人、動物、花、昆蟲等), 每種類別都有6000張圖片. 50000張訓練圖片10000張測試圖片,在聯邦學習場景下需要自行設計划分算法進行划分。
介紹: CIFAR-10 是所謂的8千萬張微型圖片數據集的有標簽子集。
官網:https://www.cs.toronto.edu/~kriz/cifar.html
引用方式:Alex Krizhevsky, Learning Multiple Layers of Features from Tiny Images, 2009.
獲取方式:
直接從torchvision中開箱即用
from torchvision.datasets import CIFAR10
from torchvision.transforms import Compose, ToTensor, Normalize
RAW_DATA_PATH = './rawdata'
transform = Compose([
ToTensor(),
Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])
dataset = CIFAR10(
root=RAW_DATA_PATH,
download=True,
train=True, #True加載訓練集,False加載測試集
transform=transform
)
一定要注意參數 train
的設置,訓練集和測試集要分開加載,直接加載出來的不是全部數據集!
該數據集可視化呈現結果如下:

(5)CIFAR100
任務:圖像分類
參數說明: 100種32x32的彩色圖片(包括人、動物、花、昆蟲等), 每種類別都有600張圖片. 500張訓練圖片100張測試圖片,在聯邦學習場景下需要自行采用划分算法進行划分。
介紹: CIFAR-10的兄弟,也是所謂的8千萬張微型圖片數據集的有標簽子集。
官網:https://www.cs.toronto.edu/~kriz/cifar.html
引用方式:Alex Krizhevsky, Learning Multiple Layers of Features from Tiny Images, 2009.
獲取方式:
直接從torchvision中開箱即用
from torchvision.datasets import CIFAR100
from torchvision.transforms import Compose, ToTensor, Normalize
RAW_DATA_PATH = './rawdata'
transform = Compose([
ToTensor(),
Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])
dataset = CIFAR100(
root=RAW_DATA_PATH,
download=True,
train=True, #True加載訓練集,False加載測試集
transform=transform
)
一定要注意參數 train
的設置,訓練集和測試集要分開加載,直接加載出來的不是全部數據集!
該數據集可視化呈現結果如下:

2. NLP數據集
(1)Shakespeare
任務:下一個字符預測
參數說明:總共4,226,15條樣本,可使用官方給出的划分代碼按照聯邦學習場景下1129個client非獨立同分布划分。
介紹: 和FEMNST一樣,屬於專門給聯邦學習用的基准數據集leaf的成員之一。
官方數據預處理與划分代碼:https://github.com/TalwalkarLab/leaf
引用方式:LEAF: A Benchmark for Federated Settings
獲取方式:
用腳本獲取
wget http://www.gutenberg.org/files/100/old/1994-01-100.zip
3.普通回歸/分類
(1)Synthetic
任務:二分類
參數說明:用戶能夠自定義分布式節點數量, 類別數量以及維度
介紹: 這個數據集提供了一個生成人工的、但是有挑戰性的聯邦學習數據集方法, 我們要求的目標是分布式節點上的模型能夠盡量有獨立性。論文中詳細地給出了數據集的生成過程。和FEMNST一樣,屬於專門給聯邦學習用的基准數據集leaf的成員之一,在使用前可使用官方給出的代碼按照非獨立同分布進行划分(需要先指定client的數目)。
官方數據預處理與划分代碼:https://github.com/TalwalkarLab/leaf
引用方式:LEAF: A Benchmark for Federated Settings
獲取方式:
需按照下列python代碼對數據集進行人工生成(詳情見官方數據預處理與划分代碼):
from scipy.special import softmax
NUM_DIM = 10
class SyntheticDataset:
def __init__(
self,
num_classes=2,
seed=931231,
num_dim=NUM_DIM,
prob_clusters=[0.5, 0.5]):
np.random.seed(seed)
self.num_classes = num_classes
self.num_dim = num_dim
self.num_clusters = len(prob_clusters)
self.prob_clusters = prob_clusters
self.side_info_dim = self.num_clusters
self.Q = np.random.normal(
loc=0.0, scale=1.0, size=(self.num_dim + 1, self.num_classes, self.side_info_dim))
self.Sigma = np.zeros((self.num_dim, self.num_dim))
for i in range(self.num_dim):
self.Sigma[i, i] = (i + 1)**(-1.2)
self.means = self._generate_clusters()
def get_task(self, num_samples):
cluster_idx = np.random.choice(
range(self.num_clusters), size=None, replace=True, p=self.prob_clusters)
new_task = self._generate_task(self.means[cluster_idx], cluster_idx, num_samples)
return new_task
def _generate_clusters(self):
means = []
for i in range(self.num_clusters):
loc = np.random.normal(loc=0, scale=1., size=None)
mu = np.random.normal(loc=loc, scale=1., size=self.side_info_dim)
means.append(mu)
return means
def _generate_x(self, num_samples):
B = np.random.normal(loc=0.0, scale=1.0, size=None)
loc = np.random.normal(loc=B, scale=1.0, size=self.num_dim)
samples = np.ones((num_samples, self.num_dim + 1))
samples[:, 1:] = np.random.multivariate_normal(
mean=loc, cov=self.Sigma, size=num_samples)
return samples
def _generate_y(self, x, cluster_mean):
model_info = np.random.normal(loc=cluster_mean, scale=0.1, size=cluster_mean.shape)
w = np.matmul(self.Q, model_info)
num_samples = x.shape[0]
prob = softmax(np.matmul(x, w) + np.random.normal(loc=0., scale=0.1, size=(num_samples, self.num_classes)), axis=1)
y = np.argmax(prob, axis=1)
return y, w, model_info
def _generate_task(self, cluster_mean, cluster_id, num_samples):
x = self._generate_x(num_samples)
y, w, model_info = self._generate_y(x, cluster_mean)
# now that we have y, we can remove the bias coeff
x = x[:, 1:]
return {'x': x, 'y': y, 'w': w, 'model_info': model_info, 'cluster': cluster_id}