使用NumPy读取MNIST数据的实现代码示例

  • Post category:Python

以下是关于“使用NumPy读取MNIST数据的实现代码示例”的完整攻略。

MNIST数据集简介

MNIST数据集是一个手写数字识别数据集,包含60000个训练样本和10000个测试样本。每个样本是一个28×28的灰度图像,标签为0-9之间的数字。

NumPy读取MNIST数据集

使用NumPy可以方便地读取MNIST数据集。下面是一个示例代码,演示了如何使用NumPy读取MNIST数据集:

import numpy as np
import gzip

# 读取训练集
with gzip.open('train-images-idx3-ubyte.gz', 'rb') as f:
    train_images = np.frombuffer(f.read(), np.uint8, offset=16).reshape(-1, 28, 28)

with gzip.open('train-labels-idx1-ubyte.gz', 'rb') as f:
    train_labels = np.frombuffer(f.read(), np.uint8, offset=8)

# 读取测试集
with gzip.open('t10k-images-idx3-ubyte.gz', 'rb') as f:
    test_images = np.frombuffer(f.read(), np.uint8, offset=16).reshape(-1, 28, 28)

with gzip.open('t10k-labels-idx1-ubyte.gz', 'rb') as f:
    test_labels = np.frombuffer(f.read(), np.uint8, offset=8)

在上面的示例代码中,我们使用NumPy的frombuffer()函数读取MNIST数据集。其中,train-images-idx3-ubyte.gz和train-labels-idx1-ubyte.gz是训练集数据和标签,t10k-images-idx3-ubyte.gz和t10k-labels-idx1-ubyte.gz是测试集数据和标签。读取数据时,需要指定数据类型为np.uint8,偏移量为16或8,以跳过文件头。最后,使用reshape()函数将数据转换为28×28的矩阵。

示例1:显示MNIST数据集中的图像

下面是一个示例代码,演示了如何显示MNIST数据集中的图像:

import numpy as np
import matplotlib.pyplot as plt
import gzip

# 读取训练集
with gzip.open('train-images-idx3-ubyte.gz', 'rb') as f:
    train_images = np.frombuffer(f.read(), np.uint8, offset=16).reshape(-1, 28, 28)

with gzip.open('train-labels-idx1-ubyte.gz', 'rb') as f:
    train_labels = np.frombuffer(f.read(), np.uint8, offset=8)

# 显示图像
plt.imshow(train_images[0], cmap='gray')
plt.show()

在上面的示例代码中,我们使用NumPy和matplotlib库显示MNIST数据集中的第一张图像。首先,使用frombuffer()函数读取训练集数据和标签。然后,使用imshow()函数显示图像,并使用show()函数显示图像。

示例2:使用MNIST数据集训练神经网络

下面是一个示例代码,演示了如何使用MNIST数据集训练神经网络:

import numpy as np
import gzip

# 读取训练集
with gzip.open('train-images-idx3-ubyte.gz', 'rb') as f:
    train_images = np.frombuffer(f.read(), np.uint8, offset=16).reshape(-1, 28*28)

with gzip.open('train-labels-idx1-ubyte.gz', 'rb') as f:
    train_labels = np.frombuffer(f.read(), np.uint8, offset=8)

# 构建神经网络
input_size = 28*28
hidden_size = 128
output_size = 10

W1 = np.random.randn(input_size, hidden_size)
b1 = np.zeros(hidden_size)
W2 = np.random.randn(hidden_size, output_size)
b2 = np.zeros(output_size)

# 训练神经网络
learning_rate = 0.1
for i in range(1000):
    # 前向传播
    z1 = np.dot(train_images, W1) + b1
    a1 = np.maximum(z1, 0)
    z2 = np.dot(a1, W2) + b2
    exp_scores = np.exp(z2)
    probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)

    # 计算损失函数
    correct_logprobs = -np.log(probs[range(len(train_labels)), train_labels])
    loss = np.sum(correct_logprobs) / len(train_labels)

    # 反向传播
    delta3 = probs
    delta3[range(len(train_labels)), train_labels] -= 1
    delta2 = np.dot(delta3, W2.T)
    delta2[a1 <= 0] = 0

    # 更新参数
    dW2 = np.dot(a1.T, delta3)
    db2 = np.sum(delta3, axis=0)
    dW1 = np.dot(train_images.T, delta2)
    db1 = np.sum(delta2, axis=0)

    W1 -= learning_rate * dW1
    b1 -= learning_rate * db1
    W2 -= learning_rate * dW2
    b2 -= learning_rate * db2

    # 打印损失函数
    if i % 100 == 0:
        print('iteration %d: loss %f' % (i, loss))

在上面的示例代码中,我们使用MNIST数据集训练了一个简单的神经网络。首先,使用frombuffer()函数读取训练集数据和标签,并将数据转换为一维数组。然后,构建了一个包含一个隐藏层的神经网络,并使用反向传播算法更新参数。最后,使用print()函数打印了损失函数。

总结

综上所述,“使用NumPy读取MNIST数据的实现代码示例”的整攻略包括了使用NumPy读取MNIST数据集、显示MNIST数据集中的图像、使用MNIST数据集训练神经网络等内容。实际应用中,可以根据具体需求使用这些操作对MNIST数据集进行处理和分析。