上述包含两种类型的内容,一种是图片,另外一种是标签,图片与标签一一对应。但是这里的图片并非是我们平时看到的图片文件,而是一个二进制的文件。该数据集以一个二进制的形式对6万个图片进行了存储。标签则是图片对应的真是数字。
如下图所示,本文将数据集下载到本地,并且解压后的结果。为了便于对比,这里面包含原始的压缩包和解压后的文件。
大家已经发现,压缩包解压后并非一个个的图片,而是每个压缩包对应着一个独立的问题。而在这个文件中存储着上万个图片或者标签的信息。那么这些信息是如何存储在这个文件当中的呢?
其实MNIST的官网给出了详细的描述。以训练集的图片文件为例,官网给出的文件格式描述如下:
从上图可以看出,前4个32位数是该训练集的描述信息。其中第一个是魔数,为固定值0x0803;第二个是图片的数量,0xea60,也就是60000;第三个和第四个是图片的大小,也就是图片是28*28像素。下面则是以一个字节来描述每个像素。由于该文件中以一个字节来描述一个像素,可以知道像素的值可以是从0到255。其中0表示白色,而255表示黑色。
标签文件的格式与图片文件的类似。前面有两个32位数,其中第一个是魔数,固定值0x0801;第二个用于描述标签的数量。接下来的数据是每个标签的值,用一个字节表示。这里表示值的范围是
对应实际训练集的标签文件的数据如下所示。可以看出与上述格式的描述是一致的。另外,我们可以看出,对应该标签集,前面几张图片表示的数字分别应该是5,0,4,1等等。这里大家记一下,后面会用到。
关于数据集的文件格式我们了解了,下面我们实际操作一下。
知道上述数据的存储格式后,我们就可以对数据进行解析了。比如下面本文实现了一个小程序,用于解析该图片集合中的某个图片,并得到可视化结果。当然,其实我们可以根据标签集合的值知道图片是什么,这里只是一个实验。最终结果是以一个文本文件存储的,用字符“Y”表示笔迹,字符“0”表示背景色。具体程序代码很简单,本文不再赘述。
#-*-coding:UTF-8-*-deftrans_to_txt(train_file,txt_file,index):withopen(train_file,'rb')assf:withopen(txt_file,"w")aswf:offset=16+(28*28*index)cur_pos=offsetcount=28*28strlen=1out_count=1whilecur_pos0:wf.write("Y")else:wf.write("0")#由于图片是28列,因此在此进行换行ifout_count%28==0:wf.write("n")cur_pos+=strlenout_count+=1trans_to_txt("../data/train-images.idx3-ubyte","image.txt",0)我们运行上述代码,可以得到一个名为image.txt的文件。可以看到该文件的内容如下。其中红色笔记是后面添加了,主要是为看的清楚一些。从图中内容可以看出,这个其实就是手写的“5”。
前面我们通过原生的Python接口对数据集进行了可视化的解析。Python有很多已经实现好的库函数,因此我们可以通过一个库函数简化上述功能。
采用原生的Python接口实现起来略显复杂。我们知道Python有很多第三方库,因此我们可以借助第三方库来实现对数据集的解析和展示,具体代码如下。
上述结果的呈现只是通过字符来模拟图片。其实我们可以借助第三方库实现更加完美的图片呈现。接下来我们介绍一下如何通过matplotlib库来呈现图片。这个库非常有用,后续还会接触到这个库。
我们实现一个
defshow_image(data,index):fig,ax=plt.subplots(nrows=1,ncols=1,sharex=True,sharey=True,)img=data[0].reshape(28,28)ax.imshow(img,cmap='Greys',interpolation='nearest')ax.set_xticks([])ax.set_yticks([])plt.tight_layout()plt.show()此时可以看到
实现上述功能的时候可能会缺少一些第三方库,比如matplotlib等。此时需要我们手动进行安装,具体方法如下:
#-*-coding:utf-8-*-fromtensorflow.examples.tutorials.mnistimportinput_dataimportpylabdefshow_mnist():#通过TensorFlow库解析数据mnist=input_data.read_data_sets("../data",one_hot=True)im=mnist.train.images[0]im=im.reshape(28,28)#进行绘图pylab.imshow(im,cmap='Greys',interpolation='nearest')pylab.show()if__name__=="__main__":show_mnist()