# HG changeset patch # User humel # Date 1271981171 14400 # Node ID 64fa85d68923b10b171ac7e5f213fafbb1896899 # Parent 22919039f7abcffa68f504330636dc62798ad2e4# Parent 14b28e43ce4e4bcde310ef3007c1a85cb3c649fd undoing unwanted changes to setup_batches.py diff -r 14b28e43ce4e -r 64fa85d68923 deep/convolutional_dae/salah_exp/config.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/deep/convolutional_dae/salah_exp/config.py Thu Apr 22 20:06:11 2010 -0400 @@ -0,0 +1,177 @@ +''' +These are parameters used by nist_sda.py. They'll end up as globals in there. + +Rename this file to config.py and configure as needed. +DON'T add the renamed file to the repository, as others might use it +without realizing it, with dire consequences. +''' + +# Set this to True when you want to run cluster tests, ie. you want +# to run on the cluster, many jobs, but want to reduce the training +# set size and the number of epochs, so you know everything runs +# fine on the cluster. +# Set this PRIOR to inserting your test jobs in the DB. +TEST_CONFIG = False + +NIST_ALL_LOCATION = '/data/lisa/data/nist/by_class/all' +NIST_ALL_TRAIN_SIZE = 649081 +# valid et test =82587 82587 + +# change "sandbox" when you're ready +JOBDB = 'postgres://ift6266h10@gershwin/ift6266h10_db/rifaisal_csda' +EXPERIMENT_PATH = "ift6266.deep.convolutional_dae.salah_exp.nist_csda.jobman_entrypoint" + +##Pour lancer des travaux sur le cluster: (il faut etre ou se trouve les fichiers) +##python nist_sda.py jobman_insert +##dbidispatch --condor --repeat_jobs=2 jobman sql 'postgres://ift6266h10@gershwin/ift6266h10_db/pannetis_finetuningSDA0' . #C'est le path dans config.py + +# reduce training set to that many examples +REDUCE_TRAIN_TO = None +# that's a max, it usually doesn't get to that point +MAX_FINETUNING_EPOCHS = 1000 +# number of minibatches before taking means for valid error etc. +REDUCE_EVERY = 100 +#Set the finetune dataset +FINETUNE_SET=1 +#Set the pretrain dataset used. 0: NIST, 1:P07 +PRETRAIN_CHOICE=1 + + +if TEST_CONFIG: + REDUCE_TRAIN_TO = 1000 + MAX_FINETUNING_EPOCHS = 2 + REDUCE_EVERY = 10 + + +# This is to configure insertion of jobs on the cluster. +# Possible values the hyperparameters can take. These are then +# combined with produit_cartesien_jobs so we get a list of all +# possible combinations, each one resulting in a job inserted +# in the jobman DB. + + +JOB_VALS = {'pretraining_lr': [0.01],#, 0.001],#, 0.0001], + 'pretraining_epochs_per_layer': [10], + 'kernels' : [[[52,5,5], [32,3,3]], [[52,7,7], [52,3,3]]], + 'mlp_size' : [[1000],[500]], + 'imgshp' : [[32,32]], + 'max_pool_layers' : [[[2,2],[2,2]]], + 'corruption_levels': [[0.2,0.1]], + 'minibatch_size': [100], + 'max_finetuning_epochs':[MAX_FINETUNING_EPOCHS], + 'max_finetuning_epochs_P07':[1000], + 'finetuning_lr':[0.1,0.01], #0.001 was very bad, so we leave it out + 'num_hidden_layers':[2], + 'finetune_set':[1], + 'pretrain_choice':[1] + } + +DEFAULT_HP_NIST = {'pretraining_lr': 0.01, + 'pretraining_epochs_per_layer': 1, + 'kernels' : [[4,5,5], [2,3,3]], + 'mlp_size' : [10], + 'imgshp' : [32,32], + 'max_pool_layers' : [[2,2],[2,2]], + 'corruption_levels': [0.1,0.2], + 'minibatch_size': 20, + 'max_finetuning_epochs':MAX_FINETUNING_EPOCHS, + 'max_finetuning_epochs_P07':1000, + 'finetuning_lr':0.1, #0.001 was very bad, so we leave it out + 'num_hidden_layers':2, + 'finetune_set':1, + 'pretrain_choice':1, + #'reduce_train_to':1000, + } + + + +##[pannetis@ceylon test]$ python nist_sda.py test_jobman_entrypoint +##WARNING: untracked file /u/pannetis/IFT6266/ift6266/deep/stacked_dae/v_sylvain/TMP_DBI/configobj.py +##WARNING: untracked file /u/pannetis/IFT6266/ift6266/deep/stacked_dae/v_sylvain/TMP_DBI/utils.py +##WARNING: untracked file /u/pannetis/IFT6266/ift6266/deep/stacked_dae/v_sylvain/config.py +##WARNING: untracked file /u/pannetis/IFT6266/ift6266/deep/stacked_dae/v_sylvain/config2.py +##Creating optimizer with state, DD{'reduce_train_to': 11000, 'pretraining_epochs_per_layer': 2, 'hidden_layers_sizes': 300, 'num_hidden_layers': 2, 'corruption_levels': 0.20000000000000001, 'finetuning_lr': 0.10000000000000001, 'pretrain_choice': 0, 'max_finetuning_epochs': 2, 'version_pylearn': '08b37147dec1', 'finetune_set': -1, 'pretraining_lr': 0.10000000000000001, 'version_ift6266': 'a6b6b1140de9', 'version_theano': 'fb6c3a06cb65', 'minibatch_size': 20} +##SdaSgdOptimizer, max_minibatches = 11000 +##C##n_outs 62 +##pretrain_lr 0.1 +##finetune_lr 0.1 +##---- +## +##pretraining with NIST +## +##STARTING PRETRAINING, time = 2010-03-29 15:07:43.945981 +##Pre-training layer 0, epoch 0, cost 113.562562494 +##Pre-training layer 0, epoch 1, cost 113.410032944 +##Pre-training layer 1, epoch 0, cost 98.4539954687 +##Pre-training layer 1, epoch 1, cost 97.8658966686 +##Pretraining took 9.011333 minutes +## +##SERIE OF 3 DIFFERENT FINETUNINGS +## +## +##finetune with NIST +## +## +##STARTING FINETUNING, time = 2010-03-29 15:16:46.512235 +##epoch 1, minibatch 4999, validation error on P07 : 29.511250 % +## epoch 1, minibatch 4999, test error on dataset NIST (train data) of best model 40.408509 % +## epoch 1, minibatch 4999, test error on dataset P07 of best model 96.700000 % +##epoch 1, minibatch 9999, validation error on P07 : 25.560000 % +## epoch 1, minibatch 9999, test error on dataset NIST (train data) of best model 34.778969 % +## epoch 1, minibatch 9999, test error on dataset P07 of best model 97.037500 % +## +##Optimization complete with best validation score of 25.560000 %,with test performance 34.778969 % on dataset NIST +##The test score on the P07 dataset is 97.037500 +##The finetuning ran for 3.281833 minutes +## +## +##finetune with P07 +## +## +##STARTING FINETUNING, time = 2010-03-29 15:20:06.346009 +##epoch 1, minibatch 4999, validation error on NIST : 65.226250 % +## epoch 1, minibatch 4999, test error on dataset P07 (train data) of best model 84.465000 % +## epoch 1, minibatch 4999, test error on dataset NIST of best model 65.965237 % +##epoch 1, minibatch 9999, validation error on NIST : 58.745000 % +## epoch 1, minibatch 9999, test error on dataset P07 (train data) of best model 80.405000 % +## epoch 1, minibatch 9999, test error on dataset NIST of best model 61.341923 % +## +##Optimization complete with best validation score of 58.745000 %,with test performance 80.405000 % on dataset P07 +##The test score on the NIST dataset is 61.341923 +##The finetuning ran for 3.299500 minutes +## +## +##finetune with NIST (done earlier) followed by P07 (written here) +## +## +##STARTING FINETUNING, time = 2010-03-29 15:23:27.947374 +##epoch 1, minibatch 4999, validation error on NIST : 83.975000 % +## epoch 1, minibatch 4999, test error on dataset P07 (train data) of best model 83.872500 % +## epoch 1, minibatch 4999, test error on dataset NIST of best model 43.170010 % +##epoch 1, minibatch 9999, validation error on NIST : 79.775000 % +## epoch 1, minibatch 9999, test error on dataset P07 (train data) of best model 80.971250 % +## epoch 1, minibatch 9999, test error on dataset NIST of best model 49.017468 % +## +##Optimization complete with best validation score of 79.775000 %,with test performance 80.971250 % on dataset P07 +##The test score on the NIST dataset is 49.017468 +##The finetuning ran for 2.851500 minutes +## +## +##finetune with NIST only on the logistic regression on top. +## All hidden units output are input of the logistic regression +## +## +##STARTING FINETUNING, time = 2010-03-29 15:26:21.430557 +##epoch 1, minibatch 4999, validation error on P07 : 95.223750 % +## epoch 1, minibatch 4999, test error on dataset NIST (train data) of best model 93.268765 % +## epoch 1, minibatch 4999, test error on dataset P07 of best model 96.535000 % +##epoch 1, minibatch 9999, validation error on P07 : 95.223750 % +## +##Optimization complete with best validation score of 95.223750 %,with test performance 93.268765 % on dataset NIST +##The test score on the P07 dataset is 96.535000 +##The finetuning ran for 2.013167 minutes +##Closing remaining open files: /u/pannetis/IFT6266/test/series.h5... done +##[pannetis@ceylon test]$ + + + diff -r 14b28e43ce4e -r 64fa85d68923 deep/convolutional_dae/salah_exp/nist_csda.py --- a/deep/convolutional_dae/salah_exp/nist_csda.py Thu Apr 22 13:43:04 2010 -0400 +++ b/deep/convolutional_dae/salah_exp/nist_csda.py Thu Apr 22 20:06:11 2010 -0400 @@ -121,24 +121,20 @@ if finetune_choice == 0: print('\n\n\tfinetune with NIST\n\n') - optimizer.reload_parameters('params_pretrain.txt') optimizer.finetune(datasets.nist_all(),datasets.nist_P07(),max_finetune_epoch_NIST,ind_test=1,decrease=decrease_lr) channel.save() if finetune_choice == 1: print('\n\n\tfinetune with P07\n\n') - optimizer.reload_parameters('params_pretrain.txt') optimizer.finetune(datasets.nist_P07(),datasets.nist_all(),max_finetune_epoch_P07,ind_test=0,decrease=decrease_lr) channel.save() if finetune_choice == 2: print('\n\n\tfinetune with P07 followed by NIST\n\n') - optimizer.reload_parameters('params_pretrain.txt') optimizer.finetune(datasets.nist_P07(),datasets.nist_all(),max_finetune_epoch_P07,ind_test=20,decrease=decrease_lr) optimizer.finetune(datasets.nist_all(),datasets.nist_P07(),max_finetune_epoch_NIST,ind_test=21,decrease=decrease_lr) channel.save() if finetune_choice == 3: print('\n\n\tfinetune with NIST only on the logistic regression on top (but validation on P07).\n\ All hidden units output are input of the logistic regression\n\n') - optimizer.reload_parameters('params_pretrain.txt') optimizer.finetune(datasets.nist_all(),datasets.nist_P07(),max_finetune_epoch_NIST,ind_test=1,special=1,decrease=decrease_lr) @@ -146,7 +142,6 @@ print('\nSERIE OF 4 DIFFERENT FINETUNINGS') print('\n\n\tfinetune with NIST\n\n') sys.stdout.flush() - optimizer.reload_parameters('params_pretrain.txt') optimizer.finetune(datasets.nist_all(),datasets.nist_P07(),max_finetune_epoch_NIST,ind_test=1,decrease=decrease_lr) channel.save() print('\n\n\tfinetune with P07\n\n') diff -r 14b28e43ce4e -r 64fa85d68923 deep/convolutional_dae/salah_exp/sgd_optimization.py --- a/deep/convolutional_dae/salah_exp/sgd_optimization.py Thu Apr 22 13:43:04 2010 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,371 +0,0 @@ -#!/usr/bin/python -# coding: utf-8 - -# Generic SdA optimization loop, adapted from the deeplearning.net tutorial - -import numpy -import theano -import time -import datetime -import theano.tensor as T -import sys -import pickle - -from jobman import DD -import jobman, jobman.sql -from copy import copy - -from stacked_dae import SdA - -from ift6266.utils.seriestables import * - -#For test purpose only -buffersize=1000 - -default_series = { \ - 'reconstruction_error' : DummySeries(), - 'training_error' : DummySeries(), - 'validation_error' : DummySeries(), - 'test_error' : DummySeries(), - 'params' : DummySeries() - } - -def itermax(iter, max): - for i,it in enumerate(iter): - if i >= max: - break - yield it - -class SdaSgdOptimizer: - def __init__(self, dataset, hyperparameters, n_ins, n_outs, - examples_per_epoch, series=default_series, max_minibatches=None): - self.dataset = dataset - self.hp = hyperparameters - self.n_ins = n_ins - self.n_outs = n_outs - self.parameters_pre=[] - - self.max_minibatches = max_minibatches - print "SdaSgdOptimizer, max_minibatches =", max_minibatches - - self.ex_per_epoch = examples_per_epoch - self.mb_per_epoch = examples_per_epoch / self.hp.minibatch_size - - self.series = series - - self.rng = numpy.random.RandomState(1234) - - self.init_classifier() - - sys.stdout.flush() - - def init_classifier(self): - print "Constructing classifier" - - # we don't want to save arrays in DD objects, so - # we recreate those arrays here - nhl = self.hp.num_hidden_layers - layers_sizes = [self.hp.hidden_layers_sizes] * nhl - corruption_levels = [self.hp.corruption_levels] * nhl - - # construct the stacked denoising autoencoder class - self.classifier = SdA( \ - batch_size = self.hp.minibatch_size, \ - n_ins= self.n_ins, \ - hidden_layers_sizes = layers_sizes, \ - n_outs = self.n_outs, \ - corruption_levels = corruption_levels,\ - rng = self.rng,\ - pretrain_lr = self.hp.pretraining_lr, \ - finetune_lr = self.hp.finetuning_lr) - - #theano.printing.pydotprint(self.classifier.pretrain_functions[0], "function.graph") - - sys.stdout.flush() - - def train(self): - self.pretrain(self.dataset) - self.finetune(self.dataset) - - def pretrain(self,dataset): - print "STARTING PRETRAINING, time = ", datetime.datetime.now() - sys.stdout.flush() - - un_fichier=int(819200.0/self.hp.minibatch_size) #Number of batches in a P07 file - - start_time = time.clock() - ## Pre-train layer-wise - for i in xrange(self.classifier.n_layers): - # go through pretraining epochs - for epoch in xrange(self.hp.pretraining_epochs_per_layer): - # go through the training set - batch_index=0 - count=0 - num_files=0 - for x,y in dataset.train(self.hp.minibatch_size): - c = self.classifier.pretrain_functions[i](x) - count +=1 - - self.series["reconstruction_error"].append((epoch, batch_index), c) - batch_index+=1 - - #if batch_index % 100 == 0: - # print "100 batches" - - # useful when doing tests - if self.max_minibatches and batch_index >= self.max_minibatches: - break - - #When we pass through the data only once (the case with P07) - #There is approximately 800*1024=819200 examples per file (1k per example and files are 800M) - if self.hp.pretraining_epochs_per_layer == 1 and count%un_fichier == 0: - print 'Pre-training layer %i, epoch %d, cost '%(i,num_files),c - num_files+=1 - sys.stdout.flush() - self.series['params'].append((num_files,), self.classifier.all_params) - - #When NIST is used - if self.hp.pretraining_epochs_per_layer > 1: - print 'Pre-training layer %i, epoch %d, cost '%(i,epoch),c - sys.stdout.flush() - - self.series['params'].append((epoch,), self.classifier.all_params) - - end_time = time.clock() - - print ('Pretraining took %f minutes' %((end_time-start_time)/60.)) - self.hp.update({'pretraining_time': end_time-start_time}) - - sys.stdout.flush() - - #To be able to load them later for tests on finetune - self.parameters_pre=[copy(x.value) for x in self.classifier.params] - f = open('params_pretrain.txt', 'w') - pickle.dump(self.parameters_pre,f) - f.close() - - - def finetune(self,dataset,dataset_test,num_finetune,ind_test,special=0,decrease=0): - - if special != 0 and special != 1: - sys.exit('Bad value for variable special. Must be in {0,1}') - print "STARTING FINETUNING, time = ", datetime.datetime.now() - - minibatch_size = self.hp.minibatch_size - if ind_test == 0 or ind_test == 20: - nom_test = "NIST" - nom_train="P07" - else: - nom_test = "P07" - nom_train = "NIST" - - - # create a function to compute the mistakes that are made by the model - # on the validation set, or testing set - test_model = \ - theano.function( - [self.classifier.x,self.classifier.y], self.classifier.errors) - # givens = { - # self.classifier.x: ensemble_x, - # self.classifier.y: ensemble_y]}) - - validate_model = \ - theano.function( - [self.classifier.x,self.classifier.y], self.classifier.errors) - # givens = { - # self.classifier.x: , - # self.classifier.y: ]}) - - - # early-stopping parameters - patience = 10000 # look as this many examples regardless - patience_increase = 2. # wait this much longer when a new best is - # found - improvement_threshold = 0.995 # a relative improvement of this much is - # considered significant - validation_frequency = min(self.mb_per_epoch, patience/2) - # go through this many - # minibatche before checking the network - # on the validation set; in this case we - # check every epoch - if self.max_minibatches and validation_frequency > self.max_minibatches: - validation_frequency = self.max_minibatches / 2 - - best_params = None - best_validation_loss = float('inf') - test_score = 0. - start_time = time.clock() - - done_looping = False - epoch = 0 - - total_mb_index = 0 - minibatch_index = 0 - parameters_finetune=[] - - if ind_test == 21: - learning_rate = self.hp.finetuning_lr / 10.0 - else: - learning_rate = self.hp.finetuning_lr #The initial finetune lr - - - while (epoch < num_finetune) and (not done_looping): - epoch = epoch + 1 - - for x,y in dataset.train(minibatch_size,bufsize=buffersize): - minibatch_index += 1 - - - if special == 0: - cost_ij = self.classifier.finetune(x,y,learning_rate) - elif special == 1: - cost_ij = self.classifier.finetune2(x,y) - total_mb_index += 1 - - self.series["training_error"].append((epoch, minibatch_index), cost_ij) - - if (total_mb_index+1) % validation_frequency == 0: - #minibatch_index += 1 - #The validation set is always NIST (we want the model to be good on NIST) - if ind_test == 0 | ind_test == 20: - iter=dataset_test.valid(minibatch_size,bufsize=buffersize) - else: - iter = dataset.valid(minibatch_size,bufsize=buffersize) - if self.max_minibatches: - iter = itermax(iter, self.max_minibatches) - validation_losses = [validate_model(x,y) for x,y in iter] - this_validation_loss = numpy.mean(validation_losses) - - self.series["validation_error"].\ - append((epoch, minibatch_index), this_validation_loss*100.) - - print('epoch %i, minibatch %i, validation error on NIST : %f %%' % \ - (epoch, minibatch_index+1, \ - this_validation_loss*100.)) - - - # if we got the best validation score until now - if this_validation_loss < best_validation_loss: - - #improve patience if loss improvement is good enough - if this_validation_loss < best_validation_loss * \ - improvement_threshold : - patience = max(patience, total_mb_index * patience_increase) - - # save best validation score, iteration number and parameters - best_validation_loss = this_validation_loss - best_iter = total_mb_index - parameters_finetune=[copy(x.value) for x in self.classifier.params] - - # test it on the test set - iter = dataset.test(minibatch_size,bufsize=buffersize) - if self.max_minibatches: - iter = itermax(iter, self.max_minibatches) - test_losses = [test_model(x,y) for x,y in iter] - test_score = numpy.mean(test_losses) - - #test it on the second test set - iter2 = dataset_test.test(minibatch_size,bufsize=buffersize) - if self.max_minibatches: - iter2 = itermax(iter2, self.max_minibatches) - test_losses2 = [test_model(x,y) for x,y in iter2] - test_score2 = numpy.mean(test_losses2) - - self.series["test_error"].\ - append((epoch, minibatch_index), test_score*100.) - - print((' epoch %i, minibatch %i, test error on dataset %s (train data) of best ' - 'model %f %%') % - (epoch, minibatch_index+1,nom_train, - test_score*100.)) - - print((' epoch %i, minibatch %i, test error on dataset %s of best ' - 'model %f %%') % - (epoch, minibatch_index+1,nom_test, - test_score2*100.)) - - if patience <= total_mb_index: - done_looping = True - break #to exit the FOR loop - - sys.stdout.flush() - - # useful when doing tests - if self.max_minibatches and minibatch_index >= self.max_minibatches: - break - - if decrease == 1: - learning_rate /= 2 #divide the learning rate by 2 for each new epoch - - self.series['params'].append((epoch,), self.classifier.all_params) - - if done_looping == True: #To exit completly the fine-tuning - break #to exit the WHILE loop - - end_time = time.clock() - self.hp.update({'finetuning_time':end_time-start_time,\ - 'best_validation_error':best_validation_loss,\ - 'test_score':test_score, - 'num_finetuning_epochs':epoch}) - - print(('\nOptimization complete with best validation score of %f %%,' - 'with test performance %f %% on dataset %s ') % - (best_validation_loss * 100., test_score*100.,nom_train)) - print(('The test score on the %s dataset is %f')%(nom_test,test_score2*100.)) - - print ('The finetuning ran for %f minutes' % ((end_time-start_time)/60.)) - - sys.stdout.flush() - - #Save a copy of the parameters in a file to be able to get them in the future - - if special == 1: #To keep a track of the value of the parameters - f = open('params_finetune_stanford.txt', 'w') - pickle.dump(parameters_finetune,f) - f.close() - - elif ind_test == 0 | ind_test == 20: #To keep a track of the value of the parameters - f = open('params_finetune_P07.txt', 'w') - pickle.dump(parameters_finetune,f) - f.close() - - - elif ind_test== 1: #For the run with 2 finetunes. It will be faster. - f = open('params_finetune_NIST.txt', 'w') - pickle.dump(parameters_finetune,f) - f.close() - - elif ind_test== 21: #To keep a track of the value of the parameters - f = open('params_finetune_P07_then_NIST.txt', 'w') - pickle.dump(parameters_finetune,f) - f.close() - - - #Set parameters like they where right after pre-train or finetune - def reload_parameters(self,which): - - #self.parameters_pre=pickle.load('params_pretrain.txt') - f = open(which) - self.parameters_pre=pickle.load(f) - f.close() - for idx,x in enumerate(self.parameters_pre): - if x.dtype=='float64': - self.classifier.params[idx].value=theano._asarray(copy(x),dtype=theano.config.floatX) - else: - self.classifier.params[idx].value=copy(x) - - def training_error(self,dataset): - # create a function to compute the mistakes that are made by the model - # on the validation set, or testing set - test_model = \ - theano.function( - [self.classifier.x,self.classifier.y], self.classifier.errors) - - iter2 = dataset.train(self.hp.minibatch_size,bufsize=buffersize) - train_losses2 = [test_model(x,y) for x,y in iter2] - train_score2 = numpy.mean(train_losses2) - print "Training error is: " + str(train_score2) - - - - diff -r 14b28e43ce4e -r 64fa85d68923 deep/convolutional_dae/salah_exp/sgd_optimization_new.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/deep/convolutional_dae/salah_exp/sgd_optimization_new.py Thu Apr 22 20:06:11 2010 -0400 @@ -0,0 +1,394 @@ +#!/usr/bin/python +# coding: utf-8 + +import numpy +import theano +import time +import datetime +import theano.tensor as T +import sys +import pickle + +from jobman import DD +import jobman, jobman.sql +from copy import copy + +from stacked_convolutional_dae_uit import CSdA + +from ift6266.utils.seriestables import * + +buffersize=1000 + +default_series = { \ + 'reconstruction_error' : DummySeries(), + 'training_error' : DummySeries(), + 'validation_error' : DummySeries(), + 'test_error' : DummySeries(), + 'params' : DummySeries() + } + +def itermax(iter, max): + for i,it in enumerate(iter): + if i >= max: + break + yield it +def get_conv_shape(kernels,imgshp,batch_size,max_pool_layers): + # Returns the dimension at the output of the convoluational net + # and a list of Image and kernel shape for every + # Convolutional layer + conv_layers=[] + init_layer = [ [ kernels[0][0],1,kernels[0][1],kernels[0][2] ],\ + [ batch_size , 1, imgshp[0], imgshp[1] ], + max_pool_layers[0] ] + conv_layers.append(init_layer) + + conv_n_out = int((32-kernels[0][2]+1)/max_pool_layers[0][0]) + + for i in range(1,len(kernels)): + layer = [ [ kernels[i][0],kernels[i-1][0],kernels[i][1],kernels[i][2] ],\ + [ batch_size, kernels[i-1][0],conv_n_out,conv_n_out ], + max_pool_layers[i] ] + conv_layers.append(layer) + conv_n_out = int( (conv_n_out - kernels[i][2]+1)/max_pool_layers[i][0]) + conv_n_out=kernels[-1][0]*conv_n_out**2 + return conv_n_out,conv_layers + + + + + +class CSdASgdOptimizer: + def __init__(self, dataset, hyperparameters, n_ins, n_outs, + examples_per_epoch, series=default_series, max_minibatches=None): + self.dataset = dataset + self.hp = hyperparameters + self.n_ins = n_ins + self.n_outs = n_outs + self.parameters_pre=[] + + self.max_minibatches = max_minibatches + print "CSdASgdOptimizer, max_minibatches =", max_minibatches + + self.ex_per_epoch = examples_per_epoch + self.mb_per_epoch = examples_per_epoch / self.hp.minibatch_size + + self.series = series + + self.rng = numpy.random.RandomState(1234) + self.init_classifier() + + sys.stdout.flush() + + def init_classifier(self): + print "Constructing classifier" + + n_ins,convlayers = get_conv_shape(self.hp.kernels,self.hp.imgshp,self.hp.minibatch_size,self.hp.max_pool_layers) + + self.classifier = CSdA(n_ins_mlp = n_ins, + batch_size = self.hp.minibatch_size, + conv_hidden_layers_sizes = convlayers, + mlp_hidden_layers_sizes = self.hp.mlp_size, + corruption_levels = self.hp.corruption_levels, + rng = self.rng, + n_out = self.n_outs, + pretrain_lr = self.hp.pretraining_lr, + finetune_lr = self.hp.finetuning_lr) + + + + #theano.printing.pydotprint(self.classifier.pretrain_functions[0], "function.graph") + + sys.stdout.flush() + + def train(self): + self.pretrain(self.dataset) + self.finetune(self.dataset) + + def pretrain(self,dataset): + print "STARTING PRETRAINING, time = ", datetime.datetime.now() + sys.stdout.flush() + + un_fichier=int(819200.0/self.hp.minibatch_size) #Number of batches in a P07 file + + start_time = time.clock() + ## Pre-train layer-wise + for i in xrange(self.classifier.n_layers): + # go through pretraining epochs + for epoch in xrange(self.hp.pretraining_epochs_per_layer): + # go through the training set + batch_index=0 + count=0 + num_files=0 + for x,y in dataset.train(self.hp.minibatch_size): + if x.shape[0] != self.hp.minibatch_size: + continue + c = self.classifier.pretrain_functions[i](x) + count +=1 + + self.series["reconstruction_error"].append((epoch, batch_index), c) + batch_index+=1 + + #if batch_index % 100 == 0: + # print "100 batches" + + # useful when doing tests + if self.max_minibatches and batch_index >= self.max_minibatches: + break + + #When we pass through the data only once (the case with P07) + #There is approximately 800*1024=819200 examples per file (1k per example and files are 800M) + if self.hp.pretraining_epochs_per_layer == 1 and count%un_fichier == 0: + print 'Pre-training layer %i, epoch %d, cost '%(i,num_files),c + num_files+=1 + sys.stdout.flush() + self.series['params'].append((num_files,), self.classifier.all_params) + + #When NIST is used + if self.hp.pretraining_epochs_per_layer > 1: + print 'Pre-training layer %i, epoch %d, cost '%(i,epoch),c + sys.stdout.flush() + + self.series['params'].append((epoch,), self.classifier.all_params) + end_time = time.clock() + + print ('Pretraining took %f minutes' %((end_time-start_time)/60.)) + self.hp.update({'pretraining_time': end_time-start_time}) + + sys.stdout.flush() + + #To be able to load them later for tests on finetune + self.parameters_pre=[copy(x.value) for x in self.classifier.params] + f = open('params_pretrain.txt', 'w') + pickle.dump(self.parameters_pre,f) + f.close() + def finetune(self,dataset,dataset_test,num_finetune,ind_test,special=0,decrease=0): + + if special != 0 and special != 1: + sys.exit('Bad value for variable special. Must be in {0,1}') + print "STARTING FINETUNING, time = ", datetime.datetime.now() + + minibatch_size = self.hp.minibatch_size + if ind_test == 0 or ind_test == 20: + nom_test = "NIST" + nom_train="P07" + else: + nom_test = "P07" + nom_train = "NIST" + + + # create a function to compute the mistakes that are made by the model + # on the validation set, or testing set + test_model = \ + theano.function( + [self.classifier.x,self.classifier.y], self.classifier.errors) + # givens = { + # self.classifier.x: ensemble_x, + # self.classifier.y: ensemble_y]}) + + validate_model = \ + theano.function( + [self.classifier.x,self.classifier.y], self.classifier.errors) + # givens = { + # self.classifier.x: , + # self.classifier.y: ]}) + # early-stopping parameters + patience = 10000 # look as this many examples regardless + patience_increase = 2. # wait this much longer when a new best is + # found + improvement_threshold = 0.995 # a relative improvement of this much is + # considered significant + validation_frequency = min(self.mb_per_epoch, patience/2) + # go through this many + # minibatche before checking the network + # on the validation set; in this case we + # check every epoch + if self.max_minibatches and validation_frequency > self.max_minibatches: + validation_frequency = self.max_minibatches / 2 + best_params = None + best_validation_loss = float('inf') + test_score = 0. + start_time = time.clock() + + done_looping = False + epoch = 0 + + total_mb_index = 0 + minibatch_index = 0 + parameters_finetune=[] + learning_rate = self.hp.finetuning_lr + + + while (epoch < num_finetune) and (not done_looping): + epoch = epoch + 1 + + for x,y in dataset.train(minibatch_size,bufsize=buffersize): + + minibatch_index += 1 + + if x.shape[0] != self.hp.minibatch_size: + print 'bim' + continue + + cost_ij = self.classifier.finetune(x,y)#,learning_rate) + total_mb_index += 1 + + self.series["training_error"].append((epoch, minibatch_index), cost_ij) + + if (total_mb_index+1) % validation_frequency == 0: + #minibatch_index += 1 + #The validation set is always NIST (we want the model to be good on NIST) + + iter=dataset_test.valid(minibatch_size,bufsize=buffersize) + + + if self.max_minibatches: + iter = itermax(iter, self.max_minibatches) + + validation_losses = [] + + for x,y in iter: + if x.shape[0] != self.hp.minibatch_size: + print 'bim' + continue + validation_losses.append(validate_model(x,y)) + + this_validation_loss = numpy.mean(validation_losses) + + self.series["validation_error"].\ + append((epoch, minibatch_index), this_validation_loss*100.) + + print('epoch %i, minibatch %i, validation error on NIST : %f %%' % \ + (epoch, minibatch_index+1, \ + this_validation_loss*100.)) + + + # if we got the best validation score until now + if this_validation_loss < best_validation_loss: + + #improve patience if loss improvement is good enough + if this_validation_loss < best_validation_loss * \ + improvement_threshold : + patience = max(patience, total_mb_index * patience_increase) + + # save best validation score, iteration number and parameters + best_validation_loss = this_validation_loss + best_iter = total_mb_index + parameters_finetune=[copy(x.value) for x in self.classifier.params] + + # test it on the test set + iter = dataset.test(minibatch_size,bufsize=buffersize) + if self.max_minibatches: + iter = itermax(iter, self.max_minibatches) + test_losses = [] + test_losses2 = [] + for x,y in iter: + if x.shape[0] != self.hp.minibatch_size: + print 'bim' + continue + test_losses.append(test_model(x,y)) + + test_score = numpy.mean(test_losses) + + #test it on the second test set + iter2 = dataset_test.test(minibatch_size,bufsize=buffersize) + if self.max_minibatches: + iter2 = itermax(iter2, self.max_minibatches) + for x,y in iter2: + if x.shape[0] != self.hp.minibatch_size: + continue + test_losses2.append(test_model(x,y)) + + test_score2 = numpy.mean(test_losses2) + + self.series["test_error"].\ + append((epoch, minibatch_index), test_score*100.) + + print((' epoch %i, minibatch %i, test error on dataset %s (train data) of best ' + 'model %f %%') % + (epoch, minibatch_index+1,nom_train, + test_score*100.)) + + print((' epoch %i, minibatch %i, test error on dataset %s of best ' + 'model %f %%') % + (epoch, minibatch_index+1,nom_test, + test_score2*100.)) + + if patience <= total_mb_index: + done_looping = True + break #to exit the FOR loop + + sys.stdout.flush() + + # useful when doing tests + if self.max_minibatches and minibatch_index >= self.max_minibatches: + break + + if decrease == 1: + learning_rate /= 2 #divide the learning rate by 2 for each new epoch + + self.series['params'].append((epoch,), self.classifier.all_params) + + if done_looping == True: #To exit completly the fine-tuning + break #to exit the WHILE loop + + end_time = time.clock() + self.hp.update({'finetuning_time':end_time-start_time,\ + 'best_validation_error':best_validation_loss,\ + 'test_score':test_score, + 'num_finetuning_epochs':epoch}) + + print(('\nOptimization complete with best validation score of %f %%,' + 'with test performance %f %% on dataset %s ') % + (best_validation_loss * 100., test_score*100.,nom_train)) + print(('The test score on the %s dataset is %f')%(nom_test,test_score2*100.)) + + print ('The finetuning ran for %f minutes' % ((end_time-start_time)/60.)) + + sys.stdout.flush() + + #Save a copy of the parameters in a file to be able to get them in the future + + if special == 1: #To keep a track of the value of the parameters + f = open('params_finetune_stanford.txt', 'w') + pickle.dump(parameters_finetune,f) + f.close() + + elif ind_test == 0 | ind_test == 20: #To keep a track of the value of the parameters + f = open('params_finetune_P07.txt', 'w') + pickle.dump(parameters_finetune,f) + f.close() + + + elif ind_test== 1: #For the run with 2 finetunes. It will be faster. + f = open('params_finetune_NIST.txt', 'w') + pickle.dump(parameters_finetune,f) + f.close() + + elif ind_test== 21: #To keep a track of the value of the parameters + f = open('params_finetune_P07_then_NIST.txt', 'w') + pickle.dump(parameters_finetune,f) + f.close() + #Set parameters like they where right after pre-train or finetune + def reload_parameters(self,which): + + #self.parameters_pre=pickle.load('params_pretrain.txt') + f = open(which) + self.parameters_pre=pickle.load(f) + f.close() + for idx,x in enumerate(self.parameters_pre): + if x.dtype=='float64': + self.classifier.params[idx].value=theano._asarray(copy(x),dtype=theano.config.floatX) + else: + self.classifier.params[idx].value=copy(x) + + def training_error(self,dataset): + # create a function to compute the mistakes that are made by the model + # on the validation set, or testing set + test_model = \ + theano.function( + [self.classifier.x,self.classifier.y], self.classifier.errors) + + iter2 = dataset.train(self.hp.minibatch_size,bufsize=buffersize) + train_losses2 = [test_model(x,y) for x,y in iter2] + train_score2 = numpy.mean(train_losses2) + print "Training error is: " + str(train_score2) diff -r 14b28e43ce4e -r 64fa85d68923 deep/convolutional_dae/salah_exp/stacked_convolutional_dae_uit.py --- a/deep/convolutional_dae/salah_exp/stacked_convolutional_dae_uit.py Thu Apr 22 13:43:04 2010 -0400 +++ b/deep/convolutional_dae/salah_exp/stacked_convolutional_dae_uit.py Thu Apr 22 20:06:11 2010 -0400 @@ -9,7 +9,8 @@ from theano.tensor.signal import downsample from theano.tensor.nnet import conv - +sys.path.append('../../') +#import ift6266.datasets import ift6266.datasets from ift6266.baseline.log_reg.log_reg import LogisticRegression diff -r 14b28e43ce4e -r 64fa85d68923 deep/crbm/__init__.py diff -r 14b28e43ce4e -r 64fa85d68923 deep/crbm/mnist_config.py.example diff -r 14b28e43ce4e -r 64fa85d68923 deep/crbm/mnist_crbm.py --- a/deep/crbm/mnist_crbm.py Thu Apr 22 13:43:04 2010 -0400 +++ b/deep/crbm/mnist_crbm.py Thu Apr 22 20:06:11 2010 -0400 @@ -3,6 +3,15 @@ import sys import os, os.path +# do this before importing custom modules +from mnist_config import * + +if not (len(sys.argv) > 1 and sys.argv[1] in \ + ('test_jobman_entrypoint', 'run_local')): + # in those cases don't use isolated code, use dev code + print "Running experiment isolation code" + isolate_experiment() + import numpy as N import theano @@ -10,6 +19,7 @@ from crbm import CRBM, ConvolutionParams +import pylearn, pylearn.version from pylearn.datasets import MNIST from pylearn.io.image_tiling import tile_raster_images @@ -18,68 +28,63 @@ from pylearn.io.seriestables import * import tables -IMAGE_OUTPUT_DIR = 'img/' - -REDUCE_EVERY = 100 +import ift6266 -def filename_from_time(suffix): - import datetime - return str(datetime.datetime.now()) + suffix + ".png" +import utils -# Just a shortcut for a common case where we need a few -# related Error (float) series -def get_accumulator_series_array( \ - hdf5_file, group_name, series_names, - reduce_every, - index_names=('epoch','minibatch'), - stdout_too=True, - skip_hdf5_append=False): - all_series = [] - - hdf5_file.createGroup('/', group_name) +def setup_workdir(): + if not os.path.exists(IMAGE_OUTPUT_DIR): + os.mkdir(IMAGE_OUTPUT_DIR) + if not os.path.exists(IMAGE_OUTPUT_DIR): + print "For some reason mkdir(IMAGE_OUTPUT_DIR) failed!" + sys.exit(1) + print "Created image output dir" + elif os.path.isfile(IMAGE_OUTPUT_DIR): + print "IMAGE_OUTPUT_DIR is not a directory!" + sys.exit(1) - other_targets = [] - if stdout_too: - other_targets = [StdoutAppendTarget()] +#def filename_from_time(suffix): +# import datetime +# return str(datetime.datetime.now()) + suffix + ".png" - for sn in series_names: - series_base = \ - ErrorSeries(error_name=sn, - table_name=sn, - hdf5_file=hdf5_file, - hdf5_group='/'+group_name, - index_names=index_names, - other_targets=other_targets, - skip_hdf5_append=skip_hdf5_append) +def jobman_entrypoint(state, channel): + # record mercurial versions of each package + pylearn.version.record_versions(state,[theano,ift6266,pylearn]) + channel.save() - all_series.append( \ - AccumulatorSeriesWrapper( \ - base_series=series_base, - reduce_every=reduce_every)) + setup_workdir() - ret_wrapper = SeriesArrayWrapper(all_series) + crbm = MnistCrbm(state) + crbm.train() - return ret_wrapper + return channel.COMPLETE class MnistCrbm(object): - def __init__(self): - self.mnist = MNIST.full()#first_10k() + def __init__(self, state): + self.state = state + + if TEST_CONFIG: + self.mnist = MNIST.first_1k() + print "Test config, so loaded MNIST first 1000" + else: + self.mnist = MNIST.full()#first_10k() + print "Loaded MNIST full" self.cp = ConvolutionParams( \ - num_filters=40, + num_filters=state.num_filters, num_input_planes=1, - height_filters=12, - width_filters=12) + height_filters=state.filter_size, + width_filters=state.filter_size) self.image_size = (28,28) - self.minibatch_size = 10 + self.minibatch_size = state.minibatch_size - self.lr = 0.01 - self.sparsity_lambda = 1.0 + self.lr = state.learning_rate + self.sparsity_lambda = state.sparsity_lambda # about 1/num_filters, so only one filter active at a time # 40 * 0.05 = ~2 filters active for any given pixel - self.sparsity_p = 0.05 + self.sparsity_p = state.sparsity_p self.crbm = CRBM( \ minibatch_size=self.minibatch_size, @@ -89,12 +94,11 @@ sparsity_lambda=self.sparsity_lambda, sparsity_p=self.sparsity_p) - self.num_epochs = 10 + self.num_epochs = state.num_epochs self.init_series() def init_series(self): - series = {} basedir = os.getcwd() @@ -103,38 +107,36 @@ cd_series_names = self.crbm.cd_return_desc series['cd'] = \ - get_accumulator_series_array( \ + utils.get_accumulator_series_array( \ h5f, 'cd', cd_series_names, REDUCE_EVERY, - stdout_too=True) + stdout_too=SERIES_STDOUT_TOO) sparsity_series_names = self.crbm.sparsity_return_desc series['sparsity'] = \ - get_accumulator_series_array( \ + utils.get_accumulator_series_array( \ h5f, 'sparsity', sparsity_series_names, REDUCE_EVERY, - stdout_too=True) + stdout_too=SERIES_STDOUT_TOO) # so first we create the names for each table, based on # position of each param in the array - params_stdout = StdoutAppendTarget("\n------\nParams") + params_stdout = [] + if SERIES_STDOUT_TOO: + params_stdout = [StdoutAppendTarget()] series['params'] = SharedParamsStatisticsWrapper( new_group_name="params", base_group="/", arrays_names=['W','b_h','b_x'], hdf5_file=h5f, index_names=('epoch','minibatch'), - other_targets=[params_stdout]) + other_targets=params_stdout) self.series = series def train(self): num_minibatches = len(self.mnist.train.x) / self.minibatch_size - print_every = 1000 - visualize_every = 5000 - gibbs_steps_from_random = 1000 - for epoch in xrange(self.num_epochs): for mb_index in xrange(num_minibatches): mb_x = self.mnist.train.x \ @@ -158,13 +160,22 @@ self.series['params'].append( \ (epoch, mb_index), self.crbm.params) - if total_idx % visualize_every == 0: + if total_idx % VISUALIZE_EVERY == 0: self.visualize_gibbs_result(\ - mb_x, gibbs_steps_from_random) - self.visualize_gibbs_result(mb_x, 1) - self.visualize_filters() + mb_x, GIBBS_STEPS_IN_VIZ_CHAIN, + "gibbs_chain_"+str(epoch)+"_"+str(mb_index)) + self.visualize_gibbs_result(mb_x, 1, + "gibbs_1_"+str(epoch)+"_"+str(mb_index)) + self.visualize_filters( + "filters_"+str(epoch)+"_"+str(mb_index)) + if TEST_CONFIG: + # do a single epoch for cluster tests config + break + + if SAVE_PARAMS: + utils.save_params(self.crbm.params, "params.pkl") - def visualize_gibbs_result(self, start_x, gibbs_steps): + def visualize_gibbs_result(self, start_x, gibbs_steps, filename): # Run minibatch_size chains for gibbs_steps x_samples = None if not start_x is None: @@ -176,15 +187,14 @@ tile = tile_raster_images(x_samples, self.image_size, (1, self.minibatch_size), output_pixel_vals=True) - filepath = os.path.join(IMAGE_OUTPUT_DIR, - filename_from_time("gibbs")) + filepath = os.path.join(IMAGE_OUTPUT_DIR, filename+".png") img = Image.fromarray(tile) img.save(filepath) print "Result of running Gibbs", \ gibbs_steps, "times outputed to", filepath - def visualize_filters(self): + def visualize_filters(self, filename): cp = self.cp # filter size @@ -198,18 +208,27 @@ tile = tile_raster_images(filters_flattened, fsz, tile_shape, output_pixel_vals=True) - filepath = os.path.join(IMAGE_OUTPUT_DIR, - filename_from_time("filters")) + filepath = os.path.join(IMAGE_OUTPUT_DIR, filename+".png") img = Image.fromarray(tile) img.save(filepath) print "Filters (as images) outputed to", filepath - print "b_h is", self.crbm.b_h.value - if __name__ == '__main__': - mc = MnistCrbm() - mc.train() + args = sys.argv[1:] + if len(args) == 0: + print "Bad usage" + elif args[0] == 'jobman_insert': + utils.jobman_insert_job_vals(JOBDB, EXPERIMENT_PATH, JOB_VALS) + elif args[0] == 'test_jobman_entrypoint': + chanmock = DD({'COMPLETE':0,'save':(lambda:None)}) + jobman_entrypoint(DEFAULT_STATE, chanmock) + elif args[0] == 'run_default': + setup_workdir() + mc = MnistCrbm(DEFAULT_STATE) + mc.train() + + diff -r 14b28e43ce4e -r 64fa85d68923 deep/crbm/utils.py diff -r 14b28e43ce4e -r 64fa85d68923 scripts/setup_batches.py