From 212e14ec93489fcaa8a039c4bc64abeb8852c5ec Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Wed, 21 Jun 2017 08:55:56 +0200 Subject: [PATCH 01/16] Fix. --- svrtset.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/svrtset.py b/svrtset.py index ead6083..8f03f37 100755 --- a/svrtset.py +++ b/svrtset.py @@ -136,7 +136,7 @@ class CompressedVignetteSet: raise mem = (resource.getrusage(resource.RUSAGE_SELF).ru_maxrss - usage) * 1024 - print('Using ' + str(mem / (1024 * 1024)) + 'Gb / ' + + print('Using ' + str(mem / (1024 * 1024 * 1024)) + 'Gb / ' + str(mem / self.nb_samples) + ' bytes per sample') self.mean = acc / self.nb_batches -- 2.20.1 From ce165da28eab42885032aa07e5defc6c72763576 Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Wed, 21 Jun 2017 19:55:04 +0200 Subject: [PATCH 02/16] Minor changes in the logging. --- cnn-svrt.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/cnn-svrt.py b/cnn-svrt.py index f3d350e..a41d42c 100755 --- a/cnn-svrt.py +++ b/cnn-svrt.py @@ -25,6 +25,7 @@ import time import argparse import math import distutils.util +import re from colorama import Fore, Back, Style @@ -94,13 +95,15 @@ args = parser.parse_args() log_file = open(args.log_file, 'a') pred_log_t = None +last_tag_t = time.time() print(Fore.RED + 'Logging into ' + args.log_file + Style.RESET_ALL) # Log and prints the string, with a time stamp. Does not log the # remark + def log_string(s, remark = ''): - global pred_log_t + global pred_log_t, last_tag_t t = time.time() @@ -111,10 +114,14 @@ def log_string(s, remark = ''): pred_log_t = t - log_file.write('[' + time.ctime() + '] ' + elapsed + ' ' + s + '\n') + if t > last_tag_t + 3600: + last_tag_t = t + print(Fore.RED + time.ctime() + Style.RESET_ALL) + + log_file.write(re.sub(' ', '_', time.ctime()) + ' ' + elapsed + ' ' + s + '\n') log_file.flush() - print(Fore.BLUE + '[' + time.ctime() + '] ' + Fore.GREEN + elapsed + Style.RESET_ALL + ' ' + s + Fore.CYAN + remark + Style.RESET_ALL) + print(Fore.BLUE + time.ctime() + ' ' + Fore.GREEN + elapsed + Style.RESET_ALL + ' ' + s + Fore.CYAN + remark + Style.RESET_ALL) ###################################################################### -- 2.20.1 From 9f566b0dc34a2caac941e33e12ca529ef887a171 Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Wed, 21 Jun 2017 19:58:52 +0200 Subject: [PATCH 03/16] Update. --- svrtset.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/svrtset.py b/svrtset.py index 8f03f37..54c4dec 100755 --- a/svrtset.py +++ b/svrtset.py @@ -136,8 +136,8 @@ class CompressedVignetteSet: raise mem = (resource.getrusage(resource.RUSAGE_SELF).ru_maxrss - usage) * 1024 - print('Using ' + str(mem / (1024 * 1024 * 1024)) + 'Gb / ' + - str(mem / self.nb_samples) + ' bytes per sample') + print('Using {:.02f}Gb total {:.02f}b / samples' + .format(mem / (1024 * 1024 * 1024), mem / self.nb_samples)) self.mean = acc / self.nb_batches self.std = sqrt(acc_sq / self.nb_batches - self.mean * self.mean) -- 2.20.1 From 1b7eb64f1a3de3761ff887b4cfbc25a81a60b00e Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Thu, 22 Jun 2017 08:05:25 +0200 Subject: [PATCH 04/16] Update. --- cnn-svrt.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/cnn-svrt.py b/cnn-svrt.py index a41d42c..d6c7169 100755 --- a/cnn-svrt.py +++ b/cnn-svrt.py @@ -32,6 +32,7 @@ from colorama import Fore, Back, Style # Pytorch import torch +import torchvision from torch import optim from torch import FloatTensor as Tensor @@ -73,6 +74,9 @@ parser.add_argument('--batch_size', parser.add_argument('--log_file', type = str, default = 'default.log') +parser.add_argument('--nb_exemplar_vignettes', + type = int, default = -1) + parser.add_argument('--compress_vignettes', type = distutils.util.strtobool, default = 'True', help = 'Use lossless compression to reduce the memory footprint') @@ -295,6 +299,21 @@ class vignette_logger(): ) self.last_t = t +def save_examplar_vignettes(data_set, nb, name): + n = torch.randperm(data_set.nb_samples).narrow(0, 0, nb) + + for k in range(0, nb): + b = n[k] // data_set.batch_size + m = n[k] % data_set.batch_size + i, t = data_set.get_batch(b) + i = i[m].float() + i.sub_(i.min()) + i.div_(i.max()) + if k == 0: patchwork = Tensor(nb, 1, i.size(1), i.size(2)) + patchwork[k].copy_(i) + + torchvision.utils.save_image(patchwork, name) + ###################################################################### if args.nb_train_samples%args.batch_size > 0 or args.nb_test_samples%args.batch_size > 0: @@ -357,6 +376,10 @@ for problem_number in map(int, args.problems.split(',')): train_set.nb_samples / (time.time() - t)) ) + if args.nb_exemplar_vignettes > 0: + save_examplar_vignettes(train_set, args.nb_exemplar_vignettes, + 'examplar_{:d}.png'.format(problem_number)) + if args.validation_error_threshold > 0.0: validation_set = VignetteSet(problem_number, args.nb_validation_samples, args.batch_size, -- 2.20.1 From e9f012349010d2a4f5d2ed0869974611fade32f1 Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Thu, 22 Jun 2017 08:07:09 +0200 Subject: [PATCH 05/16] Update. --- cnn-svrt.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cnn-svrt.py b/cnn-svrt.py index d6c7169..7fe2db2 100755 --- a/cnn-svrt.py +++ b/cnn-svrt.py @@ -35,10 +35,12 @@ import torch import torchvision from torch import optim +from torch import multiprocessing from torch import FloatTensor as Tensor from torch.autograd import Variable from torch import nn from torch.nn import functional as fn + from torchvision import datasets, transforms, utils # SVRT -- 2.20.1 From 95146c1d3c5954302284d45dcc3c6da26eaee253 Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Thu, 22 Jun 2017 08:49:10 +0200 Subject: [PATCH 06/16] Update. --- cnn-svrt.py | 80 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 70 insertions(+), 10 deletions(-) diff --git a/cnn-svrt.py b/cnn-svrt.py index 7fe2db2..227d9b4 100755 --- a/cnn-svrt.py +++ b/cnn-svrt.py @@ -77,15 +77,15 @@ parser.add_argument('--log_file', type = str, default = 'default.log') parser.add_argument('--nb_exemplar_vignettes', - type = int, default = -1) + type = int, default = 32) parser.add_argument('--compress_vignettes', type = distutils.util.strtobool, default = 'True', help = 'Use lossless compression to reduce the memory footprint') -parser.add_argument('--deep_model', - type = distutils.util.strtobool, default = 'True', - help = 'Use Afroze\'s Alexnet-like deep model') +parser.add_argument('--model', + type = str, default = 'deepnet', + help = 'What model to use') parser.add_argument('--test_loaded_models', type = distutils.util.strtobool, default = 'False', @@ -146,6 +146,8 @@ def log_string(s, remark = ''): # -- full(84x2) -> 2 1 class AfrozeShallowNet(nn.Module): + name = 'shallownet' + def __init__(self): super(AfrozeShallowNet, self).__init__() self.conv1 = nn.Conv2d(1, 6, kernel_size=21) @@ -153,7 +155,6 @@ class AfrozeShallowNet(nn.Module): self.conv3 = nn.Conv2d(16, 120, kernel_size=18) self.fc1 = nn.Linear(120, 84) self.fc2 = nn.Linear(84, 2) - self.name = 'shallownet' def forward(self, x): x = fn.relu(fn.max_pool2d(self.conv1(x), kernel_size=2)) @@ -169,6 +170,9 @@ class AfrozeShallowNet(nn.Module): # Afroze's DeepNet class AfrozeDeepNet(nn.Module): + + name = 'deepnet' + def __init__(self): super(AfrozeDeepNet, self).__init__() self.conv1 = nn.Conv2d( 1, 32, kernel_size=7, stride=4, padding=3) @@ -179,7 +183,53 @@ class AfrozeDeepNet(nn.Module): self.fc1 = nn.Linear(1536, 256) self.fc2 = nn.Linear(256, 256) self.fc3 = nn.Linear(256, 2) - self.name = 'deepnet' + + def forward(self, x): + x = self.conv1(x) + x = fn.max_pool2d(x, kernel_size=2) + x = fn.relu(x) + + x = self.conv2(x) + x = fn.max_pool2d(x, kernel_size=2) + x = fn.relu(x) + + x = self.conv3(x) + x = fn.relu(x) + + x = self.conv4(x) + x = fn.relu(x) + + x = self.conv5(x) + x = fn.max_pool2d(x, kernel_size=2) + x = fn.relu(x) + + x = x.view(-1, 1536) + + x = self.fc1(x) + x = fn.relu(x) + + x = self.fc2(x) + x = fn.relu(x) + + x = self.fc3(x) + + return x + +###################################################################### + +class DeepNet2(nn.Module): + name = 'deepnet2' + + def __init__(self): + super(DeepNet2, self).__init__() + self.conv1 = nn.Conv2d( 1, 32, kernel_size=7, stride=4, padding=3) + self.conv2 = nn.Conv2d( 32, 128, kernel_size=5, padding=2) + self.conv3 = nn.Conv2d(128, 128, kernel_size=3, padding=1) + self.conv4 = nn.Conv2d(128, 128, kernel_size=3, padding=1) + self.conv5 = nn.Conv2d(128, 128, kernel_size=3, padding=1) + self.fc1 = nn.Linear(2048, 512) + self.fc2 = nn.Linear(512, 512) + self.fc3 = nn.Linear(256, 2) def forward(self, x): x = self.conv1(x) @@ -331,14 +381,24 @@ else: log_string('using_uncompressed_vignettes') VignetteSet = svrtset.VignetteSet +######################################## +model_class = None +for m in [ AfrozeShallowNet, AfrozeDeepNet, DeepNet2 ]: + if args.model == m.name: + model_class = m + break +if model_class is None: + print('Unknown model ' + args.model) + raise + +log_string('using model class ' + m.name) +######################################## + for problem_number in map(int, args.problems.split(',')): log_string('############### problem ' + str(problem_number) + ' ###############') - if args.deep_model: - model = AfrozeDeepNet() - else: - model = AfrozeShallowNet() + model = model_class() if torch.cuda.is_available(): model.cuda() -- 2.20.1 From cdcaa8361d43a497d50c2f3703f9f5b4be9c2298 Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Thu, 22 Jun 2017 17:49:56 +0200 Subject: [PATCH 07/16] Oups. --- cnn-svrt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn-svrt.py b/cnn-svrt.py index 227d9b4..07c11b3 100755 --- a/cnn-svrt.py +++ b/cnn-svrt.py @@ -250,7 +250,7 @@ class DeepNet2(nn.Module): x = fn.max_pool2d(x, kernel_size=2) x = fn.relu(x) - x = x.view(-1, 1536) + x = x.view(-1, 2048) x = self.fc1(x) x = fn.relu(x) -- 2.20.1 From 33ce0facd62e208f04aec201d39e4ed3b989a830 Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Thu, 22 Jun 2017 17:51:19 +0200 Subject: [PATCH 08/16] Re-oups. --- cnn-svrt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn-svrt.py b/cnn-svrt.py index 07c11b3..1511e82 100755 --- a/cnn-svrt.py +++ b/cnn-svrt.py @@ -229,7 +229,7 @@ class DeepNet2(nn.Module): self.conv5 = nn.Conv2d(128, 128, kernel_size=3, padding=1) self.fc1 = nn.Linear(2048, 512) self.fc2 = nn.Linear(512, 512) - self.fc3 = nn.Linear(256, 2) + self.fc3 = nn.Linear(512, 2) def forward(self, x): x = self.conv1(x) -- 2.20.1 From 838ded8648c0d870a3645ed49b2e9b86ffeb141d Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Thu, 22 Jun 2017 21:41:37 +0200 Subject: [PATCH 09/16] Update. --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cb77899..85e7df6 100644 --- a/README.md +++ b/README.md @@ -26,20 +26,21 @@ slow as 40 on a 4GHz i7-6700K. ## Vignette sets ## The file [`svrtset.py`](https://fleuret.org/git-extract/pysvrt/svrtset.py) implements the classes `VignetteSet` and -`CompressedVignetteSet` with the following constructor +`CompressedVignetteSet` both with a constructor ``` __init__(problem_number, nb_samples, batch_size, cuda = False, logger = None) ``` -and the following method to return one batch +and a method ``` (torch.FloatTensor, torch.LongTensor) get_batch(b) ``` -as a pair composed of a 4d 'input' Tensor (i.e. single channel 128x128 -images), and a 1d 'target' Tensor (i.e. Boolean labels). +which returns a pair composed of a 4d 'input' Tensor (i.e. single +channel 128x128 images), and a 1d 'target' Tensor (i.e. Boolean +labels). ## Low-level functions ## -- 2.20.1 From 3c9b04dccaaf2a42cca35d5ea266f442cbb726ea Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Thu, 22 Jun 2017 21:55:23 +0200 Subject: [PATCH 10/16] The learning continues from where it stopped if a state is found. --- cnn-svrt.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/cnn-svrt.py b/cnn-svrt.py index 1511e82..fb1cad9 100755 --- a/cnn-svrt.py +++ b/cnn-svrt.py @@ -279,7 +279,7 @@ def nb_errors(model, data_set): ###################################################################### -def train_model(model, train_set, validation_set): +def train_model(model, model_filename, train_set, validation_set, nb_epochs_done = 0): batch_size = args.batch_size criterion = nn.CrossEntropyLoss() @@ -290,7 +290,7 @@ def train_model(model, train_set, validation_set): start_t = time.time() - for e in range(0, args.nb_epochs): + for e in range(nb_epochs_done, args.nb_epochs): acc_loss = 0.0 for b in range(0, train_set.nb_batches): input, target = train_set.get_batch(b) @@ -305,6 +305,8 @@ def train_model(model, train_set, validation_set): log_string('train_loss {:d} {:f}'.format(e + 1, acc_loss), ' [ETA ' + time.ctime(time.time() + dt * (args.nb_epochs - e)) + ']') + torch.save([ model.state_dict(), e + 1 ], model_filename) + if validation_set is not None: nb_validation_errors = nb_errors(model, validation_set) @@ -404,7 +406,7 @@ for problem_number in map(int, args.problems.split(',')): model_filename = model.name + '_pb:' + \ str(problem_number) + '_ns:' + \ - int_to_suffix(args.nb_train_samples) + '.param' + int_to_suffix(args.nb_train_samples) + '.state' nb_parameters = 0 for p in model.parameters(): nb_parameters += p.numel() @@ -415,15 +417,17 @@ for problem_number in map(int, args.problems.split(',')): need_to_train = False try: - model.load_state_dict(torch.load(model_filename)) + model_state_dict, nb_epochs_done = torch.load(model_filename) + model.load_state_dict(model_state_dict) log_string('loaded_model ' + model_filename) except: - need_to_train = True + nb_epochs_done = 0 + ################################################## # Train if necessary - if need_to_train: + if nb_epochs_done < args.nb_epochs: log_string('training_model ' + model_filename) @@ -450,8 +454,7 @@ for problem_number in map(int, args.problems.split(',')): else: validation_set = None - train_model(model, train_set, validation_set) - torch.save(model.state_dict(), model_filename) + train_model(model, model_filename, train_set, validation_set, nb_epochs_done = nb_epochs_done) log_string('saved_model ' + model_filename) nb_train_errors = nb_errors(model, train_set) -- 2.20.1 From 5c389b78b93edbaffc1ffdb18ef851ce253f167d Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Sat, 24 Jun 2017 00:12:14 +0200 Subject: [PATCH 11/16] Making DeepNet even bigger. --- cnn-svrt.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cnn-svrt.py b/cnn-svrt.py index fb1cad9..4481049 100755 --- a/cnn-svrt.py +++ b/cnn-svrt.py @@ -223,11 +223,11 @@ class DeepNet2(nn.Module): def __init__(self): super(DeepNet2, self).__init__() self.conv1 = nn.Conv2d( 1, 32, kernel_size=7, stride=4, padding=3) - self.conv2 = nn.Conv2d( 32, 128, kernel_size=5, padding=2) - self.conv3 = nn.Conv2d(128, 128, kernel_size=3, padding=1) - self.conv4 = nn.Conv2d(128, 128, kernel_size=3, padding=1) - self.conv5 = nn.Conv2d(128, 128, kernel_size=3, padding=1) - self.fc1 = nn.Linear(2048, 512) + self.conv2 = nn.Conv2d( 32, 256, kernel_size=5, padding=2) + self.conv3 = nn.Conv2d(256, 256, kernel_size=3, padding=1) + self.conv4 = nn.Conv2d(256, 256, kernel_size=3, padding=1) + self.conv5 = nn.Conv2d(256, 256, kernel_size=3, padding=1) + self.fc1 = nn.Linear(4096, 512) self.fc2 = nn.Linear(512, 512) self.fc3 = nn.Linear(512, 2) @@ -250,7 +250,7 @@ class DeepNet2(nn.Module): x = fn.max_pool2d(x, kernel_size=2) x = fn.relu(x) - x = x.view(-1, 2048) + x = x.view(-1, 4096) x = self.fc1(x) x = fn.relu(x) -- 2.20.1 From b3c335857859d457575128690e4aa77f52d17e5c Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Sun, 25 Jun 2017 09:54:19 +0200 Subject: [PATCH 12/16] Making an even deeper model. --- cnn-svrt.py | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/cnn-svrt.py b/cnn-svrt.py index 4481049..cb94184 100755 --- a/cnn-svrt.py +++ b/cnn-svrt.py @@ -264,6 +264,61 @@ class DeepNet2(nn.Module): ###################################################################### +class DeepNet3(nn.Module): + name = 'deepnet3' + + def __init__(self): + super(DeepNet2, self).__init__() + self.conv1 = nn.Conv2d( 1, 32, kernel_size=7, stride=4, padding=3) + self.conv2 = nn.Conv2d( 32, 256, kernel_size=5, padding=2) + self.conv3 = nn.Conv2d(256, 256, kernel_size=3, padding=1) + self.conv4 = nn.Conv2d(256, 256, kernel_size=3, padding=1) + self.conv5 = nn.Conv2d(256, 256, kernel_size=3, padding=1) + self.conv6 = nn.Conv2d(256, 256, kernel_size=3, padding=1) + self.conv7 = nn.Conv2d(256, 256, kernel_size=3, padding=1) + self.fc1 = nn.Linear(4096, 512) + self.fc2 = nn.Linear(512, 512) + self.fc3 = nn.Linear(512, 2) + + def forward(self, x): + x = self.conv1(x) + x = fn.max_pool2d(x, kernel_size=2) + x = fn.relu(x) + + x = self.conv2(x) + x = fn.max_pool2d(x, kernel_size=2) + x = fn.relu(x) + + x = self.conv3(x) + x = fn.relu(x) + + x = self.conv4(x) + x = fn.relu(x) + + x = self.conv5(x) + x = fn.max_pool2d(x, kernel_size=2) + x = fn.relu(x) + + x = self.conv6(x) + x = fn.relu(x) + + x = self.conv7(x) + x = fn.relu(x) + + x = x.view(-1, 4096) + + x = self.fc1(x) + x = fn.relu(x) + + x = self.fc2(x) + x = fn.relu(x) + + x = self.fc3(x) + + return x + +###################################################################### + def nb_errors(model, data_set): ne = 0 for b in range(0, data_set.nb_batches): @@ -385,7 +440,7 @@ else: ######################################## model_class = None -for m in [ AfrozeShallowNet, AfrozeDeepNet, DeepNet2 ]: +for m in [ AfrozeShallowNet, AfrozeDeepNet, DeepNet2, DeepNet3 ]: if args.model == m.name: model_class = m break @@ -415,7 +470,6 @@ for problem_number in map(int, args.problems.split(',')): ################################################## # Tries to load the model - need_to_train = False try: model_state_dict, nb_epochs_done = torch.load(model_filename) model.load_state_dict(model_state_dict) @@ -469,7 +523,7 @@ for problem_number in map(int, args.problems.split(',')): ################################################## # Test if necessary - if need_to_train or args.test_loaded_models: + if nb_epochs_done < args.nb_epochs or args.test_loaded_models: t = time.time() -- 2.20.1 From 349b55a2d9ca213718df8941058d42689ba68163 Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Sun, 25 Jun 2017 09:57:29 +0200 Subject: [PATCH 13/16] Added DeepNet3. --- cnn-svrt.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cnn-svrt.py b/cnn-svrt.py index cb94184..8baaacb 100755 --- a/cnn-svrt.py +++ b/cnn-svrt.py @@ -268,17 +268,17 @@ class DeepNet3(nn.Module): name = 'deepnet3' def __init__(self): - super(DeepNet2, self).__init__() + super(DeepNet3, self).__init__() self.conv1 = nn.Conv2d( 1, 32, kernel_size=7, stride=4, padding=3) - self.conv2 = nn.Conv2d( 32, 256, kernel_size=5, padding=2) - self.conv3 = nn.Conv2d(256, 256, kernel_size=3, padding=1) - self.conv4 = nn.Conv2d(256, 256, kernel_size=3, padding=1) - self.conv5 = nn.Conv2d(256, 256, kernel_size=3, padding=1) - self.conv6 = nn.Conv2d(256, 256, kernel_size=3, padding=1) - self.conv7 = nn.Conv2d(256, 256, kernel_size=3, padding=1) - self.fc1 = nn.Linear(4096, 512) - self.fc2 = nn.Linear(512, 512) - self.fc3 = nn.Linear(512, 2) + self.conv2 = nn.Conv2d( 32, 128, kernel_size=5, padding=2) + self.conv3 = nn.Conv2d(128, 128, kernel_size=3, padding=1) + self.conv4 = nn.Conv2d(128, 128, kernel_size=3, padding=1) + self.conv5 = nn.Conv2d(128, 128, kernel_size=3, padding=1) + self.conv6 = nn.Conv2d(128, 128, kernel_size=3, padding=1) + self.conv7 = nn.Conv2d(128, 128, kernel_size=3, padding=1) + self.fc1 = nn.Linear(2048, 256) + self.fc2 = nn.Linear(256, 256) + self.fc3 = nn.Linear(256, 2) def forward(self, x): x = self.conv1(x) @@ -305,7 +305,7 @@ class DeepNet3(nn.Module): x = self.conv7(x) x = fn.relu(x) - x = x.view(-1, 4096) + x = x.view(-1, 2048) x = self.fc1(x) x = fn.relu(x) -- 2.20.1 From 1ae0133746fd78a916ac540475c64a0e5fccd3e4 Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Sun, 25 Jun 2017 10:25:16 +0200 Subject: [PATCH 14/16] Added the logging of signal interruptions. --- cnn-svrt.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/cnn-svrt.py b/cnn-svrt.py index 8baaacb..ade87ce 100755 --- a/cnn-svrt.py +++ b/cnn-svrt.py @@ -24,8 +24,10 @@ import time import argparse import math + import distutils.util import re +import signal from colorama import Fore, Back, Style @@ -127,7 +129,24 @@ def log_string(s, remark = ''): log_file.write(re.sub(' ', '_', time.ctime()) + ' ' + elapsed + ' ' + s + '\n') log_file.flush() - print(Fore.BLUE + time.ctime() + ' ' + Fore.GREEN + elapsed + Style.RESET_ALL + ' ' + s + Fore.CYAN + remark + Style.RESET_ALL) + print(Fore.BLUE + time.ctime() + ' ' + Fore.GREEN + elapsed \ + + Style.RESET_ALL + + ' ' \ + + s + Fore.CYAN + remark \ + + Style.RESET_ALL) + +###################################################################### + +def handler_sigint(signum, frame): + log_string('got sigint') + exit(0) + +def handler_sigterm(signum, frame): + log_string('got sigterm') + exit(0) + +signal.signal(signal.SIGINT, handler_sigint) +signal.signal(signal.SIGTERM, handler_sigterm) ###################################################################### -- 2.20.1 From ffe0b4fed11bb356684d9faa1849c86997a3029a Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Mon, 26 Jun 2017 15:40:52 +0200 Subject: [PATCH 15/16] Added --save_test_mistakes. --- cnn-svrt.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/cnn-svrt.py b/cnn-svrt.py index ade87ce..3fe50d8 100755 --- a/cnn-svrt.py +++ b/cnn-svrt.py @@ -85,6 +85,9 @@ parser.add_argument('--compress_vignettes', type = distutils.util.strtobool, default = 'True', help = 'Use lossless compression to reduce the memory footprint') +parser.add_argument('--save_test_mistakes', + type = distutils.util.strtobool, default = 'False') + parser.add_argument('--model', type = str, default = 'deepnet', help = 'What model to use') @@ -338,7 +341,7 @@ class DeepNet3(nn.Module): ###################################################################### -def nb_errors(model, data_set): +def nb_errors(model, data_set, mistake_filename_pattern = None): ne = 0 for b in range(0, data_set.nb_batches): input, target = data_set.get_batch(b) @@ -348,6 +351,12 @@ def nb_errors(model, data_set): for i in range(0, data_set.batch_size): if wta_prediction[i] != target[i]: ne = ne + 1 + if mistake_filename_pattern is not None: + img = input[i].clone() + img.sub_(img.min()) + img.div_(img.max()) + torchvision.utils.save_image(img, + mistake_filename_pattern.format(b + i, target[i])) return ne @@ -550,7 +559,8 @@ for problem_number in map(int, args.problems.split(',')): args.nb_test_samples, args.batch_size, cuda = torch.cuda.is_available()) - nb_test_errors = nb_errors(model, test_set) + nb_test_errors = nb_errors(model, test_set, + mistake_filename_pattern = 'mistake_{:d}_{:06d}.png') log_string('test_error {:d} {:.02f}% {:d} {:d}'.format( problem_number, -- 2.20.1 From 3bdc76191e8d7a15648cc3602b18438c98fcb100 Mon Sep 17 00:00:00 2001 From: Francois Fleuret Date: Mon, 26 Jun 2017 15:46:03 +0200 Subject: [PATCH 16/16] Update. --- cnn-svrt.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cnn-svrt.py b/cnn-svrt.py index 3fe50d8..0091aba 100755 --- a/cnn-svrt.py +++ b/cnn-svrt.py @@ -355,9 +355,9 @@ def nb_errors(model, data_set, mistake_filename_pattern = None): img = input[i].clone() img.sub_(img.min()) img.div_(img.max()) - torchvision.utils.save_image(img, - mistake_filename_pattern.format(b + i, target[i])) - + filename = mistake_filename_pattern.format(b + i, target[i]) + torchvision.utils.save_image(img, filename) + print(Fore.RED + 'Wrote ' + filename + Style.RESET_ALL) return ne ###################################################################### @@ -560,7 +560,7 @@ for problem_number in map(int, args.problems.split(',')): cuda = torch.cuda.is_available()) nb_test_errors = nb_errors(model, test_set, - mistake_filename_pattern = 'mistake_{:d}_{:06d}.png') + mistake_filename_pattern = 'mistake_{:06d}_{:d}.png') log_string('test_error {:d} {:.02f}% {:d} {:d}'.format( problem_number, -- 2.20.1