Last active
June 15, 2021 11:21
-
-
Save gemeinl/d64c014debb5f58e4feacb57a8656ed0 to your computer and use it in GitHub Desktop.
Revisions
-
gemeinl revised this gist
Aug 18, 2020 . 1 changed file with 19 additions and 12 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -91,8 +91,15 @@ "sfreq = 250 \n", "n_classes = 4\n", "n_chans = 22\n", "original_trial_duration = 4" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Preprocessing parameters\n", "low_cut_hz = 4. # low cut frequency for filtering\n", "high_cut_hz = 38. # high cut frequency for filtering\n", @@ -129,7 +136,7 @@ }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -162,7 +169,7 @@ }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -216,7 +223,7 @@ }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { @@ -265,7 +272,7 @@ }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { @@ -538,10 +545,10 @@ "0 bad epochs dropped\n", " epoch train_accuracy train_loss valid_accuracy valid_loss dur\n", "------- ---------------- ------------ ---------------- ------------ ------\n", " 1 \u001b[36m0.2500\u001b[0m \u001b[32m1.5919\u001b[0m \u001b[35m0.2500\u001b[0m \u001b[31m6.2938\u001b[0m 1.0413\n", " 2 0.2500 \u001b[32m1.1950\u001b[0m 0.2500 7.2211 0.2248\n", " 3 0.2500 \u001b[32m1.0809\u001b[0m 0.2500 \u001b[31m5.8693\u001b[0m 0.2272\n", " 4 \u001b[36m0.2569\u001b[0m \u001b[32m1.0008\u001b[0m \u001b[35m0.2535\u001b[0m \u001b[31m4.5076\u001b[0m 0.2266\n" ] } ], @@ -551,12 +558,12 @@ }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 576x216 with 2 Axes>" ] -
gemeinl revised this gist
Aug 18, 2020 . 1 changed file with 148 additions and 109 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -15,13 +15,29 @@ } ], "source": [ "import torch\n", "from sklearn.pipeline import Pipeline\n", "from skorch.callbacks import LRScheduler\n", "from skorch.helper import predefined_split\n", "from sklearn.base import TransformerMixin\n", "\n", "from braindecode import EEGClassifier\n", "from braindecode.util import set_random_seeds\n", "from braindecode.models import ShallowFBCSPNet\n", "from braindecode.datautil.preprocess import exponential_moving_standardize\n", "from braindecode.datasets.moabb import MOABBDataset\n", "from braindecode.datautil.windowers import (\n", " create_windows_from_events, create_fixed_length_windows)\n", "from braindecode.datautil.preprocess import (\n", " MNEPreproc, NumpyPreproc, preprocess)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "class Preprocessor(TransformerMixin):\n", " def fit(self, X, y=None):\n", " return self\n", @@ -65,108 +81,66 @@ " return X" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Known from experimental design\n", "sfreq = 250 \n", "n_classes = 4\n", "n_chans = 22\n", "original_trial_duration = 4\n", "\n", "# Preprocessing parameters\n", "low_cut_hz = 4. # low cut frequency for filtering\n", "high_cut_hz = 38. # high cut frequency for filtering\n", "# Parameters for exponential moving standardization\n", "factor_new = 1e-3\n", "init_block_size = 1000\n", "trial_start_offset_seconds = -0.5\n", "# Calculate the trial start offset in samples.\n", "trial_start_offset_samples = int(trial_start_offset_seconds * sfreq)\n", "\n", "\n", "# Model parameters\n", "seed = 20200220 # random seed to make results reproducible\n", "input_window_samples = int(original_trial_duration * sfreq - trial_start_offset_samples)\n", "\n", "\n", "# Training parameters\n", "batch_size = 64\n", "n_epochs = 4\n", "# These values we found good for shallow network:\n", "lr = 0.0625 * 0.01\n", "weight_decay = 0\n", "# For deep4 they should be:\n", "# lr = 1 * 0.01\n", "# weight_decay = 0.5 * 0.001" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "create a model" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "cuda = torch.cuda.is_available() # check if GPU is available, if True chooses to use it\n", "device = 'cuda' if cuda else 'cpu'\n", "if cuda:\n", " torch.backends.cudnn.benchmark = True\n", "\n", "# Set random seed to be able to reproduce results\n", "set_random_seeds(seed=seed, cuda=cuda)\n", "\n", "model = ShallowFBCSPNet(\n", " n_chans,\n", " n_classes,\n", @@ -180,61 +154,118 @@ ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "chain all preprocessing steps as well as classifier in a pipeline" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "pipe = Pipeline([\n", " (\"pick_channels\", MNETransformer(\n", " fn='pick_types', \n", " eeg=True, \n", " meg=False, \n", " stim=False)\n", " ),\n", " (\"convert_to_microvolts\", NumpyTransformer(\n", " fn=lambda x: x * 1e6)\n", " ),\n", " (\"bandpass\", MNETransformer(\n", " fn='filter', \n", " l_freq=low_cut_hz, \n", " h_freq=high_cut_hz)\n", " ),\n", " (\"standardize\", NumpyTransformer(\n", " fn=exponential_moving_standardize, \n", " factor_new=factor_new,\n", " init_block_size=init_block_size)\n", " ),\n", " (\"create_compute_windows\", EventWindower(\n", " trial_start_offset_samples=trial_start_offset_samples,\n", " trial_stop_offset_samples=0, preload=True)\n", " ),\n", " (\"classifier\", EEGClassifier(\n", " model,\n", " criterion=torch.nn.NLLLoss,\n", " optimizer=torch.optim.AdamW,\n", " train_split=lambda X, y: (X.split(\"session\")[\"session_T\"], \n", " X.split(\"session\")[\"session_E\"]),\n", " optimizer__lr=lr,\n", " optimizer__weight_decay=weight_decay,\n", " batch_size=batch_size,\n", " callbacks=[\n", " \"accuracy\", \n", " (\"lr_scheduler\", LRScheduler('CosineAnnealingLR', T_max=n_epochs - 1)),\n", " ],\n", " device=device)),\n", "])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "load some data" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n" ] } ], "source": [ "subject_id = 3\n", "dataset = MOABBDataset(dataset_name=\"BNCI2014001\", subject_ids=[subject_id])\n", "assert all([ds.raw.info['sfreq'] == sfreq for ds in dataset.datasets])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "perform fit" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { @@ -507,25 +538,25 @@ "0 bad epochs dropped\n", " epoch train_accuracy train_loss valid_accuracy valid_loss dur\n", "------- ---------------- ------------ ---------------- ------------ ------\n", " 1 \u001b[36m0.2500\u001b[0m \u001b[32m1.5919\u001b[0m \u001b[35m0.2500\u001b[0m \u001b[31m6.2938\u001b[0m 1.0590\n", " 2 0.2500 \u001b[32m1.1950\u001b[0m 0.2500 7.2212 0.2257\n", " 3 0.2500 \u001b[32m1.0809\u001b[0m 0.2500 \u001b[31m5.8696\u001b[0m 0.2249\n", " 4 \u001b[36m0.2569\u001b[0m \u001b[32m1.0008\u001b[0m \u001b[35m0.2535\u001b[0m \u001b[31m4.5077\u001b[0m 0.2237\n" ] } ], "source": [ "pipe = pipe.fit(dataset, classifier__epochs=n_epochs)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 576x216 with 2 Axes>" ] @@ -538,6 +569,7 @@ "import matplotlib.pyplot as plt\n", "from matplotlib.lines import Line2D\n", "import pandas as pd\n", "\n", "# Extract loss and accuracy values for plotting from history object\n", "results_columns = ['train_loss', 'valid_loss', 'train_accuracy', 'valid_accuracy']\n", "df = pd.DataFrame(pipe.steps[-1][1].history[:, results_columns], columns=results_columns,\n", @@ -571,6 +603,13 @@ "plt.legend(handles, [h.get_label() for h in handles], fontsize=14)\n", "plt.tight_layout()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { -
gemeinl created this gist
Aug 6, 2020 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,597 @@ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/gemeinl/anaconda3/envs/new_braindecode/lib/python3.7/site-packages/sklearn/utils/deprecation.py:144: FutureWarning: The sklearn.metrics.scorer module is deprecated in version 0.22 and will be removed in version 0.24. The corresponding classes / functions should instead be imported from sklearn.metrics. Anything that cannot be imported from sklearn.metrics is now part of the private API.\n", " warnings.warn(message, FutureWarning)\n" ] } ], "source": [ "from sklearn.base import TransformerMixin\n", "\n", "from braindecode.datautil.windowers import (\n", " create_windows_from_events, create_fixed_length_windows)\n", "from braindecode.datautil.preprocess import (\n", " MNEPreproc, NumpyPreproc, preprocess)\n", "\n", "class Preprocessor(TransformerMixin):\n", " def fit(self, X, y=None):\n", " return self\n", " \n", "\n", "class EventWindower(Preprocessor):\n", " def __init__(self, *args, **kwargs):\n", " self.args=args\n", " self.kwargs=kwargs\n", " \n", " def transform(self, X):\n", " return create_windows_from_events(\n", " concat_ds=X, *self.args, **self.kwargs)\n", " \n", " \n", "class FixedLengthWindower(Preprocessor):\n", " def __init__(self, *args, **kwargs):\n", " self.args=args\n", " self.kwargs=kwargs\n", " \n", " def transform(self, X):\n", " return create_fixed_length_windows(\n", " concat_ds=X, *self.args, **self.kwargs)\n", "\n", " \n", "class MNETransformer(Preprocessor):\n", " def __init__(self, fn, **kwargs):\n", " self.pre = MNEPreproc(fn=fn, **kwargs)\n", " \n", " def transform(self, X):\n", " preprocess(X, [self.pre])\n", " return X\n", "\n", " \n", "class NumpyTransformer(Preprocessor):\n", " def __init__(self, fn, **kwargs):\n", " self.pre = NumpyPreproc(fn=fn, **kwargs)\n", " \n", " def transform(self, X):\n", " preprocess(X, [self.pre])\n", " return X" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n", "48 events found\n", "Event IDs: [1 2 3 4]\n" ] } ], "source": [ "from braindecode.datasets.moabb import MOABBDataset\n", "\n", "subject_id = 3\n", "dataset = MOABBDataset(dataset_name=\"BNCI2014001\", subject_ids=[subject_id])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from sklearn.pipeline import Pipeline\n", "from braindecode.datautil.preprocess import exponential_moving_standardize" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "low_cut_hz = 4. # low cut frequency for filtering\n", "high_cut_hz = 38. # high cut frequency for filtering\n", "# Parameters for exponential moving standardization\n", "factor_new = 1e-3\n", "init_block_size = 1000" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "trial_start_offset_seconds = -0.5\n", "# Extract sampling frequency, check that they are same in all datasets\n", "sfreq = dataset.datasets[0].raw.info['sfreq']\n", "assert all([ds.raw.info['sfreq'] == sfreq for ds in dataset.datasets])\n", "# Calculate the trial start offset in samples.\n", "trial_start_offset_samples = int(trial_start_offset_seconds * sfreq)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import torch\n", "from braindecode.util import set_random_seeds\n", "from braindecode.models import ShallowFBCSPNet\n", "\n", "cuda = torch.cuda.is_available() # check if GPU is available, if True chooses to use it\n", "device = 'cuda' if cuda else 'cpu'\n", "if cuda:\n", " torch.backends.cudnn.benchmark = True\n", "seed = 20200220 # random seed to make results reproducible\n", "# Set random seed to be able to reproduce results\n", "set_random_seeds(seed=seed, cuda=cuda)\n", "\n", "n_classes = 4 # user must know from experimental design\n", "n_chans = 22 # user mus know from experimental design\n", "input_window_samples = int(4 * sfreq - trial_start_offset_samples) # user must know from experimental design + computed from windowing arguments\n", "\n", "model = ShallowFBCSPNet(\n", " n_chans,\n", " n_classes,\n", " input_window_samples=input_window_samples,\n", " final_conv_length='auto',\n", ")\n", "\n", "# Send model to GPU\n", "if cuda:\n", " model.cuda()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "from skorch.callbacks import LRScheduler\n", "from skorch.helper import predefined_split\n", "\n", "from braindecode import EEGClassifier\n", "# These values we found good for shallow network:\n", "lr = 0.0625 * 0.01\n", "weight_decay = 0\n", "\n", "# For deep4 they should be:\n", "# lr = 1 * 0.01\n", "# weight_decay = 0.5 * 0.001\n", "\n", "batch_size = 64\n", "n_epochs = 4" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "pipe = Pipeline([\n", " (\"pick_channels\", MNETransformer(fn='pick_types', eeg=True, meg=False, stim=False)),\n", " (\"convert_to_microvolts\", NumpyTransformer(fn=lambda x: x * 1e6)),\n", " (\"bandpass\", MNETransformer(fn='filter', l_freq=low_cut_hz, h_freq=high_cut_hz)),\n", " (\"standardize\", NumpyTransformer(\n", " fn=exponential_moving_standardize, factor_new=factor_new,\n", " init_block_size=init_block_size)),\n", " (\"create_compute_windows\", EventWindower(\n", " trial_start_offset_samples=trial_start_offset_samples,\n", " trial_stop_offset_samples=0, preload=True)),\n", " (\"classifier\", EEGClassifier(\n", " model,\n", " criterion=torch.nn.NLLLoss,\n", " optimizer=torch.optim.AdamW,\n", " train_split=lambda X, y: (X.split(\"session\")[\"session_T\"], X.split(\"session\")[\"session_E\"]),\n", " optimizer__lr=lr,\n", " optimizer__weight_decay=weight_decay,\n", " batch_size=batch_size,\n", " callbacks=[\n", " \"accuracy\", (\"lr_scheduler\", LRScheduler('CosineAnnealingLR', T_max=n_epochs - 1)),\n", " ],\n", " device=device)),\n", "])" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Filtering raw data in 1 contiguous segment\n", "Setting up band-pass filter from 4 - 38 Hz\n", "\n", "FIR filter parameters\n", "---------------------\n", "Designing a one-pass, zero-phase, non-causal bandpass filter:\n", "- Windowed time-domain design (firwin) method\n", "- Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation\n", "- Lower passband edge: 4.00\n", "- Lower transition bandwidth: 2.00 Hz (-6 dB cutoff frequency: 3.00 Hz)\n", "- Upper passband edge: 38.00 Hz\n", "- Upper transition bandwidth: 9.50 Hz (-6 dB cutoff frequency: 42.75 Hz)\n", "- Filter length: 413 samples (1.652 sec)\n", "\n", "Filtering raw data in 1 contiguous segment\n", "Setting up band-pass filter from 4 - 38 Hz\n", "\n", "FIR filter parameters\n", "---------------------\n", "Designing a one-pass, zero-phase, non-causal bandpass filter:\n", "- Windowed time-domain design (firwin) method\n", "- Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation\n", "- Lower passband edge: 4.00\n", "- Lower transition bandwidth: 2.00 Hz (-6 dB cutoff frequency: 3.00 Hz)\n", "- Upper passband edge: 38.00 Hz\n", "- Upper transition bandwidth: 9.50 Hz (-6 dB cutoff frequency: 42.75 Hz)\n", "- Filter length: 413 samples (1.652 sec)\n", "\n", "Filtering raw data in 1 contiguous segment\n", "Setting up band-pass filter from 4 - 38 Hz\n", "\n", "FIR filter parameters\n", "---------------------\n", "Designing a one-pass, zero-phase, non-causal bandpass filter:\n", "- Windowed time-domain design (firwin) method\n", "- Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation\n", "- Lower passband edge: 4.00\n", "- Lower transition bandwidth: 2.00 Hz (-6 dB cutoff frequency: 3.00 Hz)\n", "- Upper passband edge: 38.00 Hz\n", "- Upper transition bandwidth: 9.50 Hz (-6 dB cutoff frequency: 42.75 Hz)\n", "- Filter length: 413 samples (1.652 sec)\n", "\n", "Filtering raw data in 1 contiguous segment\n", "Setting up band-pass filter from 4 - 38 Hz\n", "\n", "FIR filter parameters\n", "---------------------\n", "Designing a one-pass, zero-phase, non-causal bandpass filter:\n", "- Windowed time-domain design (firwin) method\n", "- Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation\n", "- Lower passband edge: 4.00\n", "- Lower transition bandwidth: 2.00 Hz (-6 dB cutoff frequency: 3.00 Hz)\n", "- Upper passband edge: 38.00 Hz\n", "- Upper transition bandwidth: 9.50 Hz (-6 dB cutoff frequency: 42.75 Hz)\n", "- Filter length: 413 samples (1.652 sec)\n", "\n", "Filtering raw data in 1 contiguous segment\n", "Setting up band-pass filter from 4 - 38 Hz\n", "\n", "FIR filter parameters\n", "---------------------\n", "Designing a one-pass, zero-phase, non-causal bandpass filter:\n", "- Windowed time-domain design (firwin) method\n", "- Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation\n", "- Lower passband edge: 4.00\n", "- Lower transition bandwidth: 2.00 Hz (-6 dB cutoff frequency: 3.00 Hz)\n", "- Upper passband edge: 38.00 Hz\n", "- Upper transition bandwidth: 9.50 Hz (-6 dB cutoff frequency: 42.75 Hz)\n", "- Filter length: 413 samples (1.652 sec)\n", "\n", "Filtering raw data in 1 contiguous segment\n", "Setting up band-pass filter from 4 - 38 Hz\n", "\n", "FIR filter parameters\n", "---------------------\n", "Designing a one-pass, zero-phase, non-causal bandpass filter:\n", "- Windowed time-domain design (firwin) method\n", "- Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation\n", "- Lower passband edge: 4.00\n", "- Lower transition bandwidth: 2.00 Hz (-6 dB cutoff frequency: 3.00 Hz)\n", "- Upper passband edge: 38.00 Hz\n", "- Upper transition bandwidth: 9.50 Hz (-6 dB cutoff frequency: 42.75 Hz)\n", "- Filter length: 413 samples (1.652 sec)\n", "\n", "Filtering raw data in 1 contiguous segment\n", "Setting up band-pass filter from 4 - 38 Hz\n", "\n", "FIR filter parameters\n", "---------------------\n", "Designing a one-pass, zero-phase, non-causal bandpass filter:\n", "- Windowed time-domain design (firwin) method\n", "- Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation\n", "- Lower passband edge: 4.00\n", "- Lower transition bandwidth: 2.00 Hz (-6 dB cutoff frequency: 3.00 Hz)\n", "- Upper passband edge: 38.00 Hz\n", "- Upper transition bandwidth: 9.50 Hz (-6 dB cutoff frequency: 42.75 Hz)\n", "- Filter length: 413 samples (1.652 sec)\n", "\n", "Filtering raw data in 1 contiguous segment\n", "Setting up band-pass filter from 4 - 38 Hz\n", "\n", "FIR filter parameters\n", "---------------------\n", "Designing a one-pass, zero-phase, non-causal bandpass filter:\n", "- Windowed time-domain design (firwin) method\n", "- Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation\n", "- Lower passband edge: 4.00\n", "- Lower transition bandwidth: 2.00 Hz (-6 dB cutoff frequency: 3.00 Hz)\n", "- Upper passband edge: 38.00 Hz\n", "- Upper transition bandwidth: 9.50 Hz (-6 dB cutoff frequency: 42.75 Hz)\n", "- Filter length: 413 samples (1.652 sec)\n", "\n", "Filtering raw data in 1 contiguous segment\n", "Setting up band-pass filter from 4 - 38 Hz\n", "\n", "FIR filter parameters\n", "---------------------\n", "Designing a one-pass, zero-phase, non-causal bandpass filter:\n", "- Windowed time-domain design (firwin) method\n", "- Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation\n", "- Lower passband edge: 4.00\n", "- Lower transition bandwidth: 2.00 Hz (-6 dB cutoff frequency: 3.00 Hz)\n", "- Upper passband edge: 38.00 Hz\n", "- Upper transition bandwidth: 9.50 Hz (-6 dB cutoff frequency: 42.75 Hz)\n", "- Filter length: 413 samples (1.652 sec)\n", "\n", "Filtering raw data in 1 contiguous segment\n", "Setting up band-pass filter from 4 - 38 Hz\n", "\n", "FIR filter parameters\n", "---------------------\n", "Designing a one-pass, zero-phase, non-causal bandpass filter:\n", "- Windowed time-domain design (firwin) method\n", "- Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation\n", "- Lower passband edge: 4.00\n", "- Lower transition bandwidth: 2.00 Hz (-6 dB cutoff frequency: 3.00 Hz)\n", "- Upper passband edge: 38.00 Hz\n", "- Upper transition bandwidth: 9.50 Hz (-6 dB cutoff frequency: 42.75 Hz)\n", "- Filter length: 413 samples (1.652 sec)\n", "\n", "Filtering raw data in 1 contiguous segment\n", "Setting up band-pass filter from 4 - 38 Hz\n", "\n", "FIR filter parameters\n", "---------------------\n", "Designing a one-pass, zero-phase, non-causal bandpass filter:\n", "- Windowed time-domain design (firwin) method\n", "- Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation\n", "- Lower passband edge: 4.00\n", "- Lower transition bandwidth: 2.00 Hz (-6 dB cutoff frequency: 3.00 Hz)\n", "- Upper passband edge: 38.00 Hz\n", "- Upper transition bandwidth: 9.50 Hz (-6 dB cutoff frequency: 42.75 Hz)\n", "- Filter length: 413 samples (1.652 sec)\n", "\n", "Filtering raw data in 1 contiguous segment\n", "Setting up band-pass filter from 4 - 38 Hz\n", "\n", "FIR filter parameters\n", "---------------------\n", "Designing a one-pass, zero-phase, non-causal bandpass filter:\n", "- Windowed time-domain design (firwin) method\n", "- Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation\n", "- Lower passband edge: 4.00\n", "- Lower transition bandwidth: 2.00 Hz (-6 dB cutoff frequency: 3.00 Hz)\n", "- Upper passband edge: 38.00 Hz\n", "- Upper transition bandwidth: 9.50 Hz (-6 dB cutoff frequency: 42.75 Hz)\n", "- Filter length: 413 samples (1.652 sec)\n", "\n", "Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']\n", "48 matching events found\n", "No baseline correction applied\n", "Adding metadata with 4 columns\n", "0 projection items activated\n", "Loading data for 48 events and 1125 original time points ...\n", "0 bad epochs dropped\n", "0 bad epochs dropped\n", "Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']\n", "48 matching events found\n", "No baseline correction applied\n", "Adding metadata with 4 columns\n", "0 projection items activated\n", "Loading data for 48 events and 1125 original time points ...\n", "0 bad epochs dropped\n", "0 bad epochs dropped\n", "Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']\n", "48 matching events found\n", "No baseline correction applied\n", "Adding metadata with 4 columns\n", "0 projection items activated\n", "Loading data for 48 events and 1125 original time points ...\n", "0 bad epochs dropped\n", "0 bad epochs dropped\n", "Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']\n", "48 matching events found\n", "No baseline correction applied\n", "Adding metadata with 4 columns\n", "0 projection items activated\n", "Loading data for 48 events and 1125 original time points ...\n", "0 bad epochs dropped\n", "0 bad epochs dropped\n", "Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']\n", "48 matching events found\n", "No baseline correction applied\n", "Adding metadata with 4 columns\n", "0 projection items activated\n", "Loading data for 48 events and 1125 original time points ...\n", "0 bad epochs dropped\n", "0 bad epochs dropped\n", "Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']\n", "48 matching events found\n", "No baseline correction applied\n", "Adding metadata with 4 columns\n", "0 projection items activated\n", "Loading data for 48 events and 1125 original time points ...\n", "0 bad epochs dropped\n", "0 bad epochs dropped\n", "Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']\n", "48 matching events found\n", "No baseline correction applied\n", "Adding metadata with 4 columns\n", "0 projection items activated\n", "Loading data for 48 events and 1125 original time points ...\n", "0 bad epochs dropped\n", "0 bad epochs dropped\n", "Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']\n", "48 matching events found\n", "No baseline correction applied\n", "Adding metadata with 4 columns\n", "0 projection items activated\n", "Loading data for 48 events and 1125 original time points ...\n", "0 bad epochs dropped\n", "0 bad epochs dropped\n", "Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']\n", "48 matching events found\n", "No baseline correction applied\n", "Adding metadata with 4 columns\n", "0 projection items activated\n", "Loading data for 48 events and 1125 original time points ...\n", "0 bad epochs dropped\n", "0 bad epochs dropped\n", "Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']\n", "48 matching events found\n", "No baseline correction applied\n", "Adding metadata with 4 columns\n", "0 projection items activated\n", "Loading data for 48 events and 1125 original time points ...\n", "0 bad epochs dropped\n", "0 bad epochs dropped\n", "Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']\n", "48 matching events found\n", "No baseline correction applied\n", "Adding metadata with 4 columns\n", "0 projection items activated\n", "Loading data for 48 events and 1125 original time points ...\n", "0 bad epochs dropped\n", "0 bad epochs dropped\n", "Used Annotations descriptions: ['feet', 'left_hand', 'right_hand', 'tongue']\n", "48 matching events found\n", "No baseline correction applied\n", "Adding metadata with 4 columns\n", "0 projection items activated\n", "Loading data for 48 events and 1125 original time points ...\n", "0 bad epochs dropped\n", "0 bad epochs dropped\n", " epoch train_accuracy train_loss valid_accuracy valid_loss dur\n", "------- ---------------- ------------ ---------------- ------------ ------\n", " 1 \u001b[36m0.2500\u001b[0m \u001b[32m1.6148\u001b[0m \u001b[35m0.2500\u001b[0m \u001b[31m5.8149\u001b[0m 1.1785\n", " 2 0.2500 \u001b[32m1.2112\u001b[0m 0.2500 6.9776 0.5048\n", " 3 \u001b[36m0.2674\u001b[0m \u001b[32m1.0564\u001b[0m \u001b[35m0.2569\u001b[0m \u001b[31m5.4244\u001b[0m 0.5404\n", " 4 \u001b[36m0.2882\u001b[0m \u001b[32m0.9659\u001b[0m \u001b[35m0.2604\u001b[0m \u001b[31m4.1689\u001b[0m 0.5710\n" ] } ], "source": [ "pipe = pipe.fit(dataset, y=None, classifier__epochs=n_epochs)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 576x216 with 2 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "from matplotlib.lines import Line2D\n", "import pandas as pd\n", "# Extract loss and accuracy values for plotting from history object\n", "results_columns = ['train_loss', 'valid_loss', 'train_accuracy', 'valid_accuracy']\n", "df = pd.DataFrame(pipe.steps[-1][1].history[:, results_columns], columns=results_columns,\n", " index=pipe.steps[-1][1].history[:, 'epoch'])\n", "\n", "# get percent of misclass for better visual comparison to loss\n", "df = df.assign(train_misclass=100 - 100 * df.train_accuracy,\n", " valid_misclass=100 - 100 * df.valid_accuracy)\n", "\n", "plt.style.use('seaborn')\n", "fig, ax1 = plt.subplots(figsize=(8, 3))\n", "df.loc[:, ['train_loss', 'valid_loss']].plot(\n", " ax=ax1, style=['-', ':'], marker='o', color='tab:blue', legend=False, fontsize=14)\n", "\n", "ax1.tick_params(axis='y', labelcolor='tab:blue', labelsize=14)\n", "ax1.set_ylabel(\"Loss\", color='tab:blue', fontsize=14)\n", "\n", "ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis\n", "\n", "df.loc[:, ['train_misclass', 'valid_misclass']].plot(\n", " ax=ax2, style=['-', ':'], marker='o', color='tab:red', legend=False)\n", "ax2.tick_params(axis='y', labelcolor='tab:red', labelsize=14)\n", "ax2.set_ylabel(\"Misclassification Rate [%]\", color='tab:red', fontsize=14)\n", "ax2.set_ylim(ax2.get_ylim()[0], 85) # make some room for legend\n", "ax1.set_xlabel(\"Epoch\", fontsize=14)\n", "\n", "# where some data has already been plotted to ax\n", "handles = []\n", "handles.append(Line2D([0], [0], color='black', linewidth=1, linestyle='-', label='Train'))\n", "handles.append(Line2D([0], [0], color='black', linewidth=1, linestyle=':', label='Valid'))\n", "plt.legend(handles, [h.get_label() for h in handles], fontsize=14)\n", "plt.tight_layout()" ] } ], "metadata": { "kernelspec": { "display_name": "new_braindecode", "language": "python", "name": "new_braindecode" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 2 }