MNIST数据集是一个广泛使用的手写数字识别数据集,包含了60000个训练样本和10000个测试样本,每个样本是一个28x28像素的灰度图像,代表一个手写数字(0到9)。以下是如何导入和使用MNIST数据集的基本步骤:
import tensorflow as tf
from tensorflow.keras.datasets import mnist
# 加载数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 查看数据集的基本信息
print("训练样本数量:", len(x_train))
print("测试样本数量:", len(x_test))
import torch
from torchvision import datasets, transforms
# 定义数据预处理
transform = transforms.Compose([transforms.ToTensor()])
# 加载数据集
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
# 创建数据加载器
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)
为了提高模型的训练效果,通常需要对图像数据进行归一化处理。
# TensorFlow/Keras
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
# PyTorch
# transform中已经包含了ToTensor(),它会自动将像素值归一化到[0, 1]
确保数据维度符合模型的输入要求。
# TensorFlow/Keras
x_train = x_train.reshape((x_train.shape[0], 28, 28, 1))
x_test = x_test.reshape((x_test.shape[0], 28, 28, 1))
# PyTorch
# transform中已经包含了ToTensor(),它会自动调整维度
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPooling2D
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
MaxPooling2D((2, 2)),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D((2, 2)),
Conv2D(64, (3, 3), activation='relu'),
Flatten(),
Dense(64, activation='relu'),
Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3)
self.fc1 = nn.Linear(64 * 5 * 5, 64)
self.fc2 = nn.Linear(64, 10)
def forward(self, x):
x = F.relu(self.conv1(x))
x = F.max_pool2d(x, 2)
x = F.relu(self.conv2(x))
x = F.max_pool2d(x, 2)
x = x.view(-1, 64 * 5 * 5)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return F.log_softmax(x, dim=1)
model = Net()
model.fit(x_train, y_train, epochs=5, batch_size=64, validation_split=0.1)
import torch.optim as optim
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
for epoch in range(5):
for data, target in train_loader:
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f'Test accuracy: {test_acc}')
model.eval()
correct = 0
total = 0
with torch.no_grad():
for data, target in test_loader:
outputs = model(data)
_, predicted = torch.max(outputs.data, 1)
total += target.size(0)
correct += (predicted == target).sum().item()
print(f'Test accuracy: {100 * correct / total}%')
MNIST数据集常用于以下几个方面:
通过以上步骤,你可以成功导入和使用MNIST数据集进行手写数字识别任务。
领取专属 10元无门槛券
手把手带您无忧上云