数据集
在联邦学习中,模型训练的数据集通常分布在多个客户端设备上。以下是一些常用于联邦学习模型训练的数据集:
CIFAR-10/CIFAR-100:
CIFAR-10 和 CIFAR-100 是两个广泛使用的图像数据集,常用于图像分类和计算机视觉任务。它们由加拿大多伦多大学的Alex Krizhevsky等人创建,旨在提供一个相对简单但具有挑战性的图像分类任务基准。
CIFAR-10
-
内容:CIFAR-10包含60,000张32x32像素的彩色图像,分为10个类别,每个类别有6,000张图像。
-
数据分布:
- 训练集:50,000张图像(每个类别5,000张)
- 测试集:10,000张图像(每个类别1,000张)
CIFAR-100
- 内容:CIFAR-100与CIFAR-10类似,也包含60,000张32x32像素的彩色图像,但它分为100个类别,每个类别有600张图像。
- 数据分布:
- 训练集:50,000张图像(每个类别500张)
- 测试集:10,000张图像(每个类别100张)
特点
- 图像尺寸:两者的数据集都包含32x32像素的图像。这种较小的尺寸使得数据集适合快速实验和基准测试。
- 类别数量:CIFAR-10只有10个类别,适用于较简单的分类任务;而CIFAR-100有100个类别,提供了更高的挑战性。
- 用途:CIFAR-10和CIFAR-100常用于训练和评估图像分类模型,特别是在深度学习和计算机视觉领域。它们也是许多算法的基准数据集,用于比较不同模型的性能。
你可以从以下链接下载 CIFAR-10 和 CIFAR-100 数据集:
- CIFAR-10 下载链接:CIFAR-10 数据集
- CIFAR-100 下载链接:CIFAR-100 数据集
CIFAR-10 :
下载好解压后显示如下:

在 CIFAR 数据集中,解压后的 batches.meta 文件用于存储数据集中类别的信息。具体来说,batches.meta 文件包含以下内容:
-
标签名称:文件中包含了数据集中所有类别的名称。这些名称对应于图像数据中的标签,帮助将模型预测的数字标签与实际类别名称进行匹配。
-
类别索引:文件还包含了每个类别的索引,这些索引与训练数据和测试数据中的标签值相对应。每个图像的标签是一个整数值,表示该图像的类别,
batches.meta文件帮助将这些整数标签转换为易于理解的类别名称。
在 CIFAR-10 中,batches.meta 文件包含10个类别名称,例如“飞机”、“汽车”等;而在 CIFAR-100 中,它包含100个类别的名称。
示例内容
batches.meta
batches.meta 文件的内容通常是一个 Python 的 pickle 格式文件,你可以用 Python 读取它,代码示例如下:
import pickle
# 读取 batches.meta 文件
with open('batches.meta', 'rb') as f:
meta = pickle.load(f, encoding='latin1')
# 输出类别名称
print(meta['label_names'])
在 CIFAR-10 中,meta['label_names'] 将输出:
['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']

在 CIFAR-100 中,meta['label_names'] 将输出100个类别名称,如:
['apple', 'aquarium_fish', 'baby', 'banana', 'beetle', ...]
data_batch_1 到 data_batch_5
-
内容:这些文件包含训练集的数据。每个文件存储了一部分训练数据,共5个批次(batches),每个批次包含了 10,000 张 32x32 像素的彩色图像。每张图像都有一个对应的标签,表示它属于哪个类别。

-
结构:
- 数据:这些文件的每个记录包括图像数据和标签。图像数据存储为 32x32 的像素数组,每个像素有三个值(RGB)。
- 标签:每张图像都有一个整数标签,指示它的类别。标签范围是 0 到 9,对于 CIFAR-10 数据集。
test_batch
-
内容:
test_batch文件包含了测试集的数据。这些数据与训练集的数据类似,但用于模型的评估。测试集包含 10,000 张图像,每张图像也有一个标签。

