From e4cecd749dce6085ab06ce4c7cb9f2ab54dbc7c8 Mon Sep 17 00:00:00 2001 From: Jon Nordby Date: Sat, 21 Dec 2019 23:54:15 +0100 Subject: [PATCH 1/4] features: Allow to pass data directly --- microesc/features.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/microesc/features.py b/microesc/features.py index 89d3f36..3e86fec 100644 --- a/microesc/features.py +++ b/microesc/features.py @@ -107,7 +107,7 @@ def download_progress(count, blocksize, totalsize): def load_sample(sample, settings, feature_dir, window_frames, - start_time=None, augment=None, normalize='meanstd'): + start_time=None, augment=None, normalize='meanstd', data=None): n_mels = settings['n_mels'] sample_rate = settings['samplerate'] hop_length = settings['hop_length'] @@ -119,10 +119,14 @@ def load_sample(sample, settings, feature_dir, window_frames, aug = None # Load precomputed features - folder = os.path.join(feature_dir, settings_id(settings)) - path = feature_path(sample, out_folder=folder, augmentation=aug) - mels = numpy.load(path)['arr_0'] - assert mels.shape[0] == n_mels, mels.shape + if data is None: + folder = os.path.join(feature_dir, settings_id(settings)) + folder = feature_dir + path = feature_path(sample, out_folder=folder, augmentation=aug) + mels = numpy.load(path)['arr_0'] + assert mels.shape[0] == n_mels, mels.shape + else: + mels = data if start_time is None: # Sample a window in time randomly @@ -146,6 +150,8 @@ def load_sample(sample, settings, feature_dir, window_frames, mels = librosa.core.power_to_db(mels, top_db=80) mels -= numpy.mean(mels) mels /= ( numpy.std(mels) + 1e-9) + elif normalize == 'none': + mels = mels else: mels = librosa.core.power_to_db(mels, top_db=80, ref=0.0) else: From 0c8a7e3898a1ad5e258ad1b43df3f1b803a9535e Mon Sep 17 00:00:00 2001 From: Jon Nordby Date: Sat, 21 Dec 2019 23:54:33 +0100 Subject: [PATCH 2/4] train: Allow to adjust/disable checkpointing --- microesc/settings.py | 1 + microesc/train.py | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/microesc/settings.py b/microesc/settings.py index e89abe2..2b77326 100644 --- a/microesc/settings.py +++ b/microesc/settings.py @@ -15,6 +15,7 @@ batch=50, train_samples=36000, val_samples=3000, + checkpoint_period=1, augment=0, learning_rate=0.01, nesterov_momentum=0.9, diff --git a/microesc/train.py b/microesc/train.py index 6c74801..7ae7c65 100644 --- a/microesc/train.py +++ b/microesc/train.py @@ -98,14 +98,14 @@ def train_model(out_dir, train, val, model, def top3(y_true, y_pred): return keras.metrics.top_k_categorical_accuracy(y_true, y_pred, k=3) + print('learning_rate', learning_rate) optimizer = keras.optimizers.SGD(lr=learning_rate, momentum=settings['nesterov_momentum'], nesterov=True) model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy']) model_path = os.path.join(out_dir, 'e{epoch:02d}-v{val_loss:.2f}.t{loss:.2f}.model.hdf5') - checkpoint = keras.callbacks.ModelCheckpoint(model_path, monitor='val_acc', mode='max', - period=1, verbose=1, save_best_only=False) + def voted_score(): y_pred = features.predict_voted(settings, model, val, @@ -125,7 +125,13 @@ def voted_score(): train_gen = dataframe_generator(train, train.classID, loader=loader, batchsize=batch_size) val_gen = dataframe_generator(val, val.classID, loader=val_loader, batchsize=batch_size) - callbacks_list = [checkpoint, log] + callbacks_list = [log] + checkpoint_period = settings.get('checkpoint_period', -1) + if checkpoint_period > 0: + checkpoint = keras.callbacks.ModelCheckpoint(model_path, monitor='val_acc', mode='max', + period=checkpoint_period, verbose=1, save_best_only=False) + callbacks_list.append(checkpoint) + hist = model.fit_generator(train_gen, validation_data=val_gen, steps_per_epoch=math.ceil(train_samples/batch_size), validation_steps=math.ceil(val_samples/batch_size), From a39908f53af22bb77f20600dd90cb488d7929a07 Mon Sep 17 00:00:00 2001 From: Jon Nordby Date: Sun, 22 Dec 2019 12:50:34 +0100 Subject: [PATCH 3/4] Remove unused model.py --- model.py | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 model.py diff --git a/model.py b/model.py deleted file mode 100644 index 0a6d8fb..0000000 --- a/model.py +++ /dev/null @@ -1,26 +0,0 @@ - -from microesc import train, stats, common - -def main(): - settings = common.load_experiment('experiments', 'ldcnn20k60') - - def build(): - return train.sb_cnn(settings) - - m = build() - m.summary() - m.save('model.wip.hdf5') - - s = settings - shape = (s['n_mels'], s['frames'], 1) - model_stats = stats.analyze_model(build, [shape], n_classes=10) - - flops, params = model_stats - inference_flops = { name: v for name, v in flops.items() if not stats.is_training_scope(name) } - for name, flop in inference_flops.items(): - print(name, flop) - - - -if __name__ == '__main__': - main() From ae2e50068644a0be87135093767bb5dcde0e7d69 Mon Sep 17 00:00:00 2001 From: Jon Nordby Date: Sun, 22 Dec 2019 13:16:44 +0100 Subject: [PATCH 4/4] train: Modify Keras logs Make it available in the History object returned --- microesc/train.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/microesc/train.py b/microesc/train.py index 7ae7c65..1c82b43 100644 --- a/microesc/train.py +++ b/microesc/train.py @@ -70,8 +70,6 @@ def write_entry(self, epoch, data): self._log_file.flush() # ensure data hits disk def on_epoch_end(self, epoch, logs): - logs = logs.copy() - more = self.score() # uses current model for k, v in more.items(): logs[k] = v