コード例 #1
0
    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()
コード例 #2
0
    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