在使用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的
我的目录形式是多级的,所以使用的双重循环
所以根据自己的情况修改。