在开始深度学习和计算机视觉的旅程中,选择合适的数据集至关重要。本文将详细介绍三个常用的数据集:CIFAR、ImageNet 和 MNIST。这些数据集不仅为研究人员提供了丰富的训练资源,也为学习者提供了宝贵的实践机会。

CIFAR 数据集

简介

CIFAR(Canadian Institute For Advanced Research)数据集是由多伦多大学的Alex Krizhevsky和Geoffrey Hinton等人创建的。CIFAR数据集主要用于图像分类任务,广泛用于机器学习和计算机视觉研究。

主要特征

CIFAR数据集有两个主要版本:

  • CIFAR-10:包含10个类别,每个类别有6000张32x32彩色图像,总共60000张图像。
  • CIFAR-100:包含100个类别,每个类别有600张32x32彩色图像,总共60000张图像。

每个数据集分为50000张训练图像和10000张测试图像。

类别

  • CIFAR-10的类别:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船、卡车。
  • CIFAR-100的类别:包含20个超级类(如“哺乳动物”、“鱼类”等),每个超级类下有5个子类,总共100个细分类。

下载与使用

  1. 下载

    • 你可以从CIFAR数据集的官方网站下载:CIFAR-10 和 CIFAR-100 数据集
    • 也可以通过Python中的torchvisiontensorflow_datasets等库下载。
  2. 使用

    • 在PyTorch中使用CIFAR-10:
      import torchvision
      import torchvision.transforms as transforms
      
      transform = transforms.Compose(
          [transforms.ToTensor(),
           transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
      
      trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                              download=True, transform=transform)
      trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                                shuffle=True, num_workers=2)
      
      testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                             download=True, transform=transform)
      testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                               shuffle=False, num_workers=2)
      
    • 在TensorFlow中使用CIFAR-10:
      import tensorflow as tf
      
      (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.cifar10.load_data()
      
      train_images, test_images = train_images / 255.0, test_images / 255.0
      

示例图像

在这里插入图片描述

CIFAR 详细实验设置

CIFAR 10 和 CIFAR100 数据集 (Krizhevsky et al.) 包含 5 万张训练图像和 1 万张验证图像。设置 4 的填充,并随机裁剪训练图像到 32×32。其他数据增强包括

(1) 随机水平翻转 (Random Horizontal Flip),

(2) 剪切 (Cutout) (DeVries & Taylor, 2017),

(3) 自动增强 (AutoAugment) (Cubuk et al., 2019)。

测试效果

以下是使用简单卷积神经网络(CNN)在CIFAR-10上的测试效果:

import torch
import torch.nn as nn
import torch.optim as optim

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, 3, padding=1)
        self.conv2 = nn.Conv2d(16, 32, 3, padding=1)
        self.pool = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(32 * 8 * 8, 512)
        self.fc2 = nn.Linear(512, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 32 * 8 * 8)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

net = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

for epoch in range(10):
    for inputs, labels in trainloader:
        optimizer.zero_grad()
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

# 测试准确率
correct = 0
total = 0
with torch.no_grad():
    for inputs, labels in testloader:
        outputs = net(inputs)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Accuracy: {100 * correct / total} %')

ImageNet 数据集

简介

ImageNet是由斯坦福大学的Fei-Fei Li教授领导的团队创建的。ImageNet是一个大规模的图像数据库,旨在推动计算机视觉和深度学习的发展。ImageNet中最著名的子集是用于ImageNet大规模视觉识别挑战赛(ILSVRC)的数据集。

主要特征

  • ImageNet数据集中包含超过1400万张图像,其中超过1000万张有标签。
  • ILSVRC数据集包含1000个类别,每个类别有约1300张训练图像和50张验证图像。

类别

ImageNet的类别非常丰富,涵盖了广泛的现实世界中的物体,如动物、植物、工具、日常用品等。

下载与使用

  1. 下载

    • 你可以从ImageNet官方网站申请下载:ImageNet 数据集,但需要注册账号并申请下载权限。
    • 下载过程较为复杂,因为数据集非常大。
  2. 使用

    • 在PyTorch中使用预训练的ResNet模型:
      import torchvision.models as models
      import torchvision.transforms as transforms
      from PIL import Image
      
      # 加载预训练模型
      model = models.resnet50(pretrained=True)
      model.eval()
      
      # 预处理图像
      preprocess = transforms.Compose([
          transforms.Resize(256),
          transforms.CenterCrop(224),
          transforms.ToTensor(),
          transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
      ])
      
      img = Image.open("your_image.jpg")
      img_t = preprocess(img)
      batch_t = torch.unsqueeze(img_t, 0)
      
      # 推理
      out = model(batch_t)
      

示例图像

在这里插入图片描述

ImageNet 详细实验设置

对于 ImageNet 数据集 (Deng et al., 2009) ,包含 1.2 亿张训练图像和 5 万张验证图像。在训练前的预处理阶段,随机裁剪并将训练图像调整为 224×224 的大小。

此外,我们还应用了颜色抖动 (CollorJitter),参数设置为亮度=0.2,对比度=0.2,饱和度=0.2,色调=0.1。对于测试图像,将它们中心裁剪到相同的大小。

测试效果

以下是使用预训练ResNet50模型在ImageNet上的测试效果:

import torch
import torchvision.models as models
import torchvision.transforms as transforms
from PIL import Image

# 加载预训练模型
model = models.resnet50(pretrained=True)
model.eval()

# 预处理图像
preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

img = Image.open("your_image.jpg")
img_t = preprocess(img)
batch_t = torch.unsqueeze(img_t, 0)

# 推理
out = model(batch_t)
_, index = torch.max(out, 1)

# 打印分类结果
print(f"Predicted class index: {index.item()}")

MNIST 数据集

简介

MNIST(Modified National Institute of Standards and Technology)数据集是由美国国家标准与技术研究院(NIST)提供的手写数字数据集。它是机器学习和图像识别领域最常用的数据集之一。

主要特征

  • MNIST包含60000张训练图像和10000张测试图像,每张图像是28x28的灰度图像,代表数字0到9。

类别

MNIST包含10个类别,分别代表手写数字0到9。

下载与使用

  1. 下载

    • MNIST数据集可以从多种资源下载,比如通过TensorFlow或PyTorch直接下载。
  2. 使用

    • 在PyTorch中使用MNIST:
      import torchvision.datasets as datasets
      import torchvision.transforms as transforms
      
      transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
      trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
      trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True)
      testset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
      
      
      testloader = torch.utils.data.DataLoader(testset, batch_size=32, shuffle=False)
      
    • 在TensorFlow中使用MNIST:
      import tensorflow as tf
      
      (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
      
      train_images, test_images = train_images / 255.0, test_images / 255.0
      

测试效果

以下是使用简单神经网络在MNIST上的测试效果:

import tensorflow as tf
from tensorflow.keras import layers, models

# 加载数据集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
train_images, test_images = train_images / 255.0, test_images / 255.0

# 构建模型
model = models.Sequential([
    layers.Flatten(input_shape=(28, 28)),
    layers.Dense(128, activation='relu'),
    layers.Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
model.fit(train_images, train_labels, epochs=5)

# 测试模型
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'Test accuracy: {test_acc}')
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