コード例 #1
0
    def __getitem__(self, item):
        if torch.is_tensor(item):
            item = item.tolist()

        signal = np.load(self.signal[item], allow_pickle=True)['arr_0']
        noise = np.load(self.noise[randint(0, item)], allow_pickle=True)['arr_0']

        signal = resample(signal, 25500)
        processed = prepare_dataset(noise, signal)
        processed = resample(processed, len(signal))
        noise = resample(noise, len(signal))

        sample = {'signal': signal, 'noise': noise, 'processed': processed}

        f, t, Zxx_processed = stft(processed)
        _, _, Zxx_signal = stft(signal)
        _, _, Zxx_noise = stft(noise)

        Zxx_processed = pol2cart(np.abs(Zxx_processed), np.angle(Zxx_processed))
        Zxx_signal = pol2cart(np.abs(Zxx_signal), np.angle(Zxx_signal))
        Zxx_noise = pol2cart(np.abs(Zxx_noise), np.angle(Zxx_noise))

        Zxx_signal[0] += 1e-10
        Zxx_signal[1] += 1e-10

        Zxx_processed = resample(Zxx_processed, 31, axis=1)
        Zxx_signal = resample(Zxx_signal, 31, axis=1)
        Zxx_noise = resample(Zxx_noise, 31, axis=1)
        f = resample(f, 31)

        # Ms
        signal_mask = 1 / (1 + np.abs(np.sqrt(Zxx_noise[0] ** 2 + Zxx_noise[1] ** 2)) / np.abs(
            np.sqrt(Zxx_signal[0] ** 2 + Zxx_signal[1] ** 2)))

        # Mn
        noise_mask = (np.abs(np.sqrt(Zxx_noise[0] ** 2 + Zxx_noise[1] ** 2)) / np.abs(
            np.sqrt(Zxx_signal[0] ** 2 + Zxx_signal[1] ** 2))) / (
                                 1 + np.abs(np.sqrt(Zxx_noise[0] ** 2 + Zxx_noise[1] ** 2)) / np.abs(
                             np.sqrt(Zxx_signal[0] ** 2 + Zxx_signal[1] ** 2)))

        stft_dict = {'f': f, 't': t, 'Zxx_signal': Zxx_signal, 'Zxx_processed': Zxx_processed}

        if self.transform:
            sample = self.transform(sample)

        return sample, stft_dict, noise_mask, signal_mask
def run():

    # declare global variables
    global config
    global config_path

    # add config file to experiment
    experiment.add_artifact(config_path)

    if config['dataset'].get('link', True):
        dataset_config_path = f'../configs/datasets/{ config["dataset"]["link"] }'
        experiment.add_artifact(dataset_config_path)
        config['dataset'].update(json.load(open(dataset_config_path)))

    # dataset specific variables
    folds = config['dataset']['split']
    data_directory = config['dataset']['path']

    # split dataset into k folds
    split_dirs = split_data(folds, data_directory, data_name)

    # total results dictionary
    results = {
        'f1': [],
        'rec': [],
        'acc': [],
        'mcc': [],
        'prec': [],
        'spec': []
    }

    # iterate over each dataset split
    for split_index in range(len(split_dirs)):

        # print current validation split index
        print(f'start validating on split {split_index}')

        # restart keras session
        K.clear_session()

        # prepare dataset by distributing the k splits
        # into training and validation sets
        training_directory, validation_directory = prepare_dataset(
            split_dirs, split_index, len(split_dirs))

        if config['dataset'].get('validation_extension', False):

            extension_path = config['dataset']['validation_extension_path']

            for class_extension in os.listdir(extension_path):

                class_path = os.path.join(extension_path, class_extension)
                target_path = os.path.join(validation_directory,
                                           class_extension)

                for filename in os.listdir(class_path):
                    shutil.copy(os.path.join(class_path, filename),
                                os.path.join(target_path, filename))

        # print training directories for sanity
        print(f'training on {training_directory}')
        print(f'validation on {validation_directory}')

        # load model from model file or build it using a build file.
        if config['model'].get('load_model', False):
            model = load_model(config['model']['model_splits'][split_index])
        else:
            model_builder_path = config['model']['build_file']
            model_builder = importlib.import_module(
                f'models.{model_builder_path}')
            model = model_builder.build(config)

        # train model and get last weigths
        if config['model'].get('train', True):
            print("Start training...")
            model = train(model, config, experiment, training_directory,
                          validation_directory, f'split_{split_index}')
            evaluate(model, config, experiment, validation_directory,
                     f'split_{split_index}')

        # if fine tune, train model again on config link found in config
        if config.get('fine_tuning', {}).get(
                'link', False) and config['model'].get('train', True):

            print("Start fine tuning...")

            # load config link from config
            fine_tuning_config_name = config['fine_tuning']['link']
            fine_tuning_config_path = f'../configs/links/{fine_tuning_config_name}'
            fine_tuning_config = json.load(open(fine_tuning_config_path))

            if fine_tuning_config['dataset'].get('link', True):
                dataset_config_path = f'../configs/datasets/{fine_tuning_config["dataset"]["link"]}'
                experiment.add_artifact(dataset_config_path)
                fine_tuning_config['dataset'].update(
                    json.load(open(dataset_config_path)))

            # add link config to experiment
            experiment.add_artifact(fine_tuning_config_path)

            # train using new config
            model = train(model, fine_tuning_config, experiment,
                          training_directory, validation_directory,
                          f'fine_split_{split_index}')

        # evaluate train model and get metrics
        print("Start evaluation...")
        split_results = evaluate(model, config, experiment,
                                 validation_directory, f'split_{split_index}')

        # merge split results with total results
        for key in split_results:
            results[key].append(split_results[key])
            print(key, results[key])

    # log results
    log_cross_validation_results(full_kfold_summary_file_path, results,
                                 experiment_name, folds)
    log_to_results_comparison(results, experiment_name, folds)

    experiment.add_artifact(full_kfold_summary_file_path)
    experiment.add_artifact(all_results_file_path)