From e4cecd749dce6085ab06ce4c7cb9f2ab54dbc7c8 Mon Sep 17 00:00:00 2001 From: Jon Nordby Date: Sat, 21 Dec 2019 23:54:15 +0100 Subject: [PATCH 1/5] 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/5] 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/5] 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/5] 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 From 8f2b5faba97a3be043f59452a030e1516d557b97 Mon Sep 17 00:00:00 2001 From: Jon Nordby Date: Sat, 9 Oct 2021 21:50:13 +0200 Subject: [PATCH 5/5] TEMP: plot of models with result --- microesc/train.py | 7 ++++--- report/plot.py | 12 +++++++----- report/pyplots/filterbanks.py | 2 +- report/urbansound8k-existing.csv | 1 + 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/microesc/train.py b/microesc/train.py index 1c82b43..d9971c7 100644 --- a/microesc/train.py +++ b/microesc/train.py @@ -11,7 +11,7 @@ import pandas import numpy -import keras +from tensorflow import keras import librosa import sklearn.metrics @@ -96,8 +96,9 @@ 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) + optimizer = keras.optimizers.SGD(lr=learning_rate, + momentum=settings['nesterov_momentum'], nesterov=True) + model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy']) diff --git a/report/plot.py b/report/plot.py index 5e8aa58..52bf995 100644 --- a/report/plot.py +++ b/report/plot.py @@ -40,16 +40,18 @@ def model_table(data_path): def plot_models(data_path, figsize=(12,4), max_params=128e3, max_maccs=4.5e6): df = logmel_models(data_path) - + print(df) + fig, ax = plt.subplots(1, figsize=figsize) check_missing(df, 'accuracy') check_missing(df, 'kparams') check_missing(df, 'mmacc') - df.plot.scatter(x='params', y='macc_s', logx=True, logy=True, ax=ax) + df.plot(kind="scatter", x='params', y='macc_s', logx=True, logy=True, ax=ax, marker="x", color="black") ax.set_xlabel('Model parameters') ax.set_ylabel('MACC / second') + ax.grid(which="major", color='grey', alpha=0.5, linestyle='-', linewidth=1) # highlight feasible region feasible_x = max_params @@ -58,7 +60,7 @@ def plot_models(data_path, figsize=(12,4), max_params=128e3, max_maccs=4.5e6): y = [ 0, 0, feasible_y, feasible_y ] ax.fill(x, y, color='green', alpha=0.5) - linestyle = dict(color='black', linewidth=0.5) + linestyle = dict(color='green', linewidth=1.0, linestyle="dotted") ax.axvline(feasible_x, **linestyle) ax.axhline(feasible_y, **linestyle) @@ -66,10 +68,10 @@ def add_labels(row): xy = row.params, row.macc_s label = "{} {:.1f}%".format(row['name'], 100*row.accuracy) ax.annotate(label, xy, - xytext=(5,40), + xytext=(3,3), textcoords='offset points', size=12, - rotation=25, + rotation=0, color='darkslategrey') df.apply(add_labels, axis=1) diff --git a/report/pyplots/filterbanks.py b/report/pyplots/filterbanks.py index 591b57c..0fa81ff 100644 --- a/report/pyplots/filterbanks.py +++ b/report/pyplots/filterbanks.py @@ -92,7 +92,7 @@ def plotfun(x, y): def plot_filterbank_mel(ax, n_mels=32, n_fft=4097, fmin=10, fmax=22050, fs=44100): from pyfilterbank import melbank melmat, (melfreq, fftfreq) = melbank.compute_melmat(n_mels, - fmin, fmax, num_fft_bands=4097, sample_rate=fs) + fmin, fmax, num_fft_bands=n_fft, sample_rate=fs) ax.plot(fftfreq, 20*numpy.log10(melmat.T+1e-9)) #ax.grid(True) diff --git a/report/urbansound8k-existing.csv b/report/urbansound8k-existing.csv index b3f14e9..f2e0d59 100644 --- a/report/urbansound8k-existing.csv +++ b/report/urbansound8k-existing.csv @@ -8,3 +8,4 @@ DilaConv,0.78,,,,YanChen2019,"?","log-MISSING-mel" Dmix-CNN-gt,0.837,0.777,837,1180,ZhichaoZhang,"pitchshift,timestretch,mixup","gammatone+delta",443,44100,1024,512,128,128 EnvNetv2,0.783,0.691,,,Tokozume,"betweenclass","waveform" WSNet,0.70,,,288,Xiaojie,"?","waveform" +Nordby2019-S24,0.709,0.680,477,45,Nordby2019,"?","logmel",0.45,22050,1024,512,31,60