MNIST 数据集(mnist

it2023-08-20  70

MNIST 数据集(mnist_all.mat)

这个学期的模式识别课程,我打算使用这个数据集做一些基础性实验,如近邻准则分类、贝叶斯分类器等。使用这个简单的数据集结合 Octave 实现一些简单的东西,帮助理解模式识别的一些基础理论

在开始实验之前,先简单了解一下这个数据集的基本信息。

MNIST 数据集 mnist_all.mat

这个数据集的获取方法很简单,直接在 Google 搜索mnist_all.mat 会有很多的 GitHub 仓库,直接下载就好。

实验环境

这里我使用开源轻量的 Octave。Octave 对于学习来说,功能是足够使用的。

启动终端:

octave

加载数据集

使用 load 加载数据集

octave:1> load mnist_all.mat

查看数据集基本信息

whos

whos 查看数据集整体情况,784=28x28 (pixel)。0~9 个手写数字。

test0~test9 表示测试集,train0~train9 则是训练集。

我拿一个进行举例。test0:测试集 0,里面包含 980 张手写数字 0 的图片,即 980 个测试样本,每个样本图片大小是 28 × 28 28\times28 28×28

octave:2> whos Variables in the current scope: Attr Name Size Bytes Class ==== ==== ==== ===== ===== test0 980x784 768320 uint8 test1 1135x784 889840 uint8 test2 1032x784 809088 uint8 test3 1010x784 791840 uint8 test4 982x784 769888 uint8 test5 892x784 699328 uint8 test6 958x784 751072 uint8 test7 1028x784 805952 uint8 test8 974x784 763616 uint8 test9 1009x784 791056 uint8 train0 5923x784 4643632 uint8 train1 6742x784 5285728 uint8 train2 5958x784 4671072 uint8 train3 6131x784 4806704 uint8 train4 5842x784 4580128 uint8 train5 5421x784 4250064 uint8 train6 5918x784 4639712 uint8 train7 6265x784 4911760 uint8 train8 5851x784 4587184 uint8 train9 5949x784 4664016 uint8 Total is 54880000 elements using 54880000 bytes

查看一个样本

Matlib 中对于矩阵的操作索引是从 1 开始的。所以取一个数据集中的第一个样本,要注意,如果从 0 开始是会报错的。

octave:3> data0 = test0(0, :); error: test0(0,_): subscripts must be either integers 1 to (2^63)-1 or logicals

下面取测试集:test0 中的第一个样本:

octave:4> data0 = test0(1, :);

查看第一个样本。这是测试集 test0 中的第一个样本,手写数字 0 被表示成了一个 784 维的向量。

octave:5> whos data0 Variables in the current scope: Attr Name Size Bytes Class ==== ==== ==== ===== ===== data0 1x784 784 uint8 Total is 784 elements using 784 bytes

如果将这个向量打印出来,对于输出的数据,只能知道这是一张灰度图像,肉眼很难看出这些数据代表着哪些数字。

人类是非常擅长看图像的,最好的方式是将这个向量以图像的方式输出出来。

在输出之前,先将 784 维的向量表示为 28 × 28 28\times28 28×28 的矩阵,使用 reshape() 函数,如下是一个示例,reshape 函数的参数有很多种形式。

octave:26> one = reshape(data0, 28, 28); octave:27> whos one Variables in the current scope: Attr Name Size Bytes Class ==== ==== ==== ===== ===== one 28x28 784 uint8 Total is 784 elements using 784 bytes

有了 28 × 28 28\times28 28×28 的矩阵之后,就可以以图像的方式输出了。

octave:28> imshow(one)

查看每一个训练数据集的一个样本

对于每一个训练集(train0~train9),取出其第一个样本。这里把 10 张图片显示在一张 Figure 上。

A 中已经存在 10 个样本。

octave:41> whos A Variables in the current scope: Attr Name Size Bytes Class ==== ==== ==== ===== ===== A 10x784 7840 uint8 Total is 7840 elements using 7840 bytes

现在将这个 10 个图片输出:

octave:42> for i = 1:10 > subplot(2, 5, i); imshow(reshape(A(i, :), 28, 28)); > end

至此,这个数据集的基本信息已经知道了,接下来就可以利用这个数据集进行应用了。例如:

近邻法分类:计算待测样本与训练集标准模板的距离(马氏距离),取最近距离的进行分类。贝叶斯分类器…

PS:欢迎关注我的公众号「蓝本本」,和我一起学习、进修和放纵好奇心。

最新回复(0)