type = str, default = 'train.log')
parser.add_argument('--download',
- type = bool, default = False)
+ action='store_true', default = False)
parser.add_argument('--seed',
type = int, default = 0)
type = float, default = 0.1)
parser.add_argument('--synthesis_sampling',
- type = bool, default = True)
+ action='store_true', default = True)
+
+parser.add_argument('--checkpoint_name',
+ type = str, default = 'checkpoint.pth')
+
+parser.add_argument('--picoclvr_many_colors',
+ action='store_true', default = False)
######################################################################
class TaskPicoCLVR(Task):
- def __init__(self, batch_size, height = 6, width = 8, device = torch.device('cpu')):
+ def __init__(self, batch_size,
+ height = 6, width = 8, many_colors = False,
+ device = torch.device('cpu')):
+
self.batch_size = batch_size
self.device = device
nb = args.data_size if args.data_size > 0 else 250000
- descr = picoclvr.generate(nb, height = height, width = width)
+ descr = picoclvr.generate(
+ nb,
+ height = height, width = width,
+ many_colors = many_colors
+ )
+
descr = [ s.strip().split(' ') for s in descr ]
l = max([ len(s) for s in descr ])
descr = [ s + [ '<unk>' ] * (l - len(s)) for s in descr ]
elif args.data == 'mnist':
task = TaskMNIST(batch_size = args.batch_size, device = device)
elif args.data == 'picoclvr':
- task = TaskPicoCLVR(batch_size = args.batch_size, device = device)
+ task = TaskPicoCLVR(batch_size = args.batch_size, many_colors = args.picoclvr_many_colors, device = device)
else:
raise ValueError(f'Unknown dataset {args.data}.')
nb_heads = args.nb_heads, nb_blocks = args.nb_blocks, dropout = args.dropout
)
+model.to(device)
+
nb_parameters = sum(p.numel() for p in model.parameters())
log_string(f'nb_parameters {nb_parameters} ({int(nb_parameters/1e6)}M)')
-model.to(device)
-
######################################################################
if args.optim == 'sgd':
else:
raise ValueError(f'Unknown optimizer {args.optim}.')
-for k in range(args.nb_epochs):
+######################################################################
+
+nb_epochs_finished = 0
+
+try:
+ checkpoint = torch.load(args.checkpoint_name, map_location = device)
+ nb_epochs_finished = checkpoint['nb_epochs_finished']
+ model.load_state_dict(checkpoint['model_state'])
+ optimizer.load_state_dict(checkpoint['optimizer_state'])
+ print(f'Checkpoint loaded with {nb_epochs_finished} epochs finished.')
+
+except FileNotFoundError:
+ print('Starting from scratch.')
+
+except:
+ print('Error when loading the checkpoint.')
+ exit(1)
+
+######################################################################
+
+for k in range(nb_epochs_finished, args.nb_epochs):
model.train()
task.produce_results(k, model)
+ checkpoint = {
+ 'nb_epochs_finished': k + 1,
+ 'model_state': model.state_dict(),
+ 'optimizer_state': optimizer.state_dict()
+ }
+
+ torch.save(checkpoint, args.checkpoint_name)
+
######################################################################