文章目录
- 数据集
- CIFAR-10/CIFAR-100:
- CIFAR-10
- CIFAR-100
- 特点
- 以CIFAR-10 为例:
- 示例内容
- `batches.meta`
- `data_batch_1` 到 `data_batch_5`
- `test_batch`
- 图片转换Python脚本:
- MNIST:
- Fashion-MNIST:
- EMNIST:
- Google's Federated Learning Dataset:
数据集
在联邦学习中,模型训练的数据集通常分布在多个客户端设备上。以下是一些常用于联邦学习模型训练的数据集:
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 os
PIL
(Pillow):用于图像处理和保存。numpy
:用于处理图像数据的数组操作。pickle
:用于读取 CIFAR-10 数据集的序列化数据。os
:用于处理文件和目录操作。
-
解压缩函数
def unpickle(file): with open(file, 'rb') as fo: data_dict = pickle.load(fo, encoding='latin1') return data_dict
unpickle
函数从指定的文件中读取 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
目录,文件名由标签和索引组成。
- 加载测试数据文件
MNIST:
这个数据集包含了手写数字的图像,常用于手写数字识别任务。由于其简单性和小规模,MNIST是联邦学习中一个经典的入门数据集。
Fashion-MNIST:
这是一个与MNIST类似的图像数据集,但包含了各种时尚产品的图像,用于服装分类任务。它提供了更复杂的分类任务,比MNIST略有挑战性。
EMNIST:
扩展的MNIST数据集,包含了手写字母的图像。适用于字母识别任务,提供了对更复杂字符分类的挑战。
Google’s Federated Learning Dataset:
谷歌提供了一些专门为联邦学习设计的数据集,用于训练和评估联邦学习算法。这些数据集涵盖了不同的任务和数据类型,如文本、图像等。