-
结构:和训练集的数据批次文件类似,
test_batch文件存储图像数据和标签。数据的存储格式与data_batch_1到data_batch_5是相同的。 -
文件格式:你可以用类似的方式读取
test_batch文件,代码示例如下:
图片转换Python脚本:
下面我将教大家如何将图片转换为.jpg格式:
from PIL import Image
import numpy as np
import pickle
import os
# 解压缩,返回解压后的字典
def unpickle(file):
with open(file, 'rb') as fo:
data_dict = pickle.load(fo, encoding='latin1')
return data_dict
# 保存图像
def save_image(img_array, filename):
img = Image.fromarray(img_array)
img.save(filename)
# 确保输出目录存在
if not os.path.exists('train'):
os.makedirs('train')
if not os.path.exists('test'):
os.makedirs('test')
# 生成训练集图片
for j in range(1, 6):
dataName = f"data_batch_{j}" # 读取当前目录下的data_batch文件
Xtr = unpickle(dataName)
print(dataName + " is loading...")
for i in range(0, 10000):
img = np.reshape(Xtr['data'][i], (3, 32, 32))
img = img.transpose(1, 2, 0).astype(np.uint8) # 转换为uint8类型
picName = f'train/{Xtr["labels"][i]}_{i + (j - 1) * 10000}.jpg'
save_image(img, picName)
print(dataName + " loaded.")
print("test_batch is loading...")
# 生成测试集图片
testXtr = unpickle("test_batch")
for i in range(0, 10000):
img = np.reshape(testXtr['data'][i], (3, 32, 32))
img = img.transpose(1, 2, 0).astype(np.uint8) # 转换为uint8类型
picName = f'test/{testXtr["labels"][i]}_{i}.jpg'
save_image(img, picName)
print("test_batch loaded.")
-
导入所需库
from PIL import Image import numpy as np import pickle import osPIL(Pillow):用于图像处理和保存。numpy:用于处理图像数据的数组操作。pickle:用于读取 CIFAR-10 数据集的序列化数据。os:用于处理文件和目录操作。
-
解压缩函数
def unpickle(file): with open(file, 'rb') as fo: data_dict = pickle.load(fo, encoding='latin1') return data_dictunpickle函数从指定的文件中读取 pickle 数据,并返回一个字典。该字典包含图像数据和标签。
-
保存图像函数
def save_image(img_array, filename): img = Image.fromarray(img_array) img.save(filename)save_image函数将图像数组保存为 JPEG 文件。Image.fromarray将numpy数组转换为PIL图像对象,然后使用save方法保存图像。
-
确保输出目录存在
if not os.path.exists('train'): os.makedirs('train') if not os.path.exists('test'): os.makedirs('test')- 检查
train和test目录是否存在。如果不存在,则创建这些目录,用于存储图像文件。
- 检查
-
生成训练集图片
for j in range(1, 6): dataName = f"data_batch_{j}" # 读取当前目录下的data_batch文件 Xtr = unpickle(dataName) print(dataName + " is loading...") for i in range(0, 10000): img = np.reshape(Xtr['data'][i], (3, 32, 32)) img = img.transpose(1, 2, 0).astype(np.uint8) # 转换为uint8类型 picName = f'train/{Xtr["labels"][i]}_{i + (j - 1) * 10000}.jpg' save_image(img, picName) print(dataName + " loaded.")- 循环遍历训练数据的批次文件(
data_batch_1到data_batch_5)。 - 对于每个批次文件,从中读取数据和标签。
- 将每张图像数据重塑为
(3, 32, 32)数组,然后转置为(32, 32, 3)的格式,并转换为uint8类型(以确保图像数据类型正确)。 - 根据图像的标签和索引生成文件名,并将图像保存到
train目录。
- 循环遍历训练数据的批次文件(
-
生成测试集图片
print("test_batch is loading...") testXtr = unpickle("test_batch") for i in range(0, 10000): img = np.reshape(testXtr['data'][i], (3, 32, 32)) img = img.transpose(1, 2, 0).astype(np.uint8) # 转换为uint8类型 picName = f'test/{testXtr["labels"][i]}_{i}.jpg' save_image(img, picName) print("test_batch loaded.")- 加载测试数据文件
test_batch。 - 处理和保存测试集中的每张图像,过程与训练集类似。
- 图像保存到
test目录,文件名由标签和索引组成。
- 加载测试数据文件

CIFAR-100:
下载解压缩cifar-100-python:

read.py:
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import pickle
import os
# 函数来将二进制数据转换为图片
def unpickle(file):
with open(file, 'rb') as f:
data = pickle.load(f, encoding='latin1')
return data
def save_cifar100_images(data_dict, output_folder):
# 创建文件夹(如果不存在的话)
if not os.path.exists(output_folder):
os.makedirs(output_folder)
data = data_dict['data']
labels = data_dict['fine_labels']
num_images = len(data)
for i in range(num_images):
img = data[i].reshape(3, 32, 32).transpose(1, 2, 0)
img = Image.fromarray(img)
label = labels[i]
img.save(os.path.join(output_folder, f'{i:05d}_label_{label}.png'))
# 每10000张图片输出一次提示信息
if (i + 1) % 10000 == 0:
print(f'Processed {i + 1} images out of {num_images}')
# 处理训练数据和测试数据
train_data = unpickle('cifar-100-python/train')
test_data = unpickle('cifar-100-python/test')
save_cifar100_images(train_data, 'images/train')
save_cifar100_images(test_data, 'images/test')
这段代码的目的是将 CIFAR-100 数据集中的图像数据转换为可视化的图片,并将其保存到指定的文件夹中。下面是代码的详细解释:
导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import pickle
import os
numpy:用于处理数组和矩阵运算。matplotlib.pyplot:用于绘图,但在这段代码中并没有用到。PIL(Python Imaging Library):用于图像处理。pickle:用于序列化和反序列化数据。os:用于与操作系统交互,例如创建目录和处理文件路径。
函数 unpickle
def unpickle(file):
with open(file, 'rb') as f:
data = pickle.load(f, encoding='latin1')
return data
- 目的:读取 CIFAR-100 数据集的二进制文件,并将其反序列化为 Python 对象。
- 输入:
file是二进制文件的路径。 - 输出:反序列化后的数据(通常是一个字典,包含图像数据和标签)。
函数 save_cifar100_images
def save_cifar100_images(data_dict, output_folder):
# 创建文件夹(如果不存在的话)
if not os.path.exists(output_folder):
os.makedirs(output_folder)
data = data_dict['data']
labels = data_dict['fine_labels']
num_images = len(data)
for i in range(num_images):
img = data[i].reshape(3, 32, 32).transpose(1, 2, 0)
img = Image.fromarray(img)
label = labels[i]
img.save(os.path.join(output_folder, f'{i:05d}_label_{label}.png'))
# 每10000张图片输出一次提示信息
if (i + 1) % 10000 == 0:
print(f'Processed {i + 1} images out of {num_images}')
- 目的:将 CIFAR-100 数据中的每张图像保存为 PNG 格式的图片。
- 步骤:
- 创建文件夹:如果指定的
output_folder不存在,使用os.makedirs创建它。 - 提取数据和标签:从
data_dict中提取图像数据 (data) 和标签 (labels)。 - 处理每张图片:
data[i]:获取第i张图像的数据。reshape(3, 32, 32):将图像数据重新塑造为 (3, 32, 32) 的形状,表示 RGB 图像的三个通道。transpose(1, 2, 0):将形状从 (3, 32, 32) 转换为 (32, 32, 3),以符合图像的标准格式。Image.fromarray(img):将数组转换为图像对象。img.save():将图像保存到指定的路径,文件名包含图像的索引和标签。
- 输出进度信息:每处理 10,000 张图片时,输出当前处理的图片数量。
- 创建文件夹:如果指定的
处理训练数据和测试数据
train_data = unpickle('cifar-100-python/train')
test_data = unpickle('cifar-100-python/test')
save_cifar100_images(train_data, 'images/train')
save_cifar100_images(test_data, 'images/test')
- 读取数据:
unpickle('cifar-100-python/train'):读取训练数据文件。unpickle('cifar-100-python/test'):读取测试数据文件。
- 保存数据:
save_cifar100_images(train_data, 'images/train'):将训练数据保存到images/train文件夹。save_cifar100_images(test_data, 'images/test'):将测试数据保存到images/test文件夹。
训练集:

测试集:

MNIST:
MNIST 数据集(Modified National Institute of Standards and Technology database)是一个广泛使用的手写数字识别数据集,由 Yann LeCun 等人创建。它包含 0 到 9 这 10 个数字的手写体图像,每个图像都是 28x28 像素的灰度图。MNIST 数据集被广泛用于机器学习和计算机视觉领域,尤其是初学者和研究者用来测试新算法和技术。
数据集内容
MNIST 数据集包含以下内容:
- 训练集:60,000 张手写数字图像及其对应的标签。
- 测试集:10,000 张手写数字图像及其对应的标签。
每张图像都是 28x28 像素,总共包含 784 个像素点。每个像素的灰度值在 0 到 255 之间,其中 0 表示黑色,255 表示白色。
下载链接
你可以从以下链接下载 MNIST 数据集:
下载页面提供了以下文件:
- 训练集图像(
train-images-idx3-ubyte.gz) - 训练集标签(
train-labels-idx1-ubyte.gz) - 测试集图像(
t10k-images-idx3-ubyte.gz) - 测试集标签(
t10k-labels-idx1-ubyte.gz)
数据集转图片

将read.py脚本和四个数据集文件放在同一目录下,然后运行下述脚本:
import struct
import numpy as np
from PIL import Image
import os
class MnistParser:
# 加载图像
def load_image(self, file_path):
# 读取二进制数据
with open(file_path, 'rb') as f:
binary = f.read()
# 读取头文件
fmt_head = '>iiii'
offset = 0
magic_number, images_number, rows_number, columns_number = struct.unpack_from(fmt_head, binary, offset)
# 打印头文件信息
print('图片数量:%d, 图片行数:%d, 图片列数:%d' % (images_number, rows_number, columns_number))
# 处理数据
image_size = rows_number * columns_number
fmt_data = '>' + str(image_size) + 'B'
offset += struct.calcsize(fmt_head)
# 读取数据
images = np.empty((images_number, rows_number, columns_number))
for i in range(images_number):
images[i] = np.array(struct.unpack_from(fmt_data, binary, offset)).reshape((rows_number, columns_number))
offset += struct.calcsize(fmt_data)
# 每1万张打印一次信息
if (i + 1) % 10000 == 0:
print('> 已读取:%d张图片' % (i + 1))
# 返回数据
return images_number, rows_number, columns_number, images
# 加载标签
def load_labels(self, file_path):
# 读取数据
with open(file_path, 'rb') as f:
binary = f.read()
# 读取头文件
fmt_head = '>ii'
offset = 0
magic_number, items_number = struct.unpack_from(fmt_head, binary, offset)
# 打印头文件信息
print('标签数:%d' % (items_number))
# 处理数据
fmt_data = '>B'
offset += struct.calcsize(fmt_head)
# 读取数据
labels = np.empty((items_number))
for i in range(items_number):
labels[i] = struct.unpack_from(fmt_data, binary, offset)[0]
offset += struct.calcsize(fmt_data)
# 每1万张打印一次信息
if (i + 1) % 10000 == 0:
print('> 已读取:%d个标签' % (i + 1))
# 返回数据
return items_number, labels
# 图片可视化
def visualization(self, images, labels, path):
os.makedirs(path, exist_ok=True) # 如果路径不存在,则创建
d = {i: 0 for i in range(10)}
for i in range(len(images)):
im = Image.fromarray(np.uint8(images[i]))
im.save(os.path.join(path, "%d_%d.png" % (labels[i], d[labels[i]])))
d[labels[i]] += 1
if (i + 1) % 10000 == 0:
print('> 已保存:%d个图片' % (i + 1))
# 保存为图片格式
def change_and_save():
mnist = MnistParser()
trainImageFile = 'train-images-idx3-ubyte'
_, _, _, images = mnist.load_image(trainImageFile)
trainLabelFile = 'train-labels-idx1-ubyte'
_, labels = mnist.load_labels(trainLabelFile)
mnist.visualization(images, labels, "images/train/")
testImageFile = 't10k-images-idx3-ubyte'
_, _, _, images = mnist.load_image(testImageFile)
testLabelFile = 't10k-labels-idx1-ubyte'
_, labels = mnist.load_labels(testLabelFile)
mnist.visualization(images, labels, "images/test/")
# 测试
if __name__ == '__main__':
change_and_save()

图片拼接展示(9*9)
import os
import random
from PIL import Image
def stitch_images_from_folder(folder_path, grid_size, save_path, num_images):
image_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.png')]
assert len(image_files) >= num_images, "图片数量不足以填充网格"
# 随机选择图片
selected_images = random.sample(image_files, num_images)
# 打开第一张图片以获取图片的尺寸
first_image = Image.open(selected_images[0])
single_image_width, single_image_height = first_image.size
rows, cols = grid_size
# 创建一个空白大图像
stitched_image = Image.new('RGB', (cols * single_image_width, rows * single_image_height))
for idx, image_file in enumerate(selected_images):
# 计算图片在大图中的位置
x = (idx % cols) * single_image_width
y = (idx // cols) * single_image_height
im = Image.open(image_file)
stitched_image.paste(im, (x, y))
stitched_image.save(save_path)
stitched_image.show()
# 示例调用
if __name__ == '__main__':
train_folder_path = 'images/train/'
test_folder_path = 'images/test/'
# 拼接训练集随机选择的81张图片,9x9 网格
stitch_images_from_folder(train_folder_path, (9, 9), "images/stitched_train_image.png", 81)
# 拼接测试集随机选择的81张图片,9x9 网格
stitch_images_from_folder(test_folder_path, (9, 9), "images/stitched_test_image.png", 81)
训练集:

测试集:

Fashion-MNIST:
Fashion-MNIST 是一个替代 MNIST 手写数字数据集的图像数据集。它包含 10 个类别的时尚商品图片,包括衬衫、裤子、鞋子、包包等。每张图片是 28x28 的灰度图像,数据集的结构和 MNIST 相同。
数据集内容
- 训练集:60,000 张图片
- 测试集:10,000 张图片
- 图像大小:28x28 像素
- 类别:10 类
类别
- T-shirt/top (T恤/上衣)
- Trouser (裤子)
- Pullover (套衫)
- Dress (连衣裙)
- Coat (外套)
- Sandal (凉鞋)
- Shirt (衬衫)
- Sneaker (运动鞋)
- Bag (包)
- Ankle boot (短靴)
下载地址
Fashion-MNIST 数据集可以从以下网址下载:
文件结构
数据集包含四个文件:
train-images-idx3-ubyte.gz: 训练集图像train-labels-idx1-ubyte.gz: 训练集标签t10k-images-idx3-ubyte.gz: 测试集图像t10k-labels-idx1-ubyte.gz: 测试集标签
解压这些文件后,你可以像处理 MNIST 数据集一样读取它们。
- 训练集:

- 测试集:

EMNIST:
Extended MNIST (EMNIST) 是一系列基于 MNIST 数据集的扩展数据集,旨在通过增加更多的数据集,支持字母和手写字符识别任务。EMNIST 提供了多个数据集,其中包括手写字母、手写数字和其他字符集,每个数据集都是 MNIST 数据集的扩展或变体。
EMNIST 数据集概述
-
EMNIST ByClass:
- 包含 814,255 张手写字母图像。
- 26 个字母的类别,每个类别有多个样本。
-
EMNIST ByMerge:
- 合并了多个字母数据集,包含 814,255 张手写字母图像。
- 类别与 ByClass 相同,但样本分布略有不同。
-
EMNIST ByForm:
- 提供了不同的手写字母形式,包括 814,255 张图像。
- 包含不同的字体样式和字母样式。
-
EMNIST Digits:
- 包含 280,000 张手写数字图像。
- 是 MNIST 数据集的扩展版本,包含更多样本。
-
EMNIST Letters:
- 包含 145,600 张手写字母图像。
- 提供了比 MNIST 更多的字母样本。
-
EMNIST MNIST:
- 这是 MNIST 数据集的扩展版本,包含更多的样本和类别。
- 是对 MNIST 数据集的补充,增加了额外的图像。
-
EMNIST Balanced:
- 由 EMNIST ByClass 和 ByMerge 数据集合并而来。
- 包含 814,255 张手写字母图像,并且各类别样本数更平衡。
-
EMNIST Notebooks:
- 包含各种手写字符和符号。
- 提供了一种更加多样化的字符数据集。
下载链接
EMNIST 数据集可以从以下地址下载:
在这个页面上,你可以找到所有 EMNIST 数据集的下载链接和详细说明。
Google’s Federated Learning Dataset:
谷歌提供了一些专门为联邦学习设计的数据集,用于训练和评估联邦学习算法。这些数据集涵盖了不同的任务和数据类型,如文本、图像等。
2万+

被折叠的 条评论
为什么被折叠?



