m@9: # -*- coding: utf-8 -*- m@9: """ m@9: Created on Thu Mar 16 02:44:07 2017 m@9: m@9: @author: mariapanteli m@9: """ m@9: m@9: import numpy as np m@9: import pickle m@9: m@9: import util_feature_learning m@9: m@9: WIN_SIZE = 8 m@9: INPUT_FILES = ['/import/c4dm-04/mariap/train_data_melodia_'+str(WIN_SIZE)+'.pickle', m@9: '/import/c4dm-04/mariap/val_data_melodia_'+str(WIN_SIZE)+'.pickle', m@9: '/import/c4dm-04/mariap/test_data_melodia_'+str(WIN_SIZE)+'.pickle'] m@9: OUTPUT_FILES = ['/import/c4dm-04/mariap/lda_data_melodia_'+str(WIN_SIZE)+'.pickle', m@9: '/import/c4dm-04/mariap/pca_data_melodia_'+str(WIN_SIZE)+'.pickle', m@9: '/import/c4dm-04/mariap/nmf_data_melodia_'+str(WIN_SIZE)+'.pickle', m@9: '/import/c4dm-04/mariap/ssnmf_data_melodia_'+str(WIN_SIZE)+'.pickle', m@9: '/import/c4dm-04/mariap/na_data_melodia_'+str(WIN_SIZE)+'.pickle'] m@9: m@9: m@9: def remove_inds(features, labels, audiolabels): m@9: '''remove instances with unknown country m@9: ''' m@9: remove_inds1 = np.where(labels=='unknown')[0] m@9: remove_inds2 = np.where(labels=='Unidentified')[0] m@9: keep_inds = np.array(list(set(range(len(labels))) - (set(remove_inds1) | set(remove_inds2)))) m@9: features = features[keep_inds, :] m@9: labels = labels[keep_inds] m@9: audiolabels = audiolabels[keep_inds] m@9: return features, labels, audiolabels m@9: m@9: m@9: def averageframes(features, audiolabels, classlabels): m@9: '''average frame-based features for each recording m@9: ''' m@9: u, ind = np.unique(audiolabels, return_index=True) m@9: uniqsorted = u[np.argsort(ind)] m@9: newfeatures = [] m@9: newclasslabels = [] m@9: newaudiolabels = [] m@9: for aulabel in uniqsorted: m@9: inds = np.where(audiolabels == aulabel)[0] m@9: newfeatures.append(np.mean(features[inds, :], axis=0)) m@9: newclasslabels.append(classlabels[inds[0]]) m@9: newaudiolabels.append(aulabel) m@9: newfeatures = np.array(newfeatures) m@9: newaudiolabels = np.array(newaudiolabels) m@9: newclasslabels = np.array(newclasslabels) m@9: return newfeatures, newaudiolabels, newclasslabels m@9: m@9: m@9: def load_data_from_pickle(pickle_file=None): m@9: '''load frame based features and labels from pickle file m@9: ''' m@9: with open(pickle_file,'rb') as f: m@9: data, labels, audiolabels = pickle.load(f) m@9: # remove 'unknown' and 'unidentified' country m@9: data, labels, audiolabels = remove_inds(data, labels, audiolabels) m@9: # avoid nan which gives error in feature learning m@9: data[np.isnan(data)] = 0 m@9: return data, labels, audiolabels m@9: m@9: m@9: def load_train_val_test_sets(): m@9: '''load train, val, test sets m@9: ''' m@9: trainset = load_data_from_pickle(INPUT_FILES[0]) m@9: valset = load_data_from_pickle(INPUT_FILES[1]) m@9: testset = load_data_from_pickle(INPUT_FILES[2]) m@9: return trainset, valset, testset m@9: m@9: m@62: def limit_to_n_seconds(dataset, n_sec=30.0, win_sec=8.0): m@62: X, Y, Yaudio = dataset m@62: uniq_audio, uniq_counts = np.unique(Yaudio, return_counts=True) m@62: frame_sr = 2.0 m@62: max_n_frames = np.int(np.floor((n_sec - win_sec) * frame_sr)) m@62: X_new, Y_new, Yaudio_new = [], [], [] m@62: for audio in uniq_audio: m@62: idx = np.where(Yaudio==audio)[0] m@62: if len(idx) > max_n_frames: m@62: idx = idx[:max_n_frames] m@62: X_new.append(X[idx, :]) m@62: Y_new.append(Y[idx]) m@62: Yaudio_new.append(Yaudio[idx]) m@62: return [np.concatenate(X_new), np.concatenate(Y_new), np.concatenate(Yaudio_new)] m@62: m@62: m@9: def get_feat_inds(n_dim=840): m@9: '''assume frame with 840 features and return indices for each feature m@9: ''' m@9: if n_dim == 840: m@9: rhy_inds = np.arange(400) m@9: mel_inds = np.arange(400, 640) m@9: mfc_inds = np.arange(640, 720) m@9: chr_inds = np.arange(720, 840) m@9: elif n_dim == 640: m@9: rhy_inds = np.arange(200) m@9: mel_inds = np.arange(200, 440) m@9: mfc_inds = np.arange(440, 520) m@9: chr_inds = np.arange(520, 640) m@9: elif n_dim == 460: m@9: rhy_inds = np.arange(200) m@9: mel_inds = np.arange(200, 260) m@9: mfc_inds = np.arange(260, 340) m@9: chr_inds = np.arange(340, 460) m@9: elif n_dim == 660: m@9: rhy_inds = np.arange(400) m@9: mel_inds = np.arange(400, 460) m@9: mfc_inds = np.arange(460, 540) m@9: chr_inds = np.arange(540, 660) m@9: feat_inds = [rhy_inds, mel_inds, mfc_inds, chr_inds] m@9: feat_labels = ['rhy', 'mel', 'mfc', 'chr'] m@9: return feat_labels, feat_inds m@9: m@9: m@9: def map_and_average_frames(dataset=None, n_components=None, min_variance=None): m@9: if dataset is None: m@9: trainset, valset, testset = load_train_val_test_sets() m@9: else: m@9: trainset, valset, testset = dataset m@9: traindata, trainlabels, trainaudiolabels = trainset m@9: valdata, vallabels, valaudiolabels = valset m@9: testdata, testlabels, testaudiolabels = testset m@9: print traindata.shape, valdata.shape, testdata.shape m@9: labels = np.concatenate((trainlabels, vallabels, testlabels)).ravel() m@9: audiolabels = np.concatenate((trainaudiolabels, valaudiolabels, testaudiolabels)).ravel() m@9: m@9: feat_labels, feat_inds = get_feat_inds(n_dim=traindata.shape[1]) m@9: ldadata_list = [] m@9: pcadata_list = [] m@9: nmfdata_list = [] m@9: ssnmfdata_list = [] m@9: data_list = [] m@9: for i in range(len(feat_inds)): m@9: print "mapping " + feat_labels[i] m@9: inds = feat_inds[i] m@9: ssm_feat = util_feature_learning.Transformer() m@9: if min_variance is not None: m@9: ssm_feat.fit_data(traindata[:, inds], trainlabels, n_components=len(inds), pca_only=True) m@9: n_components = np.where(ssm_feat.pca_transformer.explained_variance_ratio_.cumsum()>min_variance)[0][0]+1 m@9: print n_components, len(inds) m@9: ssm_feat.fit_data(traindata[:, inds], trainlabels, n_components=n_components) m@9: elif n_components is not None: m@9: ssm_feat.fit_data(traindata[:, inds], trainlabels, n_components=n_components) m@9: else: m@9: ssm_feat.fit_data(traindata[:, inds], trainlabels, n_components=len(inds)) m@9: all_data = np.concatenate((traindata[:, inds], valdata[:, inds], testdata[:, inds]), axis=0) m@9: transformed_data_dict = ssm_feat.transform_data(all_data) m@9: for key in transformed_data_dict.keys(): m@9: average_data, audiolabs, classlabs = averageframes(transformed_data_dict[key], audiolabels, labels) m@9: transformed_data_dict[key] = average_data m@9: data_list.append(transformed_data_dict['none']) m@9: pcadata_list.append(transformed_data_dict['pca']) m@9: ldadata_list.append(transformed_data_dict['lda']) m@9: nmfdata_list.append(transformed_data_dict['nmf']) m@9: ssnmfdata_list.append(transformed_data_dict['ssnmf']) m@9: return data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs m@9: m@9: m@9: def lda_map_and_average_frames(dataset=None, n_components=None, min_variance=None): m@9: if dataset is None: m@9: trainset, valset, testset = load_train_val_test_sets() m@9: else: m@9: trainset, valset, testset = dataset m@9: traindata, trainlabels, trainaudiolabels = trainset m@9: valdata, vallabels, valaudiolabels = valset m@9: testdata, testlabels, testaudiolabels = testset m@9: print traindata.shape, valdata.shape, testdata.shape m@9: labels = np.concatenate((trainlabels, vallabels, testlabels)).ravel() m@9: audiolabels = np.concatenate((trainaudiolabels, valaudiolabels, testaudiolabels)).ravel() m@9: m@9: feat_labels, feat_inds = get_feat_inds(n_dim=traindata.shape[1]) m@9: ldadata_list = [] m@9: pcadata_list = [] m@9: nmfdata_list = [] m@9: ssnmfdata_list = [] m@9: data_list = [] m@9: for i in range(len(feat_inds)): m@9: print "mapping " + feat_labels[i] m@9: inds = feat_inds[i] m@9: ssm_feat = util_feature_learning.Transformer() m@9: if min_variance is not None: m@9: ssm_feat.fit_lda_data(traindata[:, inds], trainlabels, n_components=len(inds), pca_only=True) m@9: n_components = np.where(ssm_feat.pca_transformer.explained_variance_ratio_.cumsum()>min_variance)[0][0]+1 m@9: print n_components, len(inds) m@9: ssm_feat.fit_lda_data(traindata[:, inds], trainlabels, n_components=n_components) m@9: elif n_components is not None: m@9: ssm_feat.fit_lda_data(traindata[:, inds], trainlabels, n_components=n_components) m@9: else: m@9: ssm_feat.fit_lda_data(traindata[:, inds], trainlabels, n_components=len(inds)) m@9: all_data = np.concatenate((traindata[:, inds], valdata[:, inds], testdata[:, inds]), axis=0) m@9: transformed_data_dict = ssm_feat.transform_lda_data(all_data) m@9: for key in transformed_data_dict.keys(): m@9: if len(transformed_data_dict[key])==0: m@9: continue m@9: average_data, audiolabs, classlabs = averageframes(transformed_data_dict[key], audiolabels, labels) m@9: transformed_data_dict[key] = average_data m@9: data_list.append(transformed_data_dict['none']) m@9: pcadata_list.append(transformed_data_dict['pca']) m@9: ldadata_list.append(transformed_data_dict['lda']) m@9: nmfdata_list.append(transformed_data_dict['nmf']) m@9: ssnmfdata_list.append(transformed_data_dict['ssnmf']) m@9: return data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs m@9: m@9: m@9: def write_output(data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs): m@9: pickle.dump([ldadata_list, classlabs, audiolabs], open(OUTPUT_FILES[0], 'wb')) m@9: pickle.dump([pcadata_list, classlabs, audiolabs], open(OUTPUT_FILES[1], 'wb')) m@9: pickle.dump([nmfdata_list, classlabs, audiolabs], open(OUTPUT_FILES[2], 'wb')) m@9: pickle.dump([ssnmfdata_list, classlabs, audiolabs], open(OUTPUT_FILES[3], 'wb')) m@9: pickle.dump([data_list, classlabs, audiolabs], open(OUTPUT_FILES[4], 'wb')) m@9: m@9: m@9: if __name__ == '__main__': m@9: # first only lda - because it goes fast m@9: data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs = lda_map_and_average_frames(min_variance=0.99) m@9: write_output(data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs) m@9: # then add nmf,ssnmf m@9: #data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs = map_and_average_frames(min_variance=0.99) m@9: #write_output(data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs) m@9: