annotate scripts/map_and_average.py @ 105:edd82eb89b4b branch-tests tip

Merge
author Maria Panteli
date Sun, 15 Oct 2017 13:36:59 +0100
parents 4425a4918102
children
rev   line source
m@9 1 # -*- coding: utf-8 -*-
m@9 2 """
m@9 3 Created on Thu Mar 16 02:44:07 2017
m@9 4
m@9 5 @author: mariapanteli
m@9 6 """
m@9 7
m@9 8 import numpy as np
m@9 9 import pickle
m@9 10
m@9 11 import util_feature_learning
m@9 12
m@9 13 WIN_SIZE = 8
m@9 14 INPUT_FILES = ['/import/c4dm-04/mariap/train_data_melodia_'+str(WIN_SIZE)+'.pickle',
m@9 15 '/import/c4dm-04/mariap/val_data_melodia_'+str(WIN_SIZE)+'.pickle',
m@9 16 '/import/c4dm-04/mariap/test_data_melodia_'+str(WIN_SIZE)+'.pickle']
m@9 17 OUTPUT_FILES = ['/import/c4dm-04/mariap/lda_data_melodia_'+str(WIN_SIZE)+'.pickle',
m@9 18 '/import/c4dm-04/mariap/pca_data_melodia_'+str(WIN_SIZE)+'.pickle',
m@9 19 '/import/c4dm-04/mariap/nmf_data_melodia_'+str(WIN_SIZE)+'.pickle',
m@9 20 '/import/c4dm-04/mariap/ssnmf_data_melodia_'+str(WIN_SIZE)+'.pickle',
m@9 21 '/import/c4dm-04/mariap/na_data_melodia_'+str(WIN_SIZE)+'.pickle']
m@9 22
m@9 23
m@9 24 def remove_inds(features, labels, audiolabels):
m@9 25 '''remove instances with unknown country
m@9 26 '''
m@9 27 remove_inds1 = np.where(labels=='unknown')[0]
m@9 28 remove_inds2 = np.where(labels=='Unidentified')[0]
m@9 29 keep_inds = np.array(list(set(range(len(labels))) - (set(remove_inds1) | set(remove_inds2))))
m@9 30 features = features[keep_inds, :]
m@9 31 labels = labels[keep_inds]
m@9 32 audiolabels = audiolabels[keep_inds]
m@9 33 return features, labels, audiolabels
m@9 34
m@9 35
m@9 36 def averageframes(features, audiolabels, classlabels):
m@9 37 '''average frame-based features for each recording
m@9 38 '''
m@9 39 u, ind = np.unique(audiolabels, return_index=True)
m@9 40 uniqsorted = u[np.argsort(ind)]
m@9 41 newfeatures = []
m@9 42 newclasslabels = []
m@9 43 newaudiolabels = []
m@9 44 for aulabel in uniqsorted:
m@9 45 inds = np.where(audiolabels == aulabel)[0]
m@9 46 newfeatures.append(np.mean(features[inds, :], axis=0))
m@9 47 newclasslabels.append(classlabels[inds[0]])
m@9 48 newaudiolabels.append(aulabel)
m@9 49 newfeatures = np.array(newfeatures)
m@9 50 newaudiolabels = np.array(newaudiolabels)
m@9 51 newclasslabels = np.array(newclasslabels)
m@9 52 return newfeatures, newaudiolabels, newclasslabels
m@9 53
m@9 54
m@9 55 def load_data_from_pickle(pickle_file=None):
m@9 56 '''load frame based features and labels from pickle file
m@9 57 '''
m@9 58 with open(pickle_file,'rb') as f:
m@9 59 data, labels, audiolabels = pickle.load(f)
m@9 60 # remove 'unknown' and 'unidentified' country
m@9 61 data, labels, audiolabels = remove_inds(data, labels, audiolabels)
m@9 62 # avoid nan which gives error in feature learning
m@9 63 data[np.isnan(data)] = 0
m@9 64 return data, labels, audiolabels
m@9 65
m@9 66
m@9 67 def load_train_val_test_sets():
m@9 68 '''load train, val, test sets
m@9 69 '''
m@9 70 trainset = load_data_from_pickle(INPUT_FILES[0])
m@9 71 valset = load_data_from_pickle(INPUT_FILES[1])
m@9 72 testset = load_data_from_pickle(INPUT_FILES[2])
m@9 73 return trainset, valset, testset
m@9 74
m@9 75
m@62 76 def limit_to_n_seconds(dataset, n_sec=30.0, win_sec=8.0):
m@62 77 X, Y, Yaudio = dataset
m@62 78 uniq_audio, uniq_counts = np.unique(Yaudio, return_counts=True)
m@62 79 frame_sr = 2.0
m@62 80 max_n_frames = np.int(np.floor((n_sec - win_sec) * frame_sr))
m@62 81 X_new, Y_new, Yaudio_new = [], [], []
m@62 82 for audio in uniq_audio:
m@62 83 idx = np.where(Yaudio==audio)[0]
m@62 84 if len(idx) > max_n_frames:
m@62 85 idx = idx[:max_n_frames]
m@62 86 X_new.append(X[idx, :])
m@62 87 Y_new.append(Y[idx])
m@62 88 Yaudio_new.append(Yaudio[idx])
m@62 89 return [np.concatenate(X_new), np.concatenate(Y_new), np.concatenate(Yaudio_new)]
m@62 90
m@62 91
m@9 92 def get_feat_inds(n_dim=840):
m@9 93 '''assume frame with 840 features and return indices for each feature
m@9 94 '''
m@9 95 if n_dim == 840:
m@9 96 rhy_inds = np.arange(400)
m@9 97 mel_inds = np.arange(400, 640)
m@9 98 mfc_inds = np.arange(640, 720)
m@9 99 chr_inds = np.arange(720, 840)
m@9 100 elif n_dim == 640:
m@9 101 rhy_inds = np.arange(200)
m@9 102 mel_inds = np.arange(200, 440)
m@9 103 mfc_inds = np.arange(440, 520)
m@9 104 chr_inds = np.arange(520, 640)
m@9 105 elif n_dim == 460:
m@9 106 rhy_inds = np.arange(200)
m@9 107 mel_inds = np.arange(200, 260)
m@9 108 mfc_inds = np.arange(260, 340)
m@9 109 chr_inds = np.arange(340, 460)
m@9 110 elif n_dim == 660:
m@9 111 rhy_inds = np.arange(400)
m@9 112 mel_inds = np.arange(400, 460)
m@9 113 mfc_inds = np.arange(460, 540)
m@9 114 chr_inds = np.arange(540, 660)
m@9 115 feat_inds = [rhy_inds, mel_inds, mfc_inds, chr_inds]
m@9 116 feat_labels = ['rhy', 'mel', 'mfc', 'chr']
m@9 117 return feat_labels, feat_inds
m@9 118
m@9 119
m@9 120 def map_and_average_frames(dataset=None, n_components=None, min_variance=None):
m@9 121 if dataset is None:
m@9 122 trainset, valset, testset = load_train_val_test_sets()
m@9 123 else:
m@9 124 trainset, valset, testset = dataset
m@9 125 traindata, trainlabels, trainaudiolabels = trainset
m@9 126 valdata, vallabels, valaudiolabels = valset
m@9 127 testdata, testlabels, testaudiolabels = testset
m@9 128 print traindata.shape, valdata.shape, testdata.shape
m@9 129 labels = np.concatenate((trainlabels, vallabels, testlabels)).ravel()
m@9 130 audiolabels = np.concatenate((trainaudiolabels, valaudiolabels, testaudiolabels)).ravel()
m@9 131
m@9 132 feat_labels, feat_inds = get_feat_inds(n_dim=traindata.shape[1])
m@9 133 ldadata_list = []
m@9 134 pcadata_list = []
m@9 135 nmfdata_list = []
m@9 136 ssnmfdata_list = []
m@9 137 data_list = []
m@9 138 for i in range(len(feat_inds)):
m@9 139 print "mapping " + feat_labels[i]
m@9 140 inds = feat_inds[i]
m@9 141 ssm_feat = util_feature_learning.Transformer()
m@9 142 if min_variance is not None:
m@9 143 ssm_feat.fit_data(traindata[:, inds], trainlabels, n_components=len(inds), pca_only=True)
m@9 144 n_components = np.where(ssm_feat.pca_transformer.explained_variance_ratio_.cumsum()>min_variance)[0][0]+1
m@9 145 print n_components, len(inds)
m@9 146 ssm_feat.fit_data(traindata[:, inds], trainlabels, n_components=n_components)
m@9 147 elif n_components is not None:
m@9 148 ssm_feat.fit_data(traindata[:, inds], trainlabels, n_components=n_components)
m@9 149 else:
m@9 150 ssm_feat.fit_data(traindata[:, inds], trainlabels, n_components=len(inds))
m@9 151 all_data = np.concatenate((traindata[:, inds], valdata[:, inds], testdata[:, inds]), axis=0)
m@9 152 transformed_data_dict = ssm_feat.transform_data(all_data)
m@9 153 for key in transformed_data_dict.keys():
m@9 154 average_data, audiolabs, classlabs = averageframes(transformed_data_dict[key], audiolabels, labels)
m@9 155 transformed_data_dict[key] = average_data
m@9 156 data_list.append(transformed_data_dict['none'])
m@9 157 pcadata_list.append(transformed_data_dict['pca'])
m@9 158 ldadata_list.append(transformed_data_dict['lda'])
m@9 159 nmfdata_list.append(transformed_data_dict['nmf'])
m@9 160 ssnmfdata_list.append(transformed_data_dict['ssnmf'])
m@9 161 return data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs
m@9 162
m@9 163
m@9 164 def lda_map_and_average_frames(dataset=None, n_components=None, min_variance=None):
m@9 165 if dataset is None:
m@9 166 trainset, valset, testset = load_train_val_test_sets()
m@9 167 else:
m@9 168 trainset, valset, testset = dataset
m@9 169 traindata, trainlabels, trainaudiolabels = trainset
m@9 170 valdata, vallabels, valaudiolabels = valset
m@9 171 testdata, testlabels, testaudiolabels = testset
m@9 172 print traindata.shape, valdata.shape, testdata.shape
m@9 173 labels = np.concatenate((trainlabels, vallabels, testlabels)).ravel()
m@9 174 audiolabels = np.concatenate((trainaudiolabels, valaudiolabels, testaudiolabels)).ravel()
m@9 175
m@9 176 feat_labels, feat_inds = get_feat_inds(n_dim=traindata.shape[1])
m@9 177 ldadata_list = []
m@9 178 pcadata_list = []
m@9 179 nmfdata_list = []
m@9 180 ssnmfdata_list = []
m@9 181 data_list = []
m@9 182 for i in range(len(feat_inds)):
m@9 183 print "mapping " + feat_labels[i]
m@9 184 inds = feat_inds[i]
m@9 185 ssm_feat = util_feature_learning.Transformer()
m@9 186 if min_variance is not None:
m@9 187 ssm_feat.fit_lda_data(traindata[:, inds], trainlabels, n_components=len(inds), pca_only=True)
m@9 188 n_components = np.where(ssm_feat.pca_transformer.explained_variance_ratio_.cumsum()>min_variance)[0][0]+1
m@9 189 print n_components, len(inds)
m@9 190 ssm_feat.fit_lda_data(traindata[:, inds], trainlabels, n_components=n_components)
m@9 191 elif n_components is not None:
m@9 192 ssm_feat.fit_lda_data(traindata[:, inds], trainlabels, n_components=n_components)
m@9 193 else:
m@9 194 ssm_feat.fit_lda_data(traindata[:, inds], trainlabels, n_components=len(inds))
m@9 195 all_data = np.concatenate((traindata[:, inds], valdata[:, inds], testdata[:, inds]), axis=0)
m@9 196 transformed_data_dict = ssm_feat.transform_lda_data(all_data)
m@9 197 for key in transformed_data_dict.keys():
m@9 198 if len(transformed_data_dict[key])==0:
m@9 199 continue
m@9 200 average_data, audiolabs, classlabs = averageframes(transformed_data_dict[key], audiolabels, labels)
m@9 201 transformed_data_dict[key] = average_data
m@9 202 data_list.append(transformed_data_dict['none'])
m@9 203 pcadata_list.append(transformed_data_dict['pca'])
m@9 204 ldadata_list.append(transformed_data_dict['lda'])
m@9 205 nmfdata_list.append(transformed_data_dict['nmf'])
m@9 206 ssnmfdata_list.append(transformed_data_dict['ssnmf'])
m@9 207 return data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs
m@9 208
m@9 209
m@9 210 def write_output(data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs):
m@9 211 pickle.dump([ldadata_list, classlabs, audiolabs], open(OUTPUT_FILES[0], 'wb'))
m@9 212 pickle.dump([pcadata_list, classlabs, audiolabs], open(OUTPUT_FILES[1], 'wb'))
m@9 213 pickle.dump([nmfdata_list, classlabs, audiolabs], open(OUTPUT_FILES[2], 'wb'))
m@9 214 pickle.dump([ssnmfdata_list, classlabs, audiolabs], open(OUTPUT_FILES[3], 'wb'))
m@9 215 pickle.dump([data_list, classlabs, audiolabs], open(OUTPUT_FILES[4], 'wb'))
m@9 216
m@9 217
m@9 218 if __name__ == '__main__':
m@9 219 # first only lda - because it goes fast
m@9 220 data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs = lda_map_and_average_frames(min_variance=0.99)
m@9 221 write_output(data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs)
m@9 222 # then add nmf,ssnmf
m@9 223 #data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs = map_and_average_frames(min_variance=0.99)
m@9 224 #write_output(data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs)
m@9 225