常见用于联邦学习的数据集【FL】【Datasets】

数据集

在联邦学习中,模型训练的数据集通常分布在多个客户端设备上。以下是一些常用于联邦学习模型训练的数据集:

CIFAR-10/CIFAR-100:

CIFAR-10CIFAR-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张)

特点

  1. 图像尺寸:两者的数据集都包含32x32像素的图像。这种较小的尺寸使得数据集适合快速实验和基准测试。
  2. 类别数量:CIFAR-10只有10个类别,适用于较简单的分类任务;而CIFAR-100有100个类别,提供了更高的挑战性。
  3. 用途:CIFAR-10和CIFAR-100常用于训练和评估图像分类模型,特别是在深度学习和计算机视觉领域。它们也是许多算法的基准数据集,用于比较不同模型的性能。
    你可以从以下链接下载 CIFAR-10 和 CIFAR-100 数据集:

CIFAR-10 :

下载好解压后显示如下:
在这里插入图片描述
在 CIFAR 数据集中,解压后的 batches.meta 文件用于存储数据集中类别的信息。具体来说,batches.meta 文件包含以下内容:

  1. 标签名称:文件中包含了数据集中所有类别的名称。这些名称对应于图像数据中的标签,帮助将模型预测的数字标签与实际类别名称进行匹配。

  2. 类别索引:文件还包含了每个类别的索引,这些索引与训练数据和测试数据中的标签值相对应。每个图像的标签是一个整数值,表示该图像的类别,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_1data_batch_5
  • 内容:这些文件包含训练集的数据。每个文件存储了一部分训练数据,共5个批次(batches),每个批次包含了 10,000 张 32x32 像素的彩色图像。每张图像都有一个对应的标签,表示它属于哪个类别。在这里插入图片描述

  • 结构

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

  • 结构:和训练集的数据批次文件类似,test_batch 文件存储图像数据和标签。数据的存储格式与 data_batch_1data_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.")

  1. 导入所需库

    from PIL import Image
    import numpy as np
    import pickle
    import os
    
    • PIL(Pillow):用于图像处理和保存。
    • numpy:用于处理图像数据的数组操作。
    • pickle:用于读取 CIFAR-10 数据集的序列化数据。
    • os:用于处理文件和目录操作。
  2. 解压缩函数

    def unpickle(file):
        with open(file, 'rb') as fo:
            data_dict = pickle.load(fo, encoding='latin1')
        return data_dict
    
    • unpickle 函数从指定的文件中读取 pickle 数据,并返回一个字典。该字典包含图像数据和标签。
  3. 保存图像函数

    def save_image(img_array, filename):
        img = Image.fromarray(img_array)
        img.save(filename)
    
    • save_image 函数将图像数组保存为 JPEG 文件。Image.fromarraynumpy 数组转换为 PIL 图像对象,然后使用 save 方法保存图像。
  4. 确保输出目录存在

    if not os.path.exists('train'):
        os.makedirs('train')
    if not os.path.exists('test'):
        os.makedirs('test')
    
    • 检查 traintest 目录是否存在。如果不存在,则创建这些目录,用于存储图像文件。
  5. 生成训练集图片

    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_1data_batch_5)。
    • 对于每个批次文件,从中读取数据和标签。
    • 将每张图像数据重塑为 (3, 32, 32) 数组,然后转置为 (32, 32, 3) 的格式,并转换为 uint8 类型(以确保图像数据类型正确)。
    • 根据图像的标签和索引生成文件名,并将图像保存到 train 目录。
  6. 生成测试集图片

    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 格式的图片。
  • 步骤
    1. 创建文件夹:如果指定的 output_folder 不存在,使用 os.makedirs 创建它。
    2. 提取数据和标签:从 data_dict 中提取图像数据 (data) 和标签 (labels)。
    3. 处理每张图片
      • 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():将图像保存到指定的路径,文件名包含图像的索引和标签。
    4. 输出进度信息:每处理 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 数据集:

下载页面提供了以下文件:

  1. 训练集图像train-images-idx3-ubyte.gz
  2. 训练集标签train-labels-idx1-ubyte.gz
  3. 测试集图像t10k-images-idx3-ubyte.gz
  4. 测试集标签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 类

类别

  1. T-shirt/top (T恤/上衣)
  2. Trouser (裤子)
  3. Pullover (套衫)
  4. Dress (连衣裙)
  5. Coat (外套)
  6. Sandal (凉鞋)
  7. Shirt (衬衫)
  8. Sneaker (运动鞋)
  9. Bag (包)
  10. Ankle boot (短靴)

下载地址

Fashion-MNIST 数据集可以从以下网址下载:

文件结构

数据集包含四个文件:

  1. train-images-idx3-ubyte.gz: 训练集图像
  2. train-labels-idx1-ubyte.gz: 训练集标签
  3. t10k-images-idx3-ubyte.gz: 测试集图像
  4. t10k-labels-idx1-ubyte.gz: 测试集标签

解压这些文件后,你可以像处理 MNIST 数据集一样读取它们。

  • 训练集:
    在这里插入图片描述
  • 测试集:
    在这里插入图片描述

EMNIST:

Extended MNIST (EMNIST) 是一系列基于 MNIST 数据集的扩展数据集,旨在通过增加更多的数据集,支持字母和手写字符识别任务。EMNIST 提供了多个数据集,其中包括手写字母、手写数字和其他字符集,每个数据集都是 MNIST 数据集的扩展或变体。

EMNIST 数据集概述

  1. EMNIST ByClass:

    • 包含 814,255 张手写字母图像。
    • 26 个字母的类别,每个类别有多个样本。
  2. EMNIST ByMerge:

    • 合并了多个字母数据集,包含 814,255 张手写字母图像。
    • 类别与 ByClass 相同,但样本分布略有不同。
  3. EMNIST ByForm:

    • 提供了不同的手写字母形式,包括 814,255 张图像。
    • 包含不同的字体样式和字母样式。
  4. EMNIST Digits:

    • 包含 280,000 张手写数字图像。
    • 是 MNIST 数据集的扩展版本,包含更多样本。
  5. EMNIST Letters:

    • 包含 145,600 张手写字母图像。
    • 提供了比 MNIST 更多的字母样本。
  6. EMNIST MNIST:

    • 这是 MNIST 数据集的扩展版本,包含更多的样本和类别。
    • 是对 MNIST 数据集的补充,增加了额外的图像。
  7. EMNIST Balanced:

    • 由 EMNIST ByClass 和 ByMerge 数据集合并而来。
    • 包含 814,255 张手写字母图像,并且各类别样本数更平衡。
  8. EMNIST Notebooks:

    • 包含各种手写字符和符号。
    • 提供了一种更加多样化的字符数据集。

下载链接

EMNIST 数据集可以从以下地址下载:

在这个页面上,你可以找到所有 EMNIST 数据集的下载链接和详细说明。


Google’s Federated Learning Dataset:

谷歌提供了一些专门为联邦学习设计的数据集,用于训练和评估联邦学习算法。这些数据集涵盖了不同的任务和数据类型,如文本、图像等。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eternity_GQM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值