Example #1
0
 def task(self,
          trainable_config: dict,
          metric: str,
          trainable_class: Union[str, tune.Trainable] = DicommlTrainable,
          mode: str = 'min',
          scheduler_class: Union[str, None] = None,
          scheduler_config: Union[dict, None] = None,
          scheduler: Union[tune.schedulers.trial_scheduler.TrialScheduler,
                           None] = None,
          **kwargs):
     if isinstance(trainable_class, str):
         Trainable = dicomml_resolve(trainable_class)
     else:
         Trainable = trainable_class
     if isinstance(scheduler_class, str):
         scheduler = dicomml_resolve(scheduler_class)(**scheduler_config)
     analysis = tune.run(run_or_experiment=Trainable,
                         config=trainable_config,
                         scheduler=scheduler,
                         checkpoint_at_end=True,
                         **kwargs)
     best_trial = analysis.get_best_trial(metric=metric, mode=mode)
     checkpoint = analysis.get_best_checkpoint(trial=best_trial, mode=mode)
     self.logger.info('Best trial is checkpointed at {checkpoint} \
          and has config {config}'.format(checkpoint=checkpoint,
                                          config=str(best_trial.config)))
     return dict(best_checkpoint=checkpoint)
Example #2
0
def run_task(name: Union[str, None] = None,
             task_class: Union[str, DicommlTask] = DicommlTask,
             config: Union[dict, None] = None,
             parallel_configs: Union[List[dict], None] = None) -> dict:
    if isinstance(task_class, str):
        Task = dicomml_resolve(task_class)
    else:
        Task = task_class
    if parallel_configs is not None:
        parallel_configs = {
            '{name}-{i}'.format(name=name, i=i): {
                **config,
                **cfg
            }
            for i, cfg in enumerate(parallel_configs)
        }
        tasks = [
            ray.remote(Task).options(name=name).remote(name=name, config=cfg)
            for name, cfg in parallel_configs.items()
        ]
        results = ray.get([task.run.remote() for task in tasks])
    else:
        results = [Task(config=config).run()]
    # combine results
    return {key: val for res in results for key, val in res.items()}
Example #3
0
 def __init__(self,
              path: str = '.',
              transformations: dict = dict(),
              **kwargs):
     import glob
     self.files = [
         _f for _f in glob.glob(path, recursive=True)
         if os.path.isfile(_f)]
     self.transformations = [
         dicomml_resolve(kind)(**cfg)
         for kind, cfg in transformations.items()]
     self.export_kwargs = kwargs
Example #4
0
 def setup_training(self,
                    loss_function: Tuple[str, dict],
                    eval_metrics: Dict[str, dict],
                    model_class: str,
                    optimizer_class: str,
                    model_config: dict = dict(),
                    prediction_target: str = 'class',
                    treshold_value: float = 0.5,
                    **kwargs):
     # setup metrics
     _class, _config = loss_function
     if 'weight' in _config.keys():
         _config['weight'] = torch.Tensor(_config['weight']).to(self.device)
     self.loss = dicomml_resolve(_class, prefix='torch')(**_config)
     self.eval_metrics = {
         key: partial(dicomml_resolve(key, prefix='sklearn.metrics'), **cfg)
         for key, cfg in eval_metrics.items()}
     # setup model
     self.model = dicomml_resolve(model_class)(**{
         **model_config,
         **{k[6:]: v for k, v in kwargs.items() if 'model_' in k}})
     self.model.to(self.device)
     # setup optimizer
     self.optimizer = dicomml_resolve(optimizer_class, prefix='torch')(
         self.model.parameters(),
         **{key[10:]: val for key, val in kwargs.items()
            if 'optimizer_' in key})
     # setup logits transformation layer
     if prediction_target == 'class':
         self.logits_layer = torch.nn.Softmax(dim=1)
         self.predict = lambda prob: np.argmax(prob, axis=1)
     elif prediction_target == 'labels':
         self.logits_layer = torch.nn.Sigmoid()
         self.predict = lambda prob: np.where(prob > treshold_value, 0, 1)
     if prediction_target == 'class_probabilities':
         self.logits_layer = torch.nn.Softmax(dim=1)
         self.predict = lambda prob: prob
     elif prediction_target == 'label_probabilities':
         self.logits_layer = torch.nn.Sigmoid()
         self.predict = lambda prob: prob
Example #5
0
 def __init__(self,
              base_transform: Union[Type[ArrayTransform], str],
              base_config: dict = dict(),
              value_ranges: Dict[str, tuple] = dict(),
              n_applications: int = 1,
              **kwargs):
     if isinstance(base_transform, str):
         Transform = dicomml_resolve(base_transform)
     else:
         Transform = base_transform
     transform_configs = []
     for _ in range(n_applications):
         random_config = {
             key: np.random.uniform(low=val[0], high=val[1])
             for key, val in value_ranges.items()}
         transform_configs.append({
             **base_config,
             **random_config})
     self.random_instances = [
         Transform(**cfg) for cfg in transform_configs]
Example #6
0
    def task(self,
             filenames: Union[List[str], None] = None,
             num_concurrent_files: Union[int, None] = None,
             folder_in: Union[str, None] = None,
             filename_pattern: str = '*.zip',
             load_config: dict = dict(),
             steps: Dict[str, dict] = dict(),
             folder_out: str = './out',
             save_config: dict = dict()):
        from dicomml.transforms.io import Save, Load
        # construct transforms
        transforms = []
        for kind, config in steps.items():
            if isinstance(kind, str):
                Task = dicomml_resolve(kind)
            else:
                Task = kind
            transforms.append(Task(**config))
        # load
        if filenames is None:
            filenames = glob.glob(os.path.join(folder_in, filename_pattern))
        if num_concurrent_files is None:
            num_concurrent_files = len(filenames)

        def shards():
            for i in range(0, len(filenames), num_concurrent_files):
                yield filenames[i:i + num_concurrent_files]

        results = {}
        for files in shards():
            cases = Load(**load_config)(files=files)
            # transform
            for transform in transforms:
                cases = transform(cases)
            # save
            files = Save(**save_config)(cases=cases, folder=folder_out)
            results.update(files)
        return results