虽然很多时候一些模块内置的数据集使用起来非常的方便,搭建模型,做实例项目非常快,但是这种形式的数据建模本质上并不通用,我们使用模型大多是要解决现实生活中的很多实际问题,在不同的应用场景和业务问题中都会遇上各式各样的数据集,没有办法像那些使用起来很方便的内置数据集一样直接导入使用,这时候我们就要把问题的处理过程抽象成一个标准的数据流程,抽象出来标准流程的好处就是,之后任何问题我们都可以将其朝着标准流程的形式进行转化,从而讲一个复杂的问题标准化,就像很多时候搭建模型一样,明确需要定义的部分就是输入层的shape,跟这里标准数据流程是一个性质的。
背景闲话就说这些,接下来回到正题,本文主要的内容是将经典的手写数字识别数据集转化为标准的图像进行存储,之后建模的数据加载会选择从本地加载图像数据的形式进行实施,这里主要是为了数据流程的标准化,本质上你不需要转化也可以直接使用mnist数据集,远比加载图像要快得多。
整体实现如下所示:
#!usr/bin/env python
# encoding:utf-8
from __future__ import division
"""
__Author__:沂水寒城
功能: Scikit-learn Mnist 数据集处理
"""
import os
import numpy as np
from PIL import Image
from sklearn.datasets import fetch_openml
from sklearn.datasets.base import get_data_home
print("=============================================================")
print(get_data_home())
print("=============================================================")
def parseMnist2Img(saveDir="sklearn-mnist/"):
"""
转化为图片存储
"""
mnist = fetch_openml("mnist_784", data_home="./")
data = mnist["data"].astype(np.float32)
label = mnist["target"].astype(np.int32)
print("data_shape: ", data.shape)
print("label_shape: ", label.shape)
length = label.shape[0]
for i in range(length):
onePic = data[i]
onePic = onePic.reshape(28, 28)
onePic = Image.fromarray(np.uint8(onePic))
one_label = label[i]
oneDir = saveDir + str(one_label) + "/"
if not os.path.exists(oneDir):
os.makedirs(oneDir)
one_path = oneDir + str(len(os.listdir(oneDir))) + ".png"
onePic.save(one_path)
print("Array Data Tranfrom Finished..................")
if __name__ == "__main__":
print(
"=========================================Loading sklearnHandle==========================================="
)
parseMnist2Img(saveDir="sklearn-mnist/")
这里有一点需要注意就是,之前我写过一篇手写数字识别的博文感兴趣可以看下。
《Python 手写数字识别实战分享》
在实战博文中,我同样实现了将sklearn内置的mnist数据集转化为图像进行存储,具体实现如下所示:
def data2Image(saveDir='data/'):
'''
将数值型数据转化为图像数据进行存储
1. PIL image转换成array img = np.asarray(image)
2. array转换成image Image.fromarray(np.uint8(img))
'''
mnist=fetch_mldata('MNIST original',data_home='./')
data=mnist['data'].astype(np.float32)
label=mnist['target'].astype(np.int32)
print('data_shape: ', data.shape)
print('label_shape: ', label.shape)
length=label.shape[0]
for i in range(length):
onePic=data[i]
onePic=onePic.reshape(28,28)
onePic=Image.fromarray(np.uint8(onePic))
one_label=label[i]
oneDir=saveDir+str(one_label)+'/'
if not os.path.exists(oneDir):
os.makedirs(oneDir)
one_path=oneDir+str(len(os.listdir(oneDir)))+'.png'
onePic.save(one_path)
print('Array Data Tranfrom Finished..................')
当时使用的sklearn版本是0.19的版本, 现在已经是0.24版本,所以一些方法就使用不了了:
1、首选是【fetch_mldata】方法,新版本已经丢弃了,换成了fetch_openml
2、其次是数据集的名称之前是【MNIST original】,现在是【mnist_784】
上面两点需要多加注意,我下午在这里卡住了。
执行完成后,自动创建目录,结果如下:
在我之前的文章里面,也有将黑底白字转化为白底盒子的实现,感兴趣的话可以看看,原理就是背景和内容互换。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)