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 |