在开始深度学习和计算机视觉的旅程中,选择合适的数据集至关重要。本文将详细介绍三个常用的数据集: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个细分类。
下载与使用
-
下载:
- 你可以从CIFAR数据集的官方网站下载:CIFAR-10 和 CIFAR-100 数据集。
- 也可以通过Python中的
torchvision
或tensorflow_datasets
等库下载。
-
使用:
- 在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
- 在PyTorch中使用CIFAR-10:
示例图像
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的类别非常丰富,涵盖了广泛的现实世界中的物体,如动物、植物、工具、日常用品等。
下载与使用
-
下载:
- 你可以从ImageNet官方网站申请下载:ImageNet 数据集,但需要注册账号并申请下载权限。
- 下载过程较为复杂,因为数据集非常大。
-
使用:
- 在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)
- 在PyTorch中使用预训练的ResNet模型:
示例图像
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。
下载与使用
-
下载:
- MNIST数据集可以从多种资源下载,比如通过TensorFlow或PyTorch直接下载。
-
使用:
- 在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
- 在PyTorch中使用MNIST:
测试效果
以下是使用简单神经网络在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}')