# -*- coding: UTF-8 -*-def trans_to_txt(train_file, txt_file, index):with open(train_file, 'rb') as sf:with open(txt_file, "w") as wf:offset = 16 + (28*28*index)cur_pos = offsetcount = 28*28strlen = 1out_count = 1while cur_pos < offset+count:sf.seek(cur_pos)data = https://www.isolves.com/it/ai/2020-08-20/sf.read(strlen)res = int(data[0])#虽然在数据集中像素是1-255表示颜色,这里简化为Yif res > 0 :wf.write(" Y ")else:wf.write(" 0 ")#由于图片是28列,因此在此进行换行if out_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有很多第三方库,因此我们可以借助第三方库来实现对数据集的解析和展示,具体代码如下 。
# -*- coding: utf-8 -*-import osimport structimport numpy as np# 读取数据集,以二维数组的方式返回图片信息和标签信息def load_mnist(path, kind='train'):# 从指定目录加载数据集labels_path = os.path.join(path,'%s-labels.idx1-ubyte'% kind)images_path = os.path.join(path,'%s-images.idx3-ubyte'% kind)with open(labels_path, 'rb') as lbpath:magic, n = struct.unpack('>II',lbpath.read(8))labels = np.fromfile(lbpath,dtype=np.uint8)with open(images_path, 'rb') as imgpath:#解析图片信息,存储在images中magic, num, rows, cols = struct.unpack('>IIII',imgpath.read(16))images = np.fromfile(imgpath,dtype=np.uint8).reshape(len(labels), 784)return images, labels# 在终端打印某个图片的数据信息def print_image(data, index):idx = 0;count = 0;for item in data[index]:if count % 28 == 0:print("")if item > 0:print("33[7;31mY 33[0m", end="")else:print("0 ", end="")count += 1def main():cur_path = os.getcwd()cur_path = os.path.join(cur_path, "..data")imgs, labels = load_mnist(cur_path)print_image(imgs, 0)if __name__ == "__main__":main()上述代码中分为两步,第一步是将数据集解析到数组中,第二步是对数组中的某个图片进行显示 。这里显示也是通过文本的方式程序,只不过不是存储在文件中,而是打印在终端 。比如我们依然打印第一个图片,其效果如下:
文章插图
上述结果的呈现只是通过字符来模拟图片 。其实我们可以借助第三方库实现更加完美的图片呈现 。接下来我们介绍一下如何通过matplotlib库来呈现图片 。这个库非常有用,后续还会接触到这个库 。
我们实现一个
def show_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等 。此时需要我们手动进行安装,具体方法如下:
pip install matplotlib -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com基于TensorFlow的数据解析MNIST是如此出名,以至于TensorFlow已经对其进行了支持 。因此,我们可以通过TensorFlow对其进行加载和解析 。下面我们给出用TensorFlow实现的代码 。# -*- coding: utf-8 -*-from tensorflow.examples.tutorials.mnist import input_dataimport pylabdef show_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()该代码实现的最终效果与上一个实例一致,这里不再赘述 。经过上一篇文章(《人工智能学习入门之TensorFlow2.2版本安装》)和本篇文章,我们准备好了学习人工智能必备的材料,一个是开发环境,另外一个是素材 。接下来我们就开始人工智能的真正学习了!
本文大部分实例在windows 10运行得到 。其中红色背景的图片是在Ubuntu18.04环境运行得到 。如果代码运行存在问题,请确认软件版本的一致性 。
推荐阅读
- 认知图谱——人工智能的下一个瑰宝
- 如何为机器学习工程设计Python接口
- 喝茶切勿过度联想,喝茶能治痛风吗
- 想速治男科疾病 首选冬季时节
- 少儿编程有没有必要学?
- Java进阶知识,轻松理解Java泛型
- 完全基于 Java 的开源深度学习平台,亚马逊的大佬带你上手
- 想要在互联网公司保命,这些黑话你得知道呀
- 贾母和宝玉是什么关系 贾母想让宝玉娶谁
- 怎样自学陈氏太极拳
