def test_serialization(self): from inferno.trainers.basic import Trainer import os # Make model net = self._make_test_model() # Make trainer trainer = Trainer(model=net) \ .build_optimizer('Adam') \ .build_criterion('CrossEntropyLoss') \ .build_metric('CategoricalError') \ .validate_every((1, 'epochs')) \ .save_every((1, 'epochs'), to_directory=os.path.join(self.ROOT_DIR, 'saves')) \ .save_at_best_validation_score() \ .set_max_num_epochs(2) # Try to serialize trainer.save() # Try to unserialize trainer = Trainer(net).save_to_directory( os.path.join(self.ROOT_DIR, 'saves')).load() # Make sure everything survived (especially the logger) self.assertEqual(trainer._logger.__class__.__name__, 'BasicTensorboardLogger')
def set_up_training(project_directory, config, data_config, load_pretrained_model): # Get model if load_pretrained_model: model = Trainer().load(from_directory=project_directory, filename='Weights/checkpoint.pytorch').model else: model_name = config.get('model_name') model = getattr(models, model_name)(**config.get('model_kwargs')) criterion = SorensenDiceLoss() loss_train = LossWrapper(criterion=criterion, transforms=Compose(ApplyAndRemoveMask(), InvertTarget())) loss_val = LossWrapper(criterion=criterion, transforms=Compose(RemoveSegmentationFromTarget(), ApplyAndRemoveMask(), InvertTarget())) # Build trainer and validation metric logger.info("Building trainer.") smoothness = 0.95 offsets = data_config['volume_config']['segmentation']['affinity_config'][ 'offsets'] metric = ArandErrorFromMulticut(average_slices=False, use_2d_ws=True, n_threads=8, weight_edges=True, offsets=offsets) trainer = Trainer(model)\ .save_every((1000, 'iterations'), to_directory=os.path.join(project_directory, 'Weights'))\ .build_criterion(loss_train)\ .build_validation_criterion(loss_val)\ .build_optimizer(**config.get('training_optimizer_kwargs'))\ .evaluate_metric_every('never')\ .validate_every((100, 'iterations'), for_num_iterations=1)\ .register_callback(SaveAtBestValidationScore(smoothness=smoothness, verbose=True))\ .build_metric(metric)\ .register_callback(AutoLR(factor=0.98, patience='100 iterations', monitor_while='validating', monitor_momentum=smoothness, consider_improvement_with_respect_to='previous'))\ .register_callback(GarbageCollection()) logger.info("Building logger.") # Build logger tensorboard = TensorboardLogger( log_scalars_every=(1, 'iteration'), log_images_every=(100, 'iterations'), log_histograms_every='never').observe_states( ['validation_input', 'validation_prediction, validation_target'], observe_while='validating') trainer.build_logger(tensorboard, log_directory=os.path.join(project_directory, 'Logs')) return trainer
def test_save(self): from inferno.trainers.basic import Trainer trainer = Trainer().save_to_directory( to_directory=self.ROOT_DIR, checkpoint_filename='dummy.pytorch') trainer.save() # Instantiate new trainer and load trainer = Trainer().load(from_directory=self.ROOT_DIR, filename='dummy.pytorch')
def set_up_training(project_directory, config, data_config, criterion, balance, load_pretrained_model): # Get model if load_pretrained_model: model = Trainer().load(from_directory=project_directory, filename='Weights/checkpoint.pytorch').model else: model_name = config.get('model_name') model = getattr(models, model_name)(**config.get('model_kwargs')) # TODO logger.info("Using criterion: %s" % criterion) # TODO this should go somewhere more prominent affinity_offsets = data_config['volume_config']['segmentation'][ 'affinity_offsets'] # TODO implement affinities on gpu again ?! criterion = CRITERIA[criterion] loss = LossWrapper( criterion=criterion(), transforms=Compose(MaskTransitionToIgnoreLabel(affinity_offsets), RemoveSegmentationFromTarget(), InvertTarget()), weight_function=BalanceAffinities( ignore_label=0, offsets=affinity_offsets) if balance else None) # Build trainer and validation metric logger.info("Building trainer.") smoothness = 0.95 # use multicut pipeline for validation metric = ArandErrorFromSegmentationPipeline( local_affinity_multicut_from_wsdt2d(n_threads=10, time_limit=120)) trainer = Trainer(model)\ .save_every((1000, 'iterations'), to_directory=os.path.join(project_directory, 'Weights'))\ .build_criterion(loss)\ .build_optimizer(**config.get('training_optimizer_kwargs'))\ .evaluate_metric_every('never')\ .validate_every((100, 'iterations'), for_num_iterations=1)\ .register_callback(SaveAtBestValidationScore(smoothness=smoothness, verbose=True))\ .build_metric(metric)\ .register_callback(AutoLR(factor=0.98, patience='100 iterations', monitor_while='validating', monitor_momentum=smoothness, consider_improvement_with_respect_to='previous')) logger.info("Building logger.") # Build logger tensorboard = TensorboardLogger( log_scalars_every=(1, 'iteration'), log_images_every=(100, 'iterations')).observe_states( ['validation_input', 'validation_prediction, validation_target'], observe_while='validating') trainer.build_logger(tensorboard, log_directory=os.path.join(project_directory, 'Logs')) return trainer
def set_up_training(project_directory, config, data_config, load_pretrained_model): # Get model if load_pretrained_model: model = Trainer().load(from_directory=project_directory, filename='Weights/checkpoint.pytorch').model else: model_name = config.get('model_name') model = getattr(models, model_name)(**config.get('model_kwargs')) affinity_offsets = data_config['volume_config']['segmentation'][ 'affinity_offsets'] loss = MultiOutputLossWrapper( criterion=SorensenDiceLoss(), transforms=Compose(MaskTransitionToIgnoreLabel(affinity_offsets), RemoveSegmentationFromTarget(), InvertTarget())) # Build trainer and validation metric logger.info("Building trainer.") smoothness = 0.95 # use multicut pipeline for validation # metric = ArandErrorFromSegmentationPipeline(local_affinity_multicut_from_wsdt2d(n_threads=10, # time_limit=120)) # use damws for validation stride = [2, 10, 10] metric = ArandErrorFromSegmentationPipeline( DamWatershed(affinity_offsets, stride, randomize_bounds=False)) trainer = Trainer(model)\ .save_every((1000, 'iterations'), to_directory=os.path.join(project_directory, 'Weights'))\ .build_criterion(loss)\ .build_optimizer(**config.get('training_optimizer_kwargs'))\ .evaluate_metric_every('never')\ .validate_every((100, 'iterations'), for_num_iterations=1)\ .register_callback(SaveAtBestValidationScore(smoothness=smoothness, verbose=True))\ .build_metric(metric)\ .register_callback(AutoLR(factor=0.98, patience='100 iterations', monitor_while='validating', monitor_momentum=smoothness, consider_improvement_with_respect_to='previous')) # FIXME some issues with conda tf for torch0.3 env # logger.info("Building logger.") # # Build logger # tensorboard = TensorboardLogger(log_scalars_every=(1, 'iteration'), # log_images_every=(100, 'iterations')).observe_states( # ['validation_input', 'validation_prediction, validation_target'], # observe_while='validating' # ) # trainer.build_logger(tensorboard, log_directory=os.path.join(project_directory, 'Logs')) return trainer
def test_serialization(self): trainer = Trainer()\ .build_logger(logger=DummyLogger())\ .save_to_directory(join(self.ROOT, 'saves')) trainer.save() # Unserialize trainer = Trainer().load(from_directory=join(self.ROOT, 'saves')) # Check if the loggers are consistent logger_from_trainer = trainer._logger logger_from_callback_engine = \ next(iter(trainer.callbacks._callback_registry['end_of_training_iteration'])) self.assertIs(logger_from_trainer, logger_from_callback_engine) self.assertIs(logger_from_callback_engine.trainer, trainer)
def set_up_training(project_directory, config, data_config, load_pretrained_model, max_iters): # Get model if load_pretrained_model: model = Trainer().load(from_directory=project_directory, filename='Weights/checkpoint.pytorch').model else: model_name = config.get('model_name') model = getattr(models, model_name)(**config.get('model_kwargs')) loss = LossWrapper(criterion=SorensenDiceLoss(), transforms=Compose(MaskIgnoreLabel(), RemoveSegmentationFromTarget())) # TODO loss transforms: # - Invert Target ??? # Build trainer and validation metric logger.info("Building trainer.") # smoothness = 0.95 # TODO set up validation ?! trainer = Trainer(model)\ .save_every((1000, 'iterations'), to_directory=os.path.join(project_directory, 'Weights'))\ .build_criterion(loss)\ .build_optimizer(**config.get('training_optimizer_kwargs'))\ .evaluate_metric_every('never')\ .register_callback(ManualLR(decay_specs=[((k * 100, 'iterations'), 0.99) for k in range(1, max_iters // 100)])) # .validate_every((100, 'iterations'), for_num_iterations=1)\ # .register_callback(SaveAtBestValidationScore(smoothness=smoothness, verbose=True))\ # .build_metric(metric)\ # .register_callback(AutoLR(factor=0.98, # patience='100 iterations', # monitor_while='validating', # monitor_momentum=smoothness, # consider_improvement_with_respect_to='previous')) logger.info("Building logger.") # Build logger tensorboard = TensorboardLogger( log_scalars_every=(1, 'iteration'), log_images_every=(100, 'iterations')) # .observe_states( # ['validation_input', 'validation_prediction, validation_target'], # observe_while='validating' # ) trainer.build_logger(tensorboard, log_directory=os.path.join(project_directory, 'Logs')) return trainer
def train_model(args): """ Performs the training """ if os.path.exists( os.path.join(args.save_directory, Trainer()._checkpoint_filename)): # Skip training if checkpoint exists return model = WsjModel(args) kwargs = { 'num_workers': args.num_workers, 'pin_memory': True } if args.cuda else {} train_loader = DataLoader(WsjDataset('train', args), shuffle=True, batch_size=args.batch_size, collate_fn=wsj_collate_fn, **kwargs) validate_loader = DataLoader(WsjDataset('dev', args), shuffle=True, batch_size=args.batch_size, collate_fn=wsj_collate_fn, **kwargs) # Build trainer trainer = Trainer(model) \ .build_criterion(ctc_loss()) \ .build_metric(ctc_loss()) \ .build_optimizer('Adam') \ .validate_every((1, 'epochs')) \ .save_every((1, 'epochs')) \ .save_to_directory(args.save_directory) \ .set_max_num_epochs(args.epochs) \ #.build_logger(TensorboardLogger(log_scalars_every=(1, 'iteration'), #log_images_every='never'), #log_directory=args.save_directory) # Bind loaders trainer.bind_loader('train', train_loader, num_inputs=3) trainer.bind_loader('validate', validate_loader, num_inputs=3) trainer.register_callback(EpochTimer()) if args.cuda: trainer.cuda() # Go! trainer.fit() trainer.save()
def set_up_training(project_directory, config, data_config, load_pretrained_model): # Get model if load_pretrained_model: model = Trainer().load(from_directory=project_directory, filename='Weights/checkpoint.pytorch').model else: model_name = config.get('model_name') model = getattr(models, model_name)(**config.get('model_kwargs')) loss = dice_loss() loss_val = dice_loss(is_val=True) metric = mws_metric() # metric = loss_val # Build trainer and validation metric logger.info("Building trainer.") smoothness = 0.9 trainer = Trainer(model)\ .save_every((1000, 'iterations'), to_directory=os.path.join(project_directory, 'Weights'))\ .build_criterion(loss)\ .build_validation_criterion(loss_val)\ .build_optimizer(**config.get('training_optimizer_kwargs'))\ .evaluate_metric_every('never')\ .validate_every((100, 'iterations'), for_num_iterations=5)\ .register_callback(SaveAtBestValidationScore(smoothness=smoothness, verbose=True))\ .build_metric(metric)\ .register_callback(AutoLR(factor=0.98, patience='100 iterations', monitor_while='validating', monitor_momentum=smoothness, consider_improvement_with_respect_to='previous'))\ .register_callback(GarbageCollection())\ logger.info("Building logger.") # Build logger tensorboard = TensorboardLogger( log_scalars_every=(1, 'iteration'), log_images_every=(100, 'iterations'), log_histograms_every='never').observe_states( ['validation_input', 'validation_prediction, validation_target'], observe_while='validating') trainer.build_logger(tensorboard, log_directory=os.path.join(project_directory, 'Logs')) return trainer
def test_multi_gpu(self): import torch if not torch.cuda.is_available(): return from inferno.trainers.basic import Trainer from inferno.io.box.cifar10 import get_cifar10_loaders import os # Make model net = self._make_test_model() # Make trainer trainer = Trainer(model=net) \ .build_optimizer('Adam') \ .build_criterion('CrossEntropyLoss') \ .build_metric('CategoricalError') \ .validate_every((1, 'epochs')) \ .save_every((1, 'epochs'), to_directory=os.path.join(self.ROOT_DIR, 'saves')) \ .save_at_best_validation_score() \ .set_max_num_epochs(2)\ .cuda(devices=[0, 1, 2, 3]) train_loader, validate_loader = get_cifar10_loaders( root_directory=self.ROOT_DIR, download=True) trainer.bind_loader('train', train_loader) trainer.bind_loader('validate', validate_loader) trainer.fit()
def train_model(model, train_dataset, valid_dataset, args): kw = {'num_workers': 2, 'pin_memory': True} if args.cuda else {} train_loader = DataLoader(dataset=train_dataset, batch_size=args.batch_size, shuffle=True, **kw) validate_loader = DataLoader(dataset=valid_dataset, batch_size=args.batch_size, **kw) trainer = Trainer(model) \ .build_criterion(CrossEntropyLoss3D) \ .build_metric(CategoricalError3D) \ .build_optimizer('Adam', weight_decay=1e-6) \ .save_every((1, 'epochs')) \ .validate_every((100, 'iteration')) \ .save_to_directory(args.save_directory) \ .set_max_num_epochs(args.epochs) \ .build_logger( TensorboardLogger(log_scalars_every=(1, 'iteration'), log_images_every='never'), log_directory='tb_log/' ) \ .bind_loader('train', train_loader) \ .bind_loader('validate', validate_loader) if args.cuda: trainer.cuda() # Go! trainer.fit()
def train_model(args): model = MNISTCNNModel() train_loader, validate_loader = mnist_data_loaders(args) # Build trainer trainer = Trainer(model) \ .build_criterion('CrossEntropyLoss') \ .build_metric('CategoricalError') \ .build_optimizer('Adam') \ .validate_every((2, 'epochs')) \ .save_every((5, 'epochs')) \ .save_to_directory(args.save_directory) \ .set_max_num_epochs(args.epochs) \ .build_logger(TensorboardLogger(log_scalars_every=(1, 'iteration'), log_images_every='never'), log_directory=args.save_directory) # Bind loaders trainer \ .bind_loader('train', train_loader) \ .bind_loader('validate', validate_loader) if args.cuda: trainer.cuda() # Go! trainer.fit()
def test_cifar(self): from inferno.trainers.basic import Trainer from inferno.io.box.cifar10 import get_cifar10_loaders # Build cifar10 loaders trainloader, testloader = get_cifar10_loaders( root_directory=join(self.ROOT_DIR, 'data'), download=self.DOWNLOAD_CIFAR) # Make model net = self._make_test_model() tic = time.time() # Make trainer trainer = Trainer(model=net)\ .build_optimizer('Adam')\ .build_criterion('CrossEntropyLoss')\ .build_metric('CategoricalError')\ .validate_every((1, 'epochs'))\ .save_every((1, 'epochs'), to_directory=join(self.ROOT_DIR, 'saves'))\ .save_at_best_validation_score()\ .set_max_num_epochs(2) # Bind trainer to datasets trainer.bind_loader('train', trainloader).bind_loader('validate', testloader) # Check device and fit if self.CUDA: if self.HALF_PRECISION: trainer.cuda().set_precision('half').fit() else: trainer.cuda().fit() else: trainer.fit() toc = time.time() print("[*] Elapsed time: {} seconds.".format(toc - tic))
def setUp(self): # Build model net = self._make_test_model() # Build trainer self.trainer = Trainer(net)\ .build_logger(TensorboardLogger(send_image_at_batch_indices=0, send_image_at_channel_indices='all', log_images_every=(20, 'iterations')), log_directory=os.path.join(self.ROOT_DIR, 'logs'))\ .build_criterion('CrossEntropyLoss')\ .build_metric('CategoricalError')\ .build_optimizer('Adam')\ .validate_every((1, 'epochs'))\ .save_every((2, 'epochs'), to_directory=os.path.join(self.ROOT_DIR, 'saves'))\ .save_at_best_validation_score()\ .set_max_num_epochs(2)\ .cuda().set_precision(self.PRECISION) # Load CIFAR10 data train_loader, test_loader = \ get_cifar10_loaders(root_directory=os.path.join(self.ROOT_DIR, 'data'), download=self.DOWNLOAD_CIFAR) # Bind loaders self.trainer.bind_loader('train', train_loader).bind_loader('validate', test_loader)
def __init__(self, model_path, halo, gpu=0, use_best=True, prep_model=None, **augmentation_kwargs): # load the model and prep it if specified assert os.path.exists(model_path), model_path trainer = Trainer().load(from_directory=model_path, best=use_best) self.model = trainer.model.cuda(gpu) self.model.eval() if prep_model is not None: self.model = prep_model(self.model) self.gpu = gpu self.halo = halo self.lock = threading.Lock() # build the test-time-augmenter if we have augmentation kwargs if augmentation_kwargs: assert TestTimeAugmenter is not None, "Need neurofire for test-time-augmentation" self.offsets = augmentation_kwargs.pop('offsets', None) print(augmentation_kwargs) self.augmenter = self.build_augmenter(**augmentation_kwargs) else: self.augmenter = None
def run(args): dataset = AlderleyWrapper() save_args(args) # save command line to a file for reference train_loader = alderley_cgan_data_loader(args, dataset=dataset) # get the data model = CGANModel( args, discriminators=[PixelDiscriminator(), patchCDiscriminatorNetwork(args)], generator=UnetUpsample()) # Build trainer trainer = Trainer(model) trainer.build_criterion(CWGANDiscriminatorLoss(penalty_weight=args.penalty_weight, model=model)) trainer.build_optimizer('Adam', [parameter for discriminator in model.discriminators for parameter in discriminator.parameters()], lr=args.discriminator_lr) trainer.save_every((1, 'epochs')) trainer.save_to_directory(args.save_directory) trainer.set_max_num_epochs(args.epochs) trainer.register_callback(CGenerateDataCallback(args, dataset=dataset)) trainer.register_callback(CGeneratorTrainingCallback( args, parameters=model.generator.parameters(), criterion=WGANGeneratorLoss(), dataset=dataset)) trainer.bind_loader('train', train_loader, num_inputs=2) # Custom logging configuration so it knows to log our images if args.cuda: trainer.cuda() # Go! trainer.fit()
def train_model(args): model = model_fn() train_loader, validate_loader = mnist_data_loaders(args) # Build trainer trainer = Trainer(model) \ .build_criterion('RegularizedCrossEntropyLoss') \ .build_metric('CategoricalError') \ .build_optimizer('Adam') \ .validate_every((1, 'epochs')) \ .save_every((1, 'epochs')) \ .save_to_directory(args.save_directory) \ .set_max_num_epochs(args.epochs) \ .build_logger(TensorboardLogger(log_scalars_every=(1, 'iteration'), log_images_every='never'), log_directory=args.save_directory) # Record regularization losses trainer.logger.observe_training_and_validation_states([ 'main_loss', 'total_regularization_loss', 'activity_regularization', 'l1_weight_regularization' ]) # Bind loaders trainer \ .bind_loader('train', train_loader) \ .bind_loader('validate', validate_loader) if args.cuda: trainer.cuda() # Go! trainer.fit()
def predict(project_folder, sample, only_nn_channels=True): gpu = 0 checkpoint = os.path.join(project_folder, 'Weights') data_config_file = './template_config/prediction_configs/sample%s.yml' % sample print( "[*] Loading CREMI with Configuration at: {}".format(data_config_file)) # Load CREMI sample cremi = RawVolumeWithDefectAugmentation.from_config(data_config_file) # Load model trainer = Trainer().load(from_directory=checkpoint, best=True).cuda(gpu) model = trainer.model inference_config_file = './template_config/prediction_configs/inference_config.yml' inference_engine = SimpleInferenceEngine.from_config( inference_config_file, model) output = inference_engine.infer(cremi) print("[*] Output has shape {}".format(str(output.shape))) save_folder = os.path.join(project_folder, 'Predictions') if not os.path.exists(save_folder): os.mkdir(save_folder) save_path = os.path.join(save_folder, 'prediction_sample%s.h5' % sample) if only_nn_channels: output = output[:3] save_path = save_path[:-3] + '_nnaffinities.h5' toh5(output.astype('float32'), save_path, compression='lzf')
def train(net, dataset, criterion, num_epochs, batch_size, learn_rate, dir_name): dir_name = os.path.join('net/', dir_name) trainer = Trainer(net[0]) if (os.path.exists(os.path.join(dir_name, 'model.pytorch'))): net_temp = trainer.load_model(dir_name).model net[0].load_state_dict(net_temp.state_dict()) print("Loaded checkpoint directly") else: if (not os.path.exists(dir_name)): os.makedirs(dir_name) data_loader = torch.utils.data.DataLoader(dataset, shuffle=True, batch_size=batch_size) net[0].train() trainer \ .build_criterion(LossPrinter(criterion)) \ .bind_loader('train', data_loader) \ .build_optimizer('Adam', lr=learn_rate) \ .set_max_num_epochs(num_epochs) if torch.cuda.is_available(): trainer.cuda() trainer.fit() trainer.save_model(dir_name) net[0].cpu() net[0].eval()
def train_net_with_inferno(config_dict, net, criterion, optimizer, trainloader, valloader): """ Trains the NeuralNet with inferno :param config_dict: dict with configs :param net: NeuralNet :param criterion: criterion for NN :param optimizer: optimizer for NN :param trainloader: dataloader with traind ata :param valloader: dataloader with validation data """ print("Start training with inferno!") from inferno.trainers.basic import Trainer from inferno.trainers.callbacks.essentials import SaveAtBestValidationScore model_folder = os.path.join(config_dict["project_folder"], "model/") if not os.path.exists(model_folder): os.mkdir(model_folder) trainer = Trainer(net) \ .save_every((1, 'epochs'), to_directory=model_folder) \ .build_criterion(criterion) \ .build_optimizer(optimizer) \ .build_metric(sorensen_dice_metric) \ .evaluate_metric_every('never') \ .validate_every((1, 'epochs'), for_num_iterations=50) \ .register_callback(SaveAtBestValidationScore(smoothness=.5)) trainer.set_max_num_epochs(config_dict['max_train_epochs']) trainer.bind_loader('train', trainloader).bind_loader('validate', valloader) trainer.cuda() trainer.fit()
def test_auto_registry(self): callback_engine = CallbackEngine().bind_trainer(Trainer()) callback_engine.register_callback(DummyCallback()) self.assertIsInstance(next(iter(callback_engine ._callback_registry .get('end_of_training_iteration'))), DummyCallback) with self.assertRaises(AssertionError): callback_engine.register_callback(WrongDummyCallback())
def run(args): model = SpeechModel(args) trainer = Trainer() if os.path.exists( os.path.join(args.save_directory, trainer._checkpoint_filename)): trainer.load(from_directory=args.save_directory) model.load_state_dict(trainer.model.state_dict()) if args.cuda: model = model.cuda() else: train_loader = make_loader('train', args, batch_size=args.batch_size) dev_loader = make_loader('dev', args, batch_size=args.batch_size) # Build trainer trainer = Trainer(model) \ .build_criterion(CTCCriterion, size_average=True) \ .build_optimizer('Adam', weight_decay=1e-7, lr=5e-5) \ .validate_every((1, 'epochs')) \ .save_every((1, 'epochs')) \ .save_to_directory(args.save_directory) \ .set_max_num_epochs(args.epochs) \ .build_logger(TensorboardLogger(log_scalars_every=(1, 'iteration'), log_images_every='never'), log_directory=args.save_directory) # Bind loaders trainer.bind_loader('train', train_loader, num_inputs=3, num_targets=1) trainer.bind_loader('validate', dev_loader, num_inputs=3, num_targets=1) if args.cuda: trainer.cuda() # Go! trainer.fit() trainer.save() test_loader = make_loader('test', args=args, shuffle=False, batch_size=1, test=True) run_logits(loader=test_loader, model=model, args=args)
def train_model(args): """ Perform training then call prediction """ model = all_cnn_module() model.apply(initializer) train_loader, validate_loader, test_loader = make_loaders(args) # Build trainer savepath = os.path.join(args.save_directory, Trainer()._checkpoint_filename) if os.path.exists(savepath): trainer = Trainer().load(from_directory=args.save_directory) if args.cuda: trainer.cuda() else: trainer = Trainer(model) \ .build_criterion('CrossEntropyLoss') \ .build_metric('CategoricalError') \ .save_every((1, 'epochs')) \ .validate_every((1, 'epochs')) \ .save_to_directory(args.save_directory) \ .set_max_num_epochs(args.epochs) \ .build_logger(TensorboardLogger(log_scalars_every=(1, 'iteration'), log_images_every='never'), log_directory=args.save_directory) # These are the params from the paper trainer.build_optimizer('SGD', lr=0.01, momentum=0.9, weight_decay=0.001) # Also works with Adam and default settings # trainer.build_optimizer('Adam') trainer.bind_loader('train', train_loader) trainer.bind_loader('validate', validate_loader) if args.cuda: trainer.cuda() # Go! trainer.fit() trainer.save() write_predictions(args, trainer.model, test_loader)
def __init__(self, model_path, halo, gpu=0, use_best=True, prep_model=None): assert os.path.exists(model_path), model_path trainer = Trainer().load(from_directory=model_path, best=use_best) self.model = trainer.model.cuda(gpu) self.model.eval() if prep_model is not None: self.model = prep_model(self.model) self.gpu = gpu self.halo = halo self.lock = threading.Lock()
def test_serialization(self): trainer = self.get_trainer(3) # Serialize trainer.save() # Unserialize trainer = Trainer().load(os.path.join(self.ROOT_DIR, 'saves')) train_loader, test_loader = self.get_random_dataloaders( input_channels=3) trainer.bind_loader('train', train_loader).bind_loader('validate', test_loader) trainer.fit()
def load_model(args): trainer = Trainer() trainer.load(from_directory=args.load_directory, best=False) # trainer.load(from_directory=args.load_directory, best=False) trainer.set_max_num_epochs(args.epochs + trainer.epoch_count) model = trainer.model trainer.build_logger(TensorboardLogger(log_scalars_every=(1, 'iteration'), log_images_every='never'), log_directory=args.save_directory) trainer.save_to_directory(args.save_directory) return (model, trainer)
def test_multi_gpu_setup(self): from torch.nn import CrossEntropyLoss from inferno.trainers.basic import Trainer # Test base_device = 'cpu' # Build model net = self._make_test_model() # Make dummy criterion criterion = CrossEntropyLoss(weight=torch.rand(10)) # Make trainer trainer = Trainer(net).build_criterion(criterion).cuda( [0, 1], base_device='cpu') self.assertIsInstance(trainer.criterion.weight, torch.FloatTensor) # Test base_device = 'cpu' # Build model net = self._make_test_model() criterion = CrossEntropyLoss(weight=torch.rand(10)) # Make trainer trainer = Trainer(net).build_criterion(criterion).cuda( [0, 1], base_device='cuda') self.assertIsInstance(trainer.criterion.weight, torch.cuda.FloatTensor)
def set_up_training(project_directory, config, data_config): # Get model model_name = config.get('model_name') model = getattr(models, model_name)(**config.get('model_kwargs')) criterion = SorensenDiceLoss() loss_train = LossWrapper(criterion=criterion, transforms=InvertTarget()) loss_val = LossWrapper(criterion=criterion, transforms=Compose(RemoveSegmentationFromTarget(), InvertTarget())) # Build trainer and validation metric logger.info("Building trainer.") smoothness = 0.75 offsets = data_config['volume_config']['segmentation']['affinity_config'][ 'offsets'] strides = [1, 10, 10] metric = ArandErrorFromMWS(average_slices=False, offsets=offsets, strides=strides, randomize_strides=False) trainer = Trainer(model)\ .save_every((1000, 'iterations'), to_directory=os.path.join(project_directory, 'Weights'))\ .build_criterion(loss_train)\ .build_validation_criterion(loss_val)\ .build_optimizer(**config.get('training_optimizer_kwargs'))\ .evaluate_metric_every('never')\ .validate_every((100, 'iterations'), for_num_iterations=1)\ .register_callback(SaveAtBestValidationScore(smoothness=smoothness, verbose=True))\ .build_metric(metric)\ .register_callback(AutoLR(factor=0.99, patience='100 iterations', monitor_while='validating', monitor_momentum=smoothness, consider_improvement_with_respect_to='previous'))\ logger.info("Building logger.") # Build logger tensorboard = TensorboardLogger( log_scalars_every=(1, 'iteration'), log_images_every=(100, 'iterations'), log_histograms_every='never').observe_states( ['validation_input', 'validation_prediction, validation_target'], observe_while='validating') trainer.build_logger(tensorboard, log_directory=os.path.join(project_directory, 'Logs')) return trainer
def __init__(self, model_path, crop=None, gpu=0, use_best=True): from inferno.trainers.basic import Trainer assert os.path.exists(model_path), model_path trainer = Trainer().load(from_directory=model_path, best=use_best) self.model = trainer.model.cuda(gpu) self.gpu = gpu # validate cropping if crop is not None: assert isinstance(crop, (list, tuple)) assert len(crop) == 3 self.crop = crop self.lock = threading.Lock()
def main(args): img_size = 224 train_trans = transforms.Compose([ transforms.RandomResizedCrop(img_size), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) test_trans = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(img_size), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) train_ds = IBMDataset(args.data_dir, transform=train_trans, name='train') train_loader = data.DataLoader(train_ds, batch_size = args.batch_size, shuffle = True) val_ds = IBMDataset(args.data_dir, transform=test_trans, name='val') print(len(val_ds), len(train_ds)) val_loader = data.DataLoader(val_ds, batch_size = args.batch_size, shuffle = True) LOG_DIRECTORY = '../logs/' SAVE_DIRECTORY = '../models/resnet50/' model = ResNet50() trainer = Trainer(model) \ .build_criterion('CrossEntropyLoss') \ .build_metric('CategoricalError') \ .build_optimizer('Adam') \ .validate_every((1, 'epochs')) \ .save_every((1, 'epochs')) \ .save_to_directory(SAVE_DIRECTORY) \ .set_max_num_epochs(args.num_epochs) \ .build_logger(TensorboardLogger(log_scalars_every=(1, 'iteration'), log_images_every='never'), log_directory=LOG_DIRECTORY) # Bind loaders trainer \ .bind_loader('train', train_loader) \ .bind_loader('validate', val_loader) if torch.cuda.is_available(): trainer.cuda() trainer.fit()