def weightLearner(self): super().weightLearner() vrsavepath = os.path.join('result', 'voterate.txt') assert (self.cropping == False) gent = self._read_data if self.modelstr == 'EEGNet': _co = {} elif self.modelstr == 'rawEEGConv' or self.modelstr == 'TSGLEEGNet': _co = {'TSG': TSG} else: _co = {} voterate_list = [] data = {'x_train': None, 'y_train': None} for subject in self.subs: pred_list = [] for path in walk_files( os.path.join(self.basepath, '{:0>2d}'.format(subject))): if not self._readed: for data['x_train'], data['y_train'] in gent( subject=subject, mode='train'): self._readed = True if self.standardizing: data = self._standardize(data) model = tf.keras.models.load_model(path, custom_objects=_co) _pred = model.predict(data['x_train'], batch_size=self.batch_size, verbose=self.verbose) pred_list.append( np.squeeze( np.argmax(_pred, axis=1) == np.squeeze( data['y_train']))) pred = np.array(pred_list) lr = LinearRegression(fit_intercept=False) lr.fit(pred.T, np.squeeze(np.ones_like(data['y_train']))) self.weight_list[subject - 1] = lr.coef_ voterate_list.append(lr.coef_) self._readed = False with open(vrsavepath, 'w+') as f: sys.stdout = f print('Bagging Ensemble Vote Rate (Linear Regression)') for subject, vr in zip(self.subs, voterate_list): print('Subject {:0>2d}: '.format(subject), list(map(lambda x: '{:.2f}'.format(x), vr))) sys.stdout = _console f.seek(0, 0) for line in f.readlines(): print(line) f.close()
def call(self, *args, **kwargs): gent = self._read_data if self.modelstr == 'EEGNet': _co = {} elif self.modelstr == 'rawEEGConv' or self.modelstr == 'TSGLEEGNet': _co = {'TSG': TSG} else: _co = {} acc_list = [] kappa_list = [] data = {'x_test': None, 'y_test': None} for subject in self.subs: pred_list = [] for path in walk_files( os.path.join(self.basepath, '{:0>2d}'.format(subject))): if not self._readed: for data['x_test'], data['y_test'] in gent(subject=subject, mode='test'): self._readed = True if self.standardizing: data = self._standardize(data) model = tf.keras.models.load_model(path, custom_objects=_co) if self.cropping: _Pred = [] for cpd in self._cropping_data((data['x_test'], )): pd = model.predict(cpd, verbose=0) _Pred.append( np.argmax(pd, axis=1) == np.squeeze( data['y_test'])) _Pred = np.array(_Pred) Pred = [] for i in np.arange(_Pred.shape[1]): if _Pred[:, i].any(): Pred.append(1) else: Pred.append(0) acc = np.mean(np.array(Pred)) kappa = 0. # None else: _pred = model.predict(data['x_test'], batch_size=self.batch_size, verbose=self.verbose) pred_list.append(np.squeeze(np.argmax(_pred, axis=1))) pred = self.ensemble(pred_list, self.weight_list[subject - 1]) acc_list.append(np.mean(pred == np.squeeze(data['y_test']))) kappa_list.append(computeKappa(pred, data['y_test'])) self._readed = False avg_acc = np.mean(acc_list) avg_kappa = np.mean(kappa_list) with open(self.resavepath, 'w+') as f: sys.stdout = f print(('{0:s} {1:d}-fold Ensemble({2:s}) ' + self.validation_name + ' Accuracy (kappa)').format(self.modelstr, self.kFold, self.ename)) for i in range(len(self.subs)): print('Subject {0:0>2d}: {1:.2%} ({2:.4f})'.format( self.subs[i], acc_list[i], kappa_list[i])) print('Average : {0:.2%} ({1:.4f})'.format(avg_acc, avg_kappa)) sys.stdout = _console f.seek(0, 0) for line in f.readlines(): print(line) f.close() acc_list.append(avg_acc) kappa_list.append(avg_kappa) return acc_list, kappa_list