使用python将自己的图片数据集准换成为cnn的数据集

在使用theano的cnn时,今天介绍一下关于如何将自己的数据集转换成像cnn的默认数据集mnist的形式

在此本人遇到了一些坑,在此进行总结一下,

声明在此使用的彩色图转灰度图进行的单通道的图像存储,对于多通道的图像随后进行总结

主要流程是将图像数据读出

将图像转换成numpy的数组形式

将图像进行行的处理编程行向量的存储

之后是将数据与标签进行合并存储

存储在一个list中

将这个数据集进行数据的打乱顺序,(随机化的过程)

主要的过程就是这些了

下面是代码的 

===========================

# -*-coding:utf-8-*-
import numpy
import theano
from PIL import Image
from pylab import *
import os
import theano.tensor as T
import random
import pickle


def dataresize(path=r'D:\worksapce_python\20160426_cp\testing'):
    # test path
    path_t =r"D:\worksapce_python\20160426_cp\training"
    # train path
    datas = []
    train_x= []
    train_y= []
    valid_x= []
    valid_y= []
    test_x= []
    test_y= []
    for dirs in os.listdir(path):
        # print dirs
        for filename in os.listdir(os.path.join(path,dirs)):
            imgpath =os.path.join(os.path.join(path,dirs),filename)
            img = Image.open(imgpath)
            img =img.convert('L').resize((28,28))
            width,hight=img.size
            img = numpy.asarray(img,dtype='float64')/256.

            tmp = img.reshape(1, hight*width)[0]
            tmp =hstack((dirs,tmp))  # 在此将标签加在数据的前面。

            datas.append(tmp)
       # datas.append(img.reshape(1, hight*width)[0])
        #在此处取出第一行的数据否则在后面的转换的过程中会出现叠加的情况,在成在转换成矩阵时宝类型转换的错误
    #将数据打乱顺序
    random.shuffle(datas)
    # 将数据和标签进行分离
    label=[]
    for num in range(len(datas)):
        label.append((datas[num])[0])
        datas[num] =(datas[num])[1:]
        #将数据的标签项去掉
    tests = []
        # #读取测试集
    for dirs in os.listdir(path_t):
        for filename in os.listdir(os.path.join(path_t,dirs)):
            imgpath =os.path.join(os.path.join(path_t,dirs),filename)
            img = Image.open(imgpath)
            img =img.convert('L').resize((28,28))
            width,hight=img.size
            img = numpy.asarray(img,dtype='float64')/256.
            tmp = img.reshape(1, hight*width)[0]
            # 在此如果不是取出[0]的话在后面会发现其实其是一个多维的数据的叠加,
            # 在后面使用theano中的cnn在调用时会出现数据的异常(转换的异常),
            # 在此是跟原始的mnist的数据集的形式做了比较修改才发现的。。。
            tmp =hstack((dirs,tmp))
            tests.append(tmp)
    #将数据打乱顺序
    random.shuffle(tests)
    #  将数据和标签进行分离
    label_t=[]
    for num in range(len(tests)):
        label_t.append((tests[num])[0])
        tests[num] =(tests[num])[1:]
        #将数据的标签项去掉
        '''    将数据进行打乱,拆分成train test valid    '''
    for num in range(len(label)):
        train_x.append(datas[num])
        train_y.append(label[num])
    for num in range(len(tests)):
        if num%2==0:
            valid_x.append(tests[num])
            valid_y.append(label_t[num])
        if num%2==1:
            test_x.append(tests[num])
            test_y.append(label_t[num])
    train_x=numpy.asarray(train_x,dtype='float64')
    train_y=numpy.asarray(train_y,dtype='int64')
    valid_x=numpy.asarray(valid_x,dtype='float64')
    valid_y=numpy.asarray(valid_y,dtype='int64')
    test_x=numpy.asarray(test_x,dtype='float64')
    test_y=numpy.asarray(test_y,dtype='int64')
    def shared_dataset(data_xy, borrow=True):
        data_x, data_y = data_xy
        shared_x = theano.shared(numpy.asarray(data_x,
                                               dtype=theano.config.floatX), borrow=borrow)
        shared_y = theano.shared(numpy.asarray(data_y,
                                               type=theano.config.floatX), borrow=borrow)
        return shared_x, T.cast(shared_y, 'int32')
    test_set_x, test_set_y = shared_dataset((test_x,test_y))
    valid_set_x, valid_set_y = shared_dataset((valid_x,valid_y))
    train_set_x, train_set_y = shared_dataset((train_x,train_y))
    rval = [(train_set_x, train_set_y), (valid_set_x, valid_set_y),
         (test_set_x, test_set_y)]
    save_datas_pkl(rval)
        #  return rval
def save_datas_pkl(file1s,path=r'./data/datasets.pkl'):
    datas=file1s
    output =open(path,'wb')
    pickle.dump(datas,output)
    output.close()
def load_datas(path=r'./data/datasets.pkl'):
    pkl_file =open(path,'rb')
    datas =pickle.load(pkl_file)
    pkl_file.close()
    return datas

if __name__=='__main__':
    dataresize()

===========================

以上就是我的代码

其中的路径大家可以根据自己的路径进行修改,还有就是图像的大小可以自行的修改没必要是28*28的

我的目录形式是多级的,所以使用的双重循环

使用python将自己的图片数据集准换成为cnn的数据集_第1张图片

所以根据自己的情况修改。


你可能感兴趣的:(实验)