def test_transform(): # minmax X1 = np.random.randn(100, 32, 128) scaler = Scaler(normalizer="minmax") scaler.fit(X1) X1_scaled = scaler.transform(X1) assert np.amin(X1_scaled) == -1.0 assert np.amax(X1_scaled) == 1.0 # standard X2 = np.random.randn(100, 32, 128) scaler = Scaler(normalizer="standard") scaler.fit(X2) X2_scaled = scaler.transform(X2) X2_scaled_flat = np.reshape(X2_scaled, (-1, X2.shape[-1])) assert X2_scaled_flat.shape[1] == X2.shape[-1] mean = np.mean(X2_scaled_flat, axis=0) std = np.std(X2_scaled_flat, axis=0) assert np.allclose(mean, np.zeros(128), rtol=0.001, atol=0.001) assert np.allclose(std, np.ones(128), rtol=0.001, atol=0.001) # list of scalers scaler = Scaler(normalizer=["minmax", "standard"]) X_list = [X1, X2] scaler.fit(X_list) X_list_scaled = scaler.transform(X_list) assert type(X_list_scaled) is list assert len(X_list_scaled) == 2 assert np.allclose(X_list_scaled[0], X1_scaled, rtol=0.001, atol=0.001) assert np.allclose(X_list_scaled[1], X2_scaled, rtol=0.001, atol=0.001) # DataGenerator feature_extractor = MelSpectrogram() feature_extractor.extract(dataset) data_generator = DataGenerator(dataset, feature_extractor, folds=["all"]) scaler = Scaler(normalizer="minmax") scaler.fit(data_generator) data_generator.set_scaler(scaler) X, _ = data_generator.get_data() assert np.amin(X) == -1.0 assert np.amax(X) == 1.0
def main(): # Parse arguments parser = argparse.ArgumentParser( description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument( '-d', '--dataset', type=str, help='dataset name (e.g. UrbanSound8k, ESC50, URBAN_SED, SONYC_UST)', default='UrbanSound8k') parser.add_argument( '-f', '--features', type=str, help='features name (e.g. Spectrogram, MelSpectrogram, Openl3)', default='MelSpectrogram') parser.add_argument('-p', '--path', type=str, help='path to the parameters.json file', default='../') parser.add_argument( '-m', '--model', type=str, help='model name (e.g. MLP, SB_CNN, SB_CNN_SED, A_CRNN, VGGish)', default='SB_CNN') parser.add_argument('-fold', '--fold_name', type=str, help='fold name', default='fold1') parser.add_argument('-s', '--models_path', type=str, help='path to save the trained model', default='../trained_models') parser.add_argument('--aug', dest='augmentation', action='store_true') parser.add_argument('--no-aug', dest='augmentation', action='store_false') parser.set_defaults(augmentation=False) args = parser.parse_args() print(__doc__) if args.dataset not in get_available_datasets(): raise AttributeError('Dataset not available') if args.features not in get_available_features(): raise AttributeError('Features not available') if args.model not in get_available_models(): raise AttributeError('Model not available') # Get parameters parameters_file = os.path.join(args.path, 'parameters.json') params = load_json(parameters_file) params_dataset = params['datasets'][args.dataset] params_features = params['features'] params_model = params['models'][args.model] # Get and init dataset class dataset_class = get_available_datasets()[args.dataset] dataset_path = os.path.join(args.path, params_dataset['dataset_path']) dataset = dataset_class(dataset_path) if args.fold_name not in dataset.fold_list: raise AttributeError('Fold not available') # Data augmentation if args.augmentation: # Define the augmentations augmentations = params['data_augmentations'] # Initialize AugmentedDataset dataset = AugmentedDataset(dataset, params['features']['sr'], augmentations) # Process all files print('Doing data augmentation ...') dataset.process() print('Done!') # Get and init feature class features_class = get_available_features()[args.features] features = features_class( sequence_time=params_features['sequence_time'], sequence_hop_time=params_features['sequence_hop_time'], audio_win=params_features['audio_win'], audio_hop=params_features['audio_hop'], sr=params_features['sr'], **params_features[args.features]) print('Features shape: ', features.get_shape()) # Check if features were extracted if not features.check_if_extracted(dataset): print('Extracting features ...') features.extract(dataset) print('Done!') use_validate_set = True if args.dataset in ['TUTSoundEvents2017', 'ESC50', 'ESC10']: # When have less data, don't use validation set. use_validate_set = False folds_train, folds_val, _ = evaluation_setup( args.fold_name, dataset.fold_list, params_dataset['evaluation_mode'], use_validate_set=use_validate_set) data_gen_train = DataGenerator(dataset, features, folds=folds_train, batch_size=params['train']['batch_size'], shuffle=True, train=True, scaler=None) scaler = Scaler(normalizer=params_model['normalizer']) print('Fitting scaler ...') scaler.fit(data_gen_train) print('Done!') # Pass scaler to data_gen_train to be used when data # loading data_gen_train.set_scaler(scaler) data_gen_val = DataGenerator(dataset, features, folds=folds_val, batch_size=params['train']['batch_size'], shuffle=False, train=False, scaler=scaler) # Define model features_shape = features.get_shape() n_frames_cnn = features_shape[1] n_freq_cnn = features_shape[2] n_classes = len(dataset.label_list) model_class = get_available_models()[args.model] metrics = ['classification'] if args.dataset in sed_datasets: metrics = ['sed'] if args.dataset in tagging_datasets: metrics = ['tagging'] model_container = model_class(model=None, model_path=None, n_classes=n_classes, n_frames_cnn=n_frames_cnn, n_freq_cnn=n_freq_cnn, metrics=metrics, **params_model['model_arguments']) model_container.model.summary() # Set paths model_folder = os.path.join(args.models_path, args.model, args.dataset) exp_folder = os.path.join(model_folder, args.fold_name) mkdir_if_not_exists(exp_folder, parents=True) # Save model json and scaler model_container.save_model_json(model_folder) save_pickle(scaler, os.path.join(exp_folder, 'scaler.pickle')) # data_train = data_gen_train.get_data() # data_val = data_gen_val.get_data() # Train model model_container.train( data_gen_train, data_gen_val, # data_train, data_val, label_list=dataset.label_list, weights_path=exp_folder, **params['train'], sequence_time_sec=params_features['sequence_hop_time'])
def main(): # Parse arguments parser = argparse.ArgumentParser( description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter ) parser.add_argument( '-od', '--origin_dataset', type=str, help='dataset name (e.g. UrbanSound8k, ESC50, URBAN_SED, SONYC_UST)', default='UrbanSound8k' ) parser.add_argument( '-ofold', '--origin_fold_name', type=str, help='origin fold name', default='fold1') parser.add_argument( '-d', '--dataset', type=str, help='dataset name (e.g. UrbanSound8k, ESC50, URBAN_SED, SONYC_UST)', default='ESC50' ) parser.add_argument( '-fold', '--fold_name', type=str, help='destination fold name', default='fold1') parser.add_argument( '-f', '--features', type=str, help='features name (e.g. Spectrogram, MelSpectrogram, Openl3)', default='MelSpectrogram' ) parser.add_argument( '-p', '--path', type=str, help='path to the parameters.json file', default='../' ) parser.add_argument( '-m', '--model', type=str, help='model name (e.g. MLP, SB_CNN, SB_CNN_SED, A_CRNN, VGGish)', default='SB_CNN') parser.add_argument( '-s', '--models_path', type=str, help='path to save the trained model', default='../trained_models' ) args = parser.parse_args() print(__doc__) if args.dataset not in get_available_datasets(): raise AttributeError('Dataset not available') if args.features not in get_available_features(): raise AttributeError('Features not available') if args.model not in get_available_models(): raise AttributeError('Model not available') # Get parameters parameters_file = os.path.join(args.path, 'parameters.json') params = load_json(parameters_file) params_dataset = params['datasets'][args.dataset] params_features = params['features'] params_model = params['models'][args.model] # Load origin model model_path_origin = os.path.join(args.models_path, args.model, args.origin_dataset) model_class = get_available_models()[args.model] metrics = ['accuracy'] if args.dataset in sed_datasets: metrics = ['sed'] model_container = model_class( model=None, model_path=model_path_origin, metrics=metrics ) model_container.load_model_weights( os.path.join(model_path_origin, args.origin_fold_name)) kwargs = {} if args.dataset in sed_datasets: kwargs = {'sequence_hop_time': params_features['sequence_hop_time']} # Get and init dataset class dataset_class = get_available_datasets()[args.dataset] dataset_path = os.path.join(args.path, params_dataset['dataset_path']) dataset = dataset_class(dataset_path, **kwargs) if args.fold_name not in dataset.fold_list: raise AttributeError('Fold not available') # Get and init feature class features_class = get_available_features()[args.features] features = features_class( sequence_time=params_features['sequence_time'], sequence_hop_time=params_features['sequence_hop_time'], audio_win=params_features['audio_win'], audio_hop=params_features['audio_hop'], sr=params_features['sr'], **params_features[args.features] ) print('Features shape: ', features.get_shape()) # Check if features were extracted if not features.check_if_extracted(dataset): print('Extracting features ...') features.extract(dataset) print('Done!') use_validate_set = True if args.dataset in ['TUTSoundEvents2017', 'ESC50', 'ESC10']: # When have less data, don't use validation set. use_validate_set = False folds_train, folds_val, _ = evaluation_setup( args.fold_name, dataset.fold_list, params_dataset['evaluation_mode'], use_validate_set=use_validate_set ) data_gen_train = DataGenerator( dataset, features, folds=folds_train, batch_size=params['train']['batch_size'], shuffle=True, train=True, scaler=None ) scaler = Scaler(normalizer=params_model['normalizer']) print('Fitting features ...') scaler.fit(data_gen_train) print('Done!') data_gen_train.set_scaler(scaler) data_gen_val = DataGenerator( dataset, features, folds=folds_val, batch_size=params['train']['batch_size'], shuffle=False, train=False, scaler=scaler ) # Fine-tune model n_classes = len(dataset.label_list) layer_where_to_cut = -2 model_container.fine_tuning(layer_where_to_cut, new_number_of_classes=n_classes, new_activation='sigmoid', freeze_source_model=True) model_container.model.summary() # Set paths model_folder = os.path.join( args.models_path, args.model, args.origin_dataset+'_ft_'+args.dataset) exp_folder = os.path.join(model_folder, args.fold_name) mkdir_if_not_exists(exp_folder, parents=True) # Save model json and scaler model_container.save_model_json(model_folder) save_pickle(scaler, os.path.join(exp_folder, 'scaler.pickle')) # Train model model_container.train( data_gen_train, data_gen_val, label_list=dataset.label_list, weights_path=exp_folder, sequence_time_sec=params_features['sequence_hop_time'], **params['train'])
def start_training(status, fold_ix, normalizer, model_path, epochs, early_stopping, optimizer_ix, learning_rate, batch_size, considered_improvement, n_clicks_train, dataset_ix): global data_generator_train global data_generator_val if status == 'TRAINING': if fold_ix is None: return [True, 'Please select a Fold', 'danger', ""] if optimizer_ix is None: return [True, 'Please select an Optimizer', 'danger', ""] dataset_name = options_datasets[dataset_ix]['label'] fold_name = dataset.fold_list[fold_ix] params_dataset = params['datasets'][dataset_name] optimizer = options_optimizers[optimizer_ix]['label'] use_validate_set = True if dataset_name in ['TUTSoundEvents2017', 'ESC50', 'ESC10']: # When have less data, don't use validation set. use_validate_set = False folds_train, folds_val, _ = evaluation_setup( fold_name, dataset.fold_list, params_dataset['evaluation_mode'], use_validate_set=use_validate_set) data_generator_train = DataGenerator( dataset, feature_extractor, folds=folds_train, batch_size=params['train']['batch_size'], shuffle=True, train=True, scaler=None) scaler = Scaler(normalizer=normalizer) print('Fitting scaler ...') scaler.fit(data_generator_train) print('Done!') # Pass scaler to data_gen_train to be used when data # loading data_generator_train.set_scaler(scaler) data_generator_val = DataGenerator(dataset, feature_extractor, folds=folds_val, batch_size=batch_size, shuffle=False, train=False, scaler=scaler) exp_folder_fold = conv_path(os.path.join(model_path, fold_name)) mkdir_if_not_exists(exp_folder_fold, parents=True) scaler_path = os.path.join(exp_folder_fold, 'scaler.pickle') save_pickle(scaler, scaler_path) train_arguments = { 'epochs': epochs, 'early_stopping': early_stopping, 'optimizer': optimizer, 'learning_rate': learning_rate, 'batch_size': batch_size, 'considered_improvement': considered_improvement } with graph.as_default(): model_container.train(data_generator_train, data_generator_val, weights_path=exp_folder_fold, label_list=dataset.label_list, **train_arguments) model_container.load_model_weights(exp_folder_fold) return [True, "Model trained", 'success', 'True'] else: raise dash.exceptions.PreventUpdate