import numpy import numpy.random import pylab from dispims_color import dispims_color import cnn_coatespipeline import graddescent_inout import logreg numpy_rng = numpy.random.RandomState(1) theano_rng = numpy.random.RandomState(1) filtersize = 10 numfeatures = 100 datadir = ... def pca(data, dimstokeep): """ principal components analysis of data (columnwise in array data), retaining as many components as required to retain var_fraction of the variance """ from numpy.linalg import eigh u, v = eigh(numpy.cov(data, rowvar=0, bias=1)) v = v[:, numpy.argsort(u)[::-1]] backward_mapping = v[:,:dimstokeep].T forward_mapping = v[:,:dimstokeep] return backward_mapping.astype("float32"), forward_mapping.astype("float32"), numpy.dot(v[:,:dimstokeep].astype("float32"), backward_mapping), numpy.dot(forward_mapping, v[:,:dimstokeep].T.astype("float32")) #load data trainimages = numpy.concatenate([(numpy.load(datadir+'/data_batch_'+b)['data']) for b in ["1", "2", "3", "4", "5"]], 0).reshape(-1,3,32,32).transpose(0,2,3,1).reshape(-1,32*32*3).astype("float32") trainlabels = numpy.concatenate([numpy.array(numpy.load(datadir+'/data_batch_'+str(i))['labels']).astype("int32") for i in [1,2,3,4,5]]) testimages = numpy.load(datadir+'/test_batch')['data'].reshape(-1,3,32,32).transpose(0,2,3,1).reshape(-1,32*32*3).astype("float32") testlabels = numpy.array(numpy.load(datadir+'/test_batch')['labels']).astype("int32") R = numpy_rng.permutation(trainimages.shape[0]) trainimages = trainimages[R] trainlabels = trainlabels[R] meanstd = trainimages.std() trainimages = trainimages.reshape(-1, 3072) trainimages -= trainimages.mean(1)[:,None] trainimages /= trainimages.std(1)[:,None] + 0.1 * meanstd testimages = testimages.reshape(-1, 3072) testimages -= testimages.mean(1)[:,None] testimages /= testimages.std(1)[:,None] + 0.1 * meanstd #LEARN PCA MATRICES print "whitening" trainimages_mean = trainimages.mean(0)[None,:] trainimages_std = trainimages.std(0)[None,:] trainimages -= trainimages_mean trainimages /= trainimages_std + 0.1 * meanstd pca_backward, pca_forward, zca_backward, zca_forward = pca(trainimages, dimstokeep=2000) #pca_backward, pca_forward, zca_backward, zca_forward = pca(trainimages, var_fraction=0.9) testimages -= trainimages_mean testimages /= trainimages_std + 0.1 * meanstd print "done" #dispims_color(numpy.dot(numpy.dot(trainimages[:100].reshape(100, 3*filtersize**2), pca_backward.T), pca_forward.T).reshape(100,32,32,3), 2) #ZCA THE IMAGES, THEN RESHAPE trainimages = numpy.dot(trainimages, zca_backward).reshape(-1,32,32,3).transpose(0,3,1,2).astype("float32") testimages = numpy.dot(testimages, zca_backward).reshape(-1,32,32,3).transpose(0,3,1,2).astype("float32") numtrain = 40000 numvali = 10000 alltrainimages = trainimages[:numtrain+numvali] trainimages = alltrainimages[:numtrain] valiimages = alltrainimages[numtrain:] alltrainlabels = trainlabels valilabels = alltrainlabels[numtrain:] trainlabels = alltrainlabels[:numtrain] #CLASSIFICATION cnnmodel = cnn_coatespipeline.SinglelayerCNN(numin=3, numhid=numfeatures, numout=10, filtersize=filtersize, output_type="softmax") trainer = graddescent_inout.sgd_trainer(cnnmodel, alltrainimages, logreg.onehot(alltrainlabels).astype("float32"), batchsize=128, learningrate=0.1) for epoch in range(20): trainer.step() if epoch %10 == 0: print "train subset performance: ", 1.0 - numpy.array([cnnmodel.zeroone(trainimages[i*500:(i+1)*500], trainlabels[i*500:(i+1)*500]) for i in range(20)]).mean() print "test performance: ", 1.0 - numpy.array([cnnmodel.zeroone(testimages[i*500:(i+1)*500], testlabels[i*500:(i+1)*500]) for i in range(20)]).mean()