不知道MNIST数据集是什么?看这里:http://www.tensorfly.cn/tfdoc/tutorials/mnist_beginners.html
根据上一篇的介绍,我们用于训练的数据应该是一个一个的mini-batch,因此,对于我们即将处理的数据,最重要的就是从训练集中分出一个一个的mini-batch,看起来好像不难,但是我们要保证每次导入mini-batch中的数据都是随机的,而且所有数据在一个epoch(训练数据全部使用一次就是完成了一个epoch)只能出现一次,mini-batch中的image还要必须和label对应,而且整个过程要保证快速,对于庞大、复杂、类型多样的训练数据,这可不是已经容易的事情。所以现有的用于深度学习入门的MNIST手写字符识别这个例子中,数据导入这一块直接被忽略了,MNIST直接提供了划分mini-batch的函数给用户调用,本文不使用MNIST数据集中封装的函数进行数据导入,因为我们学习深度学习是为了处理自己的数据集构建自己的网络,那时候可没有封装好的函数可以用!但我们也不好获取那么多规范的数据,我们也选用MNIST数据集,将数据下载到本地,然后自己实现高效的划分mini-batch。
复制下面的代码,到Spyder中粘贴:
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import gzip
import os
import tempfile
import numpy
from six.moves import urllib
from six.moves import xrange # pylint: disable=redefined-builtin
import tensorflow as tf
from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets
确保准备好的input_data.py文件在当前工作目录下,新建一个文件夹用于保存下载的数据我是在桌面新建了一个名为data的文件夹,在Spyder中新建文件,运行下面的代码:
import input_data
mnist = input_data.read_data_sets("C:\\Users\\HP\\Desktop\\data\\", one_hot=True)
#这里的路径是新建文件夹的路径,用于保存下载好的数据
运行结束后,在文件夹中出现下面几个文件:
文件中的内容如下:
文件 | 内容 |
---|---|
train-images-idx3-ubyte.gz | 训练集图片 - 55000 张 训练图片, 5000 张 验证图片 |
train-labels-idx1-ubyte.gz | 训练集图片对应的数字标签 |
t10k-images-idx3-ubyte.gz | 测试集图片 - 10000 张 图片 |
t10k-labels-idx1-ubyte.gz | 测试集图片对应的数字标签 |
解压得到:
什么根本打不开呀。因为数据是被按一定规则定义成二进制文件了,感兴趣的可以看这篇博文:
https://blog.csdn.net/qq_32166627/article/details/62218072
下面的代码将获取train-images-idx3-ubyte.gz解压出来的文件train-images.idx3-ubyte中的60000幅图片,只需确保file 和path符合要求就能运行
import numpy as np
import struct
from PIL import Image
def loadImageSet(filename):
binfile = open(filename, 'rb') # 读取二进制文件
buffers = binfile.read()
head = struct.unpack_from('>IIII', buffers, 0) # 取前4个整数,返回一个元组
offset = struct.calcsize('>IIII') # 定位到data开始的位置
imgNum = head[1]
width = head[2]
height = head[3]
bits = imgNum * width * height # data一共有10000*28*28个像素值
bitsString = '>' + str(bits) + 'B' # fmt格式:'>47040000B'
imgs = struct.unpack_from(bitsString, buffers, offset) # 取data数据,返回一个元组
binfile.close()
imgs = np.reshape(imgs, [imgNum, width * height]) # reshape为[10000,784]型数组
return imgs,head
if __name__ == "__main__":
# t10k-images.idx3-ubyte文件的路径
file= 'C:\\Users\\HP\\Desktop\\data\\data\\train-images.idx3-ubyte'
# 保存解析后的文件的路径,DataSet文件夹应该提前创建好
path = 'C:\\Users\\HP\\Desktop\\data\\train_labels\\'
imgs,_ = loadImageSet(file)
for i in range(60000):
img = np.reshape(imgs[i,:],[28,28]) #取出其中一张图片的像素,转型为28*28
img = Image.fromarray(img.astype('uint8')).convert('L')
img.save(path+'%d.bmp'%(i))
运行结束后,在train_labels文件夹下有60000幅28x28的小图片
这样我们就把MNIST数据集下载到本地了。
如下图所示,为了构建神经网络,我们需要生成转置后的图像,作为下图中的images,原图像就为labels
这里用到的代码几乎与1.3图片解码中用到的代码相同,只是在解析出图片数组后,将其转置,然后再保存到train_images文件夹下。代码如下:
import numpy as np
import struct
from PIL import Image
def loadImageSet(filename):
binfile = open(filename, 'rb') # 读取二进制文件
buffers = binfile.read()
head = struct.unpack_from('>IIII', buffers, 0) # 取前4个整数,返回一个元组
offset = struct.calcsize('>IIII') # 定位到data开始的位置
imgNum = head[1]
width = head[2]
height = head[3]
bits = imgNum * width * height # data一共有10000*28*28个像素值
bitsString = '>' + str(bits) + 'B' # fmt格式:'>47040000B'
imgs = struct.unpack_from(bitsString, buffers, offset) # 取data数据,返回一个元组
binfile.close()
imgs = np.reshape(imgs, [imgNum, width * height]) # reshape为[10000,784]型数组
return imgs,head
if __name__ == "__main__":
# t10k-images.idx3-ubyte文件的路径
file1= 'C:\\Users\\HP\\Desktop\\data\\data\\train-images.idx3-ubyte'
# 保存解析后的文件的路径,DataSet文件夹应该提前创建好
path = 'C:\\Users\\HP\\Desktop\\data\\train_images\\'
imgs,_ = loadImageSet(file1)
for i in range(60000):
img = np.reshape(imgs[i,:],[28,28]) #取出其中一张图片的像素,转型为28*28
img = np.transpose(img)
img = Image.fromarray(img.astype('uint8')).convert('L')
img.save(path+'%d.bmp'%(i)) # 保存图片到path,并命名为0-59999.bmp
print(i)
运行结束后,在train_images文件夹下有60000个28x28的小图像:
最后我们分一批数据用于测试,直接在train_images 和 train_labels文件夹中剪切后5000个样本(文件名为0.bmp~4999.bmp)分别存放于test_images和test_labels中,得到:
至此我们得到了一个名文data的文件夹,下面有四个子文件夹
文件夹名 | 内容 |
---|---|
train_images | 训练集图片 转置后的图片 - 55000 张 |
train_labels | 训练集图片 未转置的图片 - 55000 张 |
test_images | 测试集图片 转置后的图片 - 5000 张 |
test_labels | 测试集的理想输出图片 未转置的图片 - 5000 张 |
按照上面介绍的处理过程应该没有什么困难,如果实在有困难,可以点下面的百度网盘链接下载,我把train_images,train_labels,test_images,test_labels4个文件夹打包上传了。(CSDN下载至少得挂1个积分,不能免费下载)
百度云链接: https://pan.baidu.com/s/1UXtSEQJNlLmeNaBic4Tqkw 密码: mft4
至此,我们就准备好了用于训练和测试的所有数据,下一篇将介绍如何将这些数据高效的输入网络神经网络。