纸上得来终觉浅,绝知此事要躬行。“神经网络”是“机器学习”的利器之一,常用算法在TensorFlow、MXNet计算框架上,有很好的支持。为了更好的理解与使用这件利器,我们可以不借助计算框架,从零开始,一步步构建模型,实现学习算法,并在一个图像识别数据集上,训练这个模型,再验证模型预测的准确率。MNIST数据集能正确的提出问题,你已经解决了问题的一半。这里“正确的问题”是MNIST,一个手写数字图片集数据的识别问题。你可以在Yann LeCun的官网下载这套数据集,共四个文件包:train-images-idx3-ubyte.gz:训练图片集 (9912422 bytes)train-labels-idx1-ubyte.gz:训练图片集的正确标签 (28881 bytes)t10k-images-idx3-ubyte.gz:测试图片 (1648877 bytes)t10k-labels-idx1-ubyte.gz:测试图片的正确标签 (4542 bytes)每张图片包含一个手写数字。
数据集包含6万张图片用于训练的,1万张用于测试验证。
图像数据格式和图向量
每张图片表达了[0,9]这10个数字中的一个,有28X28=784个像素,每个像素根据灰度取整数值[0,255];把每张图片看作具有784个特征的图向量,问题就变成:根据D个特征维度,对图像做K分类的问题,这里D=784,K=10。
MNIST文件格式图片images文件,前16个字节,是文件格式和图片数量、规格的描述;图片的像素信息从第17个字节开始。[offset][type][value][description]0000 32 bit integer 0x00000803(2051) magic number0004 32 bit integer 60000 number of images0008 32 bit integer 28 number of rows0012 32 bit integer 28 number of columns0016 unsigned byte 0 pixel0017 unsigned byte 0 pixel........xxxx unsigned byte ?? pixel同样,标签labels文件里,前8个字节,是文件格式和标签数量的描述;而表述正确分类的标签信息,从第9个字节开始。[offset][type][value][description]0000 32 bit integer 0x00000801(2049) magic number0004 32 bit integer 60000 number of items0008 unsigned byte 7 label0009 unsigned byte 2 label........xxxx unsigned byte ?? label理解了文件格式,就可以很容易读取MNIST数据。读取MNIST数据用到struct、os和numpy三个库。
importstruct
importos
importnumpyasnp定义你下载和解压缩MNIST数据的目录。加载从第17个字节开始的图片像素数据到,再把构成每张图片的28*28二维矩阵,拉直(reshape)为784*1的图向量。
withopen(images_path,'rb')asimagefile:
magic,num,rows,cols=struct.unpack('>IIII',imagefile.read(16))
images=np.fromfile(imagefile,dtype=np.uint8).reshape(len(labels),784)从第9个字节开始,加载正确标签信息到。
withopen(labels_path,'rb')aslabelfile:
magic,n=struct.unpack('>II',labelfile.read(8))
labels=np.fromfile(labelfile,dtype=np.uint8)我们就得到了训练数据集的图像数据images和正确答案labels,可以用同样的方法加载验证用的图片images_v和正确答案labels_v。下一次,我们从0开始,建立一个神经网络的原型-感知机模型,来对准备好的MNIST数据做训练和分类预测。(完)
领取专属 10元无门槛券
私享最新 技术干货