这次的故事从从一颗蓝色药丸说起……
图片原作者:W. Carter
每一次学习一种新的编程语言,譬如从C到Python,都是从实现“Hello World!”开始,用一个陌生的新工具和这个世界说你好。小小的HW代码,让我们初步理解这个工具的原理。
入门TensorFlow一样如此,正如官方的蓝色药丸,MNIST是零基础入门TensorFlow的新人居家旅行必备良药。今天服下这颗药丸,希望深度学习之路不会要完……
=====================说正事的严肃脸分割线(〃'▽'〃)======================
首先说说MNIST,MNIST是一个入门级的计算机手写数字库。包含手写数字的训练集、验证集图片,以及标注好的标签。 图片差不多长这样:,就是一个个手写的数字。而标签,就是已经识别好的结果,可以理解为标准答案,这里的话就是5、0、4、1。
作为一个还没有入门的新人,这里理解为深度学习就好比计算机是一个什么也不知道的孩子,用已经带标准答案的结果告诉它(emm……我的电脑是她⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄),这是什么,让她记住了,然后用没有标准答案的图片来让她识别(预测)。(这里若是有错,以后懂了再回来改,脸先放这里,被打了也是进步。。。)而有答案的图片就是训练集,反之就是数据集。这个数据库中训练集(mnist.train)60,000行,测试数据集(mnist.test)10,000行。
初步了解了MNIST数据集(大误!),让我们跑起代码,做进一步的理解。
根据官方手册的代码,运用这两句可以自动下载MNIST数据集:
import tensorflow.examples.tutorials.mnist.input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
但是自己测试后,发现这个代码无法使用,而使用了如下代码:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
即可自动下载数据集。运行起来是这样:
下载好的数据集默认放在.../MNIST_data文件夹下,共四个文件:
,
这里记录一下一个我这个超级小白的疑惑,开始看见这四个压缩文件,不知如何使用,解压开后是后缀为.ubyte的文件,经过百度,这是一种特殊的文件格式,而MNIST官网也对这个格式做了介绍。需要进行解析才能变成我们日常理解的一个个图片。具体解析方法及文件格式的解读可以看海上扬凡的博客所写。不过这里我附上改写的Python3的代码,可以复制直接使用,记得将数据集放在同一个文件夹。
# -*- coding: utf-8 -*-
from PIL import Image
import struct
def read_image(filename):
f = open(filename, 'rb')
index = 0
buf = f.read()
f.close()
magic, images, rows, columns = struct.unpack_from('>IIII' , buf , index)
index += struct.calcsize('>IIII')
for i in range(images):
#for i in range(2000):
image = Image.new('L', (columns, rows))
for x in range(rows):
for y in range(columns):
image.putpixel((y, x), int(struct.unpack_from('>B', buf, index)[0]))
index += struct.calcsize('>B')
print ('save ' + str(i) + 'image')
image.save('test/' + str(i) + '.png')
def read_label(filename, saveFilename):
f = open(filename, 'rb')
index = 0
buf = f.read()
f.close()
magic, labels = struct.unpack_from('>II' , buf , index)
index += struct.calcsize('>II')
labelArr = [0] * labels
#labelArr = [0] * 2000
for x in range(labels):
#for x in range(2000):
labelArr[x] = int(struct.unpack_from('>B', buf, index)[0])
index += struct.calcsize('>B')
save = open(saveFilename, 'w')
save.write(','.join(map(lambda x: str(x), labelArr)))
save.write('\n')
save.close()
print ('save labels success')
if __name__ == '__main__':
read_image('t10k-images.idx3-ubyte')
read_label('t10k-labels.idx1-ubyte', 'test/label.txt')
大家在跑的时候可能会提示[Error2] 没有找到test/0.png这样的报错,原文并没有出现这样的错误,于是我新建了一个test文件夹,问题迎刃而解,这里记录一下。
输出的图片结果为:
当然,在跑官方文档中的示例程序是不需要进行这样的处理的。