《一个图像复原实例入门深度学习&TensorFlow—第四篇》获取数据

版权声明:转载注明出处,谢谢~ https://blog.csdn.net/qq_43024357/article/details/81945578

获取用于训练和测试的数据

1、 下载MNIST数据集到本地

不知道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。

1.1 获取input_data.py文件

复制下面的代码,到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

按F5运行重命名为input_data.py
这里写图片描述

1.2 下载图片压缩文件

确保准备好的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

1.3 图片解码

下面的代码将获取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数据集下载到本地了。

2. 生成图片转置后的数据

如下图所示,为了构建神经网络,我们需要生成转置后的图像,作为下图中的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 张

3. 懒人直接到这里来下载

按照上面介绍的处理过程应该没有什么困难,如果实在有困难,可以点下面的百度网盘链接下载,我把train_images,train_labels,test_images,test_labels4个文件夹打包上传了。(CSDN下载至少得挂1个积分,不能免费下载)
百度云链接: https://pan.baidu.com/s/1UXtSEQJNlLmeNaBic4Tqkw 密码: mft4

至此,我们就准备好了用于训练和测试的所有数据,下一篇将介绍如何将这些数据高效的输入网络神经网络。

猜你喜欢

转载自blog.csdn.net/qq_43024357/article/details/81945578