前阵子刚刚学完了Standford University 的Machine Learning 课程,做一个实际的例子练练手。主要不是为了达成智能识别的目标,是为了对整个流程有一个更直观的了解,对错误分析,各项指标的监控输出能充分的理解和正确的运用。
准备工作:
首先确定数据集,MNIST是一个非常棒的手写数字训练集库。官方分为四个文件:
train-images-idx3-ubyte.gz: training set images (9912422 bytes)
train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)
分别是训练集,训练集对应的标签,测试集,测试集对应的标签。
这些文件中的数据,训练集和测试集实际存储的是图片信息,但是被转换成了多个28*28的像素集,每个数字表示一个像素的灰度。关于该库的说明可以直接访问其官网(http://yann.lecun.com/exdb/mnist/),网上随意也是找到很多相关的资料,这里不多解释了。因为我们并不会直接使用这个库,而是会先把它转换成octave能直接读取的matlab存储的格式。
在网上找到了此文(http://daniel-e.github.io/2017-10-20-loading-mnist-handwritten-digits-with-octave-or-matlab/)真是棒啊,直接解决了我的第一个问题。
简要的翻译一下:
MNIST手字数字数据库是一个用来测试机器学习算法的常用数据集。它包含60000个带标签的训练样本和10000个测试样本。请点击这里下载。在Github上,楼主发布了一个已经转换成可以被Octave或者matlab直接读取的mat格式的文件:mnist.mat,大家可以直接下载。或者你也可以用mnist.py去处理源文件然后转换,反正git上都有提供。
从Git上直接下载处理好的Octave可读文件
下载文件:
wget https://github.com/daniel-e/mnist_octave/raw/master/mnist.mat
在Octave中的代码:
d = load('mnist.mat');
现在呢,d这个结构体里就包含了整个训练集和测试集和对应的标签了:
- d.trainX is a (60000,784) matrix which contains the pixel data for training 训练集
- d.trainY is a (1,60000) matrix which contains the labels for the training data 训练集标签
- d.testX is a (10000,784) matrix which contains the pixel data for testing 测试集
- d.testY is a (1,10000) matrix which contains the labels for the test set 测试集标签
来试一下显示一个样本,在Octave中输入如下的代码:
X = d.trainX;
i = reshape(X(3,:), 28, 28)';
image(i);
==========================译==文==结==束====================================================
到这里,数据的准备就完成了。后面就是要考虑一下用哪种机器学习算法来实现,然后设计什么样的过程来分析学习算法,改进学习算法。