{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true, "nbsphinx": "hidden" }, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2\n", "import os\n", "os.sys.path.insert(0, '/home/schirrmr/braindecode/code/braindecode/')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Cropped Decoding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we will use cropped decoding. Cropped decoding means the ConvNet is trained on time windows/time crops within the trials. We will explain this visually by comparing trialwise to cropped decoding.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Trialwise Decoding | Cropped Decoding\n", "- | - \n", "![Trialwise Decoding](./trialwise_explanation.png \"Trialwise Decoding\") | ![Cropped Decoding](./cropped_explanation.png \"Cropped Decoding\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On the left, you see trialwise decoding:\n", "\n", "1. A complete trial is pushed through the network\n", "2. The network produces a prediction\n", "3. The prediction is compared to the target (label) for that trial to compute the loss\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On the right, you see cropped decoding:\n", "\n", "1. Instead of a complete trial, windows within the trial, here called *crops*, are pushed through the network\n", "2. For computational efficiency, multiple neighbouring crops are pushed through the network simultaneously (these neighbouring crops are called a *supercrop*)\n", "3. Therefore, the network produces multiple predictions (one per crop in the supercrop)\n", "4. The individual crop predictions are averaged before computing the loss function\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notes:\n", "\n", "* The network architecture implicitly defines the crop size (it is the receptive field size, i.e., the number of timesteps the network uses to make a single prediction)\n", "* The supercrop size is a user-defined hyperparameter, called `input_time_length` in Braindecode. It mostly affects runtime (larger supercrop sizes should be faster). As a rule of thumb, you can set it to two times the crop size.\n", "* Crop size and supercrop size together define how many predictions the network makes per supercrop: $\\mathrm{\\#supercrop}-\\mathrm{\\#crop}+1=\\mathrm{\\#predictions}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For cropped decoding, the above training setup is mathematically identical to sampling crops in your dataset, pushing them through the network and training directly on the individual crops. At the same time, the above training setup is much faster as it avoids redundant computations by using dilated convolutions, see our paper [Deep learning with convolutional neural networks for EEG decoding and visualization](https://arxiv.org/abs/1703.05051). However, the two setups are only mathematically identical in case (1) your network does not use any padding and (2) your loss function leads to the same gradients when using the averaged output. The first is true for our shallow and deep ConvNet models and the second is true for the log-softmax outputs and negative log likelihood loss that is typically used for classification in PyTorch." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Most of the code for cropped decoding is identical to the [Trialwise Decoding Tutorial](Trialwise_Decoding.html), differences are explained in the text." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Enable logging" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import logging\n", "import importlib\n", "importlib.reload(logging) # see https://stackoverflow.com/a/21475297/1469195\n", "log = logging.getLogger()\n", "log.setLevel('INFO')\n", "import sys\n", "logging.basicConfig(format='%(asctime)s %(levelname)s : %(message)s',\n", " level=logging.INFO, stream=sys.stdout)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load data" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import mne\n", "from mne.io import concatenate_raws\n", "\n", "# 5,6,7,10,13,14 are codes for executed and imagined hands/feet\n", "subject_id = 22\n", "event_codes = [5,6,9,10,13,14]\n", "#event_codes = [3,4,5,6,7,8,9,10,11,12,13,14]\n", "\n", "# This will download the files if you don't have them yet,\n", "# and then return the paths to the files.\n", "physionet_paths = mne.datasets.eegbci.load_data(subject_id, event_codes)\n", "\n", "# Load each of the files\n", "parts = [mne.io.read_raw_edf(path, preload=True,stim_channel='auto', verbose='WARNING')\n", " for path in physionet_paths]\n", "\n", "# Concatenate them\n", "raw = concatenate_raws(parts)\n", "\n", "# Find the events in this dataset\n", "events, _ = mne.events_from_annotations(raw)\n", "\n", "# Use only EEG channels\n", "eeg_channel_inds = mne.pick_types(raw.info, meg=False, eeg=True, stim=False, eog=False,\n", " exclude='bads')\n", "\n", "# Extract trials, only using EEG channels\n", "epoched = mne.Epochs(raw, events, dict(hands_or_left=2, feet_or_right=3), tmin=1, tmax=4.1, proj=False, picks=eeg_channel_inds,\n", " baseline=None, preload=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Convert data to Braindecode format" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "# Convert data from volt to millivolt\n", "# Pytorch expects float32 for input and int64 for labels.\n", "X = (epoched.get_data() * 1e6).astype(np.float32)\n", "y = (epoched.events[:,2] - 2).astype(np.int64) #2,3 -> 0,1" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from braindecode.datautil.signal_target import SignalAndTarget\n", "\n", "train_set = SignalAndTarget(X[:40], y=y[:40])\n", "valid_set = SignalAndTarget(X[40:70], y=y[40:70])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create the model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "As in the trialwise decoding tutorial, we will use the Braindecode model class directly to perform the training in a few lines of code. If you instead want to use your own training loop, have a look at the [Cropped Manual Training Loop Tutorial](./Cropped_Manual_Training_Loop.html).\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For cropped decoding, we now transform the model into a model that outputs a dense time series of predictions.\n", "For this, we manually set the length of the final convolution layer to some length that makes the receptive field of the ConvNet smaller than the number of samples in a trial (see `final_conv_length=12` in the model definition). " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true, "scrolled": false }, "outputs": [], "source": [ "from braindecode.models.shallow_fbcsp import ShallowFBCSPNet\n", "from torch import nn\n", "from braindecode.torch_ext.util import set_random_seeds\n", "\n", "# Set if you want to use GPU\n", "# You can also use torch.cuda.is_available() to determine if cuda is available on your machine.\n", "cuda = False\n", "set_random_seeds(seed=20170629, cuda=cuda)\n", "n_classes = 2\n", "in_chans = train_set.X.shape[1]\n", "\n", "model = ShallowFBCSPNet(in_chans=in_chans, n_classes=n_classes,\n", " input_time_length=None,\n", " final_conv_length=12)\n", "if cuda:\n", " model.cuda()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we supply `cropped=True` to our compile function " ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from braindecode.torch_ext.optimizers import AdamW\n", "import torch.nn.functional as F\n", "#optimizer = AdamW(model.parameters(), lr=1*0.01, weight_decay=0.5*0.001) # these are good values for the deep model\n", "optimizer = AdamW(model.parameters(), lr=0.0625 * 0.01, weight_decay=0)\n", "model.compile(loss=F.nll_loss, optimizer=optimizer, iterator_seed=1, cropped=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Run the training" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For fitting, we must supply the super crop size. Here, we it to 450 by setting `input_time_length = 450`." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2019-05-27 13:48:25,992 INFO : Run until first stop...\n", "2019-05-27 13:48:28,722 INFO : Epoch 0\n", "2019-05-27 13:48:28,736 INFO : train_loss 16.71894\n", "2019-05-27 13:48:28,737 INFO : valid_loss 16.03879\n", "2019-05-27 13:48:28,738 INFO : train_misclass 0.52500\n", "2019-05-27 13:48:28,738 INFO : valid_misclass 0.53333\n", "2019-05-27 13:48:28,739 INFO : runtime 0.00000\n", "2019-05-27 13:48:28,740 INFO : \n", "2019-05-27 13:48:32,953 INFO : Time only for training updates: 4.21s\n", "2019-05-27 13:48:35,792 INFO : Epoch 1\n", "2019-05-27 13:48:35,806 INFO : train_loss 5.75666\n", "2019-05-27 13:48:35,807 INFO : valid_loss 5.05206\n", "2019-05-27 13:48:35,808 INFO : train_misclass 0.52500\n", "2019-05-27 13:48:35,809 INFO : valid_misclass 0.53333\n", "2019-05-27 13:48:35,810 INFO : runtime 6.95663\n", "2019-05-27 13:48:35,810 INFO : \n", "2019-05-27 13:48:39,861 INFO : Time only for training updates: 4.05s\n", "2019-05-27 13:48:42,728 INFO : Epoch 2\n", "2019-05-27 13:48:42,740 INFO : train_loss 3.64768\n", "2019-05-27 13:48:42,741 INFO : valid_loss 3.01621\n", "2019-05-27 13:48:42,742 INFO : train_misclass 0.50000\n", "2019-05-27 13:48:42,743 INFO : valid_misclass 0.53333\n", "2019-05-27 13:48:42,743 INFO : runtime 6.90803\n", "2019-05-27 13:48:42,745 INFO : \n", "2019-05-27 13:48:47,101 INFO : Time only for training updates: 4.35s\n", "2019-05-27 13:48:50,364 INFO : Epoch 3\n", "2019-05-27 13:48:50,375 INFO : train_loss 2.34256\n", "2019-05-27 13:48:50,376 INFO : valid_loss 1.90961\n", "2019-05-27 13:48:50,377 INFO : train_misclass 0.50000\n", "2019-05-27 13:48:50,377 INFO : valid_misclass 0.53333\n", "2019-05-27 13:48:50,378 INFO : runtime 7.24010\n", "2019-05-27 13:48:50,379 INFO : \n", "2019-05-27 13:48:54,500 INFO : Time only for training updates: 4.12s\n", "2019-05-27 13:48:57,328 INFO : Epoch 4\n", "2019-05-27 13:48:57,329 INFO : train_loss 1.50676\n", "2019-05-27 13:48:57,330 INFO : valid_loss 1.29046\n", "2019-05-27 13:48:57,330 INFO : train_misclass 0.47500\n", "2019-05-27 13:48:57,331 INFO : valid_misclass 0.50000\n", "2019-05-27 13:48:57,331 INFO : runtime 7.39941\n", "2019-05-27 13:48:57,332 INFO : \n", "2019-05-27 13:49:01,566 INFO : Time only for training updates: 4.23s\n", "2019-05-27 13:49:04,563 INFO : Epoch 5\n", "2019-05-27 13:49:04,564 INFO : train_loss 1.01924\n", "2019-05-27 13:49:04,565 INFO : valid_loss 0.96845\n", "2019-05-27 13:49:04,565 INFO : train_misclass 0.40000\n", "2019-05-27 13:49:04,566 INFO : valid_misclass 0.43333\n", "2019-05-27 13:49:04,567 INFO : runtime 7.06577\n", "2019-05-27 13:49:04,567 INFO : \n", "2019-05-27 13:49:08,780 INFO : Time only for training updates: 4.21s\n", "2019-05-27 13:49:11,724 INFO : Epoch 6\n", "2019-05-27 13:49:11,725 INFO : train_loss 0.75856\n", "2019-05-27 13:49:11,725 INFO : valid_loss 0.82128\n", "2019-05-27 13:49:11,726 INFO : train_misclass 0.35000\n", "2019-05-27 13:49:11,727 INFO : valid_misclass 0.43333\n", "2019-05-27 13:49:11,727 INFO : runtime 7.21428\n", "2019-05-27 13:49:11,728 INFO : \n", "2019-05-27 13:49:14,435 INFO : Time only for training updates: 2.70s\n", "2019-05-27 13:49:15,841 INFO : Epoch 7\n", "2019-05-27 13:49:15,842 INFO : train_loss 0.61156\n", "2019-05-27 13:49:15,843 INFO : valid_loss 0.75854\n", "2019-05-27 13:49:15,844 INFO : train_misclass 0.30000\n", "2019-05-27 13:49:15,844 INFO : valid_misclass 0.43333\n", "2019-05-27 13:49:15,845 INFO : runtime 5.65511\n", "2019-05-27 13:49:15,845 INFO : \n", "2019-05-27 13:49:17,842 INFO : Time only for training updates: 1.99s\n", "2019-05-27 13:49:19,281 INFO : Epoch 8\n", "2019-05-27 13:49:19,282 INFO : train_loss 0.51892\n", "2019-05-27 13:49:19,283 INFO : valid_loss 0.74045\n", "2019-05-27 13:49:19,283 INFO : train_misclass 0.25000\n", "2019-05-27 13:49:19,284 INFO : valid_misclass 0.36667\n", "2019-05-27 13:49:19,285 INFO : runtime 3.40579\n", "2019-05-27 13:49:19,285 INFO : \n", "2019-05-27 13:49:21,225 INFO : Time only for training updates: 1.94s\n", "2019-05-27 13:49:22,572 INFO : Epoch 9\n", "2019-05-27 13:49:22,573 INFO : train_loss 0.43383\n", "2019-05-27 13:49:22,574 INFO : valid_loss 0.71042\n", "2019-05-27 13:49:22,574 INFO : train_misclass 0.20000\n", "2019-05-27 13:49:22,575 INFO : valid_misclass 0.30000\n", "2019-05-27 13:49:22,576 INFO : runtime 3.38393\n", "2019-05-27 13:49:22,576 INFO : \n", "2019-05-27 13:49:24,529 INFO : Time only for training updates: 1.95s\n", "2019-05-27 13:49:25,871 INFO : Epoch 10\n", "2019-05-27 13:49:25,872 INFO : train_loss 0.34278\n", "2019-05-27 13:49:25,873 INFO : valid_loss 0.65221\n", "2019-05-27 13:49:25,873 INFO : train_misclass 0.17500\n", "2019-05-27 13:49:25,874 INFO : valid_misclass 0.26667\n", "2019-05-27 13:49:25,874 INFO : runtime 3.30348\n", "2019-05-27 13:49:25,875 INFO : \n", "2019-05-27 13:49:27,789 INFO : Time only for training updates: 1.91s\n", "2019-05-27 13:49:29,232 INFO : Epoch 11\n", "2019-05-27 13:49:29,233 INFO : train_loss 0.27082\n", "2019-05-27 13:49:29,234 INFO : valid_loss 0.60061\n", "2019-05-27 13:49:29,235 INFO : train_misclass 0.15000\n", "2019-05-27 13:49:29,236 INFO : valid_misclass 0.26667\n", "2019-05-27 13:49:29,236 INFO : runtime 3.26077\n", "2019-05-27 13:49:29,237 INFO : \n", "2019-05-27 13:49:31,249 INFO : Time only for training updates: 2.01s\n", "2019-05-27 13:49:32,650 INFO : Epoch 12\n", "2019-05-27 13:49:32,651 INFO : train_loss 0.21861\n", "2019-05-27 13:49:32,652 INFO : valid_loss 0.56316\n", "2019-05-27 13:49:32,652 INFO : train_misclass 0.02500\n", "2019-05-27 13:49:32,653 INFO : valid_misclass 0.26667\n", "2019-05-27 13:49:32,654 INFO : runtime 3.45901\n", "2019-05-27 13:49:32,654 INFO : \n", "2019-05-27 13:49:34,595 INFO : Time only for training updates: 1.94s\n", "2019-05-27 13:49:35,937 INFO : Epoch 13\n", "2019-05-27 13:49:35,938 INFO : train_loss 0.18199\n", "2019-05-27 13:49:35,939 INFO : valid_loss 0.53569\n", "2019-05-27 13:49:35,939 INFO : train_misclass 0.00000\n", "2019-05-27 13:49:35,940 INFO : valid_misclass 0.23333\n", "2019-05-27 13:49:35,940 INFO : runtime 3.34639\n", "2019-05-27 13:49:35,941 INFO : \n", "2019-05-27 13:49:37,856 INFO : Time only for training updates: 1.91s\n", "2019-05-27 13:49:39,194 INFO : Epoch 14\n", "2019-05-27 13:49:39,195 INFO : train_loss 0.15484\n", "2019-05-27 13:49:39,196 INFO : valid_loss 0.50841\n", "2019-05-27 13:49:39,196 INFO : train_misclass 0.00000\n", "2019-05-27 13:49:39,197 INFO : valid_misclass 0.20000\n", "2019-05-27 13:49:39,197 INFO : runtime 3.26092\n", "2019-05-27 13:49:39,198 INFO : \n", "2019-05-27 13:49:41,124 INFO : Time only for training updates: 1.92s\n", "2019-05-27 13:49:42,468 INFO : Epoch 15\n", "2019-05-27 13:49:42,470 INFO : train_loss 0.13389\n", "2019-05-27 13:49:42,470 INFO : valid_loss 0.48080\n", "2019-05-27 13:49:42,471 INFO : train_misclass 0.00000\n", "2019-05-27 13:49:42,471 INFO : valid_misclass 0.16667\n", "2019-05-27 13:49:42,472 INFO : runtime 3.26746\n", "2019-05-27 13:49:42,473 INFO : \n", "2019-05-27 13:49:44,442 INFO : Time only for training updates: 1.96s\n", "2019-05-27 13:49:45,779 INFO : Epoch 16\n", "2019-05-27 13:49:45,780 INFO : train_loss 0.11739\n", "2019-05-27 13:49:45,781 INFO : valid_loss 0.45401\n", "2019-05-27 13:49:45,781 INFO : train_misclass 0.00000\n", "2019-05-27 13:49:45,782 INFO : valid_misclass 0.13333\n", "2019-05-27 13:49:45,783 INFO : runtime 3.31831\n", "2019-05-27 13:49:45,783 INFO : \n", "2019-05-27 13:49:47,699 INFO : Time only for training updates: 1.91s\n", "2019-05-27 13:49:49,038 INFO : Epoch 17\n", "2019-05-27 13:49:49,040 INFO : train_loss 0.10472\n", "2019-05-27 13:49:49,040 INFO : valid_loss 0.43017\n", "2019-05-27 13:49:49,041 INFO : train_misclass 0.00000\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "2019-05-27 13:49:49,042 INFO : valid_misclass 0.16667\n", "2019-05-27 13:49:49,042 INFO : runtime 3.25675\n", "2019-05-27 13:49:49,043 INFO : \n", "2019-05-27 13:49:50,972 INFO : Time only for training updates: 1.92s\n", "2019-05-27 13:49:52,316 INFO : Epoch 18\n", "2019-05-27 13:49:52,317 INFO : train_loss 0.09406\n", "2019-05-27 13:49:52,318 INFO : valid_loss 0.40693\n", "2019-05-27 13:49:52,318 INFO : train_misclass 0.00000\n", "2019-05-27 13:49:52,319 INFO : valid_misclass 0.16667\n", "2019-05-27 13:49:52,320 INFO : runtime 3.27348\n", "2019-05-27 13:49:52,320 INFO : \n", "2019-05-27 13:49:54,240 INFO : Time only for training updates: 1.91s\n", "2019-05-27 13:49:55,578 INFO : Epoch 19\n", "2019-05-27 13:49:55,579 INFO : train_loss 0.08521\n", "2019-05-27 13:49:55,579 INFO : valid_loss 0.38600\n", "2019-05-27 13:49:55,580 INFO : train_misclass 0.00000\n", "2019-05-27 13:49:55,581 INFO : valid_misclass 0.13333\n", "2019-05-27 13:49:55,581 INFO : runtime 3.26806\n", "2019-05-27 13:49:55,582 INFO : \n", "2019-05-27 13:49:57,498 INFO : Time only for training updates: 1.91s\n", "2019-05-27 13:49:59,176 INFO : Epoch 20\n", "2019-05-27 13:49:59,177 INFO : train_loss 0.07795\n", "2019-05-27 13:49:59,178 INFO : valid_loss 0.36742\n", "2019-05-27 13:49:59,179 INFO : train_misclass 0.00000\n", "2019-05-27 13:49:59,179 INFO : valid_misclass 0.13333\n", "2019-05-27 13:49:59,180 INFO : runtime 3.25760\n", "2019-05-27 13:49:59,182 INFO : \n", "2019-05-27 13:50:01,469 INFO : Time only for training updates: 2.28s\n", "2019-05-27 13:50:02,840 INFO : Epoch 21\n", "2019-05-27 13:50:02,841 INFO : train_loss 0.07171\n", "2019-05-27 13:50:02,842 INFO : valid_loss 0.35085\n", "2019-05-27 13:50:02,843 INFO : train_misclass 0.00000\n", "2019-05-27 13:50:02,843 INFO : valid_misclass 0.10000\n", "2019-05-27 13:50:02,844 INFO : runtime 3.97155\n", "2019-05-27 13:50:02,844 INFO : \n", "2019-05-27 13:50:05,975 INFO : Time only for training updates: 3.13s\n", "2019-05-27 13:50:08,928 INFO : Epoch 22\n", "2019-05-27 13:50:08,931 INFO : train_loss 0.06681\n", "2019-05-27 13:50:08,933 INFO : valid_loss 0.33726\n", "2019-05-27 13:50:08,934 INFO : train_misclass 0.00000\n", "2019-05-27 13:50:08,936 INFO : valid_misclass 0.10000\n", "2019-05-27 13:50:08,940 INFO : runtime 4.50735\n", "2019-05-27 13:50:08,942 INFO : \n", "2019-05-27 13:50:12,972 INFO : Time only for training updates: 4.02s\n", "2019-05-27 13:50:15,773 INFO : Epoch 23\n", "2019-05-27 13:50:15,775 INFO : train_loss 0.06289\n", "2019-05-27 13:50:15,777 INFO : valid_loss 0.32600\n", "2019-05-27 13:50:15,779 INFO : train_misclass 0.00000\n", "2019-05-27 13:50:15,780 INFO : valid_misclass 0.10000\n", "2019-05-27 13:50:15,782 INFO : runtime 6.99638\n", "2019-05-27 13:50:15,784 INFO : \n", "2019-05-27 13:50:19,843 INFO : Time only for training updates: 4.05s\n", "2019-05-27 13:50:22,641 INFO : Epoch 24\n", "2019-05-27 13:50:22,644 INFO : train_loss 0.05999\n", "2019-05-27 13:50:22,646 INFO : valid_loss 0.31735\n", "2019-05-27 13:50:22,648 INFO : train_misclass 0.00000\n", "2019-05-27 13:50:22,649 INFO : valid_misclass 0.10000\n", "2019-05-27 13:50:22,651 INFO : runtime 6.87178\n", "2019-05-27 13:50:22,653 INFO : \n", "2019-05-27 13:50:26,612 INFO : Time only for training updates: 3.95s\n", "2019-05-27 13:50:29,313 INFO : Epoch 25\n", "2019-05-27 13:50:29,316 INFO : train_loss 0.05785\n", "2019-05-27 13:50:29,318 INFO : valid_loss 0.31063\n", "2019-05-27 13:50:29,334 INFO : train_misclass 0.00000\n", "2019-05-27 13:50:29,335 INFO : valid_misclass 0.10000\n", "2019-05-27 13:50:29,337 INFO : runtime 6.76969\n", "2019-05-27 13:50:29,339 INFO : \n", "2019-05-27 13:50:33,272 INFO : Time only for training updates: 3.93s\n", "2019-05-27 13:50:36,087 INFO : Epoch 26\n", "2019-05-27 13:50:36,090 INFO : train_loss 0.05635\n", "2019-05-27 13:50:36,091 INFO : valid_loss 0.30562\n", "2019-05-27 13:50:36,093 INFO : train_misclass 0.00000\n", "2019-05-27 13:50:36,095 INFO : valid_misclass 0.10000\n", "2019-05-27 13:50:36,096 INFO : runtime 6.65909\n", "2019-05-27 13:50:36,098 INFO : \n", "2019-05-27 13:50:40,122 INFO : Time only for training updates: 4.02s\n", "2019-05-27 13:50:42,913 INFO : Epoch 27\n", "2019-05-27 13:50:42,916 INFO : train_loss 0.05532\n", "2019-05-27 13:50:42,919 INFO : valid_loss 0.30180\n", "2019-05-27 13:50:42,921 INFO : train_misclass 0.00000\n", "2019-05-27 13:50:42,922 INFO : valid_misclass 0.10000\n", "2019-05-27 13:50:42,924 INFO : runtime 6.84971\n", "2019-05-27 13:50:42,926 INFO : \n", "2019-05-27 13:50:46,889 INFO : Time only for training updates: 3.96s\n", "2019-05-27 13:50:49,706 INFO : Epoch 28\n", "2019-05-27 13:50:49,709 INFO : train_loss 0.05461\n", "2019-05-27 13:50:49,711 INFO : valid_loss 0.29879\n", "2019-05-27 13:50:49,713 INFO : train_misclass 0.00000\n", "2019-05-27 13:50:49,714 INFO : valid_misclass 0.10000\n", "2019-05-27 13:50:49,716 INFO : runtime 6.76746\n", "2019-05-27 13:50:49,718 INFO : \n", "2019-05-27 13:50:53,661 INFO : Time only for training updates: 3.94s\n", "2019-05-27 13:50:56,538 INFO : Epoch 29\n", "2019-05-27 13:50:56,541 INFO : train_loss 0.05415\n", "2019-05-27 13:50:56,543 INFO : valid_loss 0.29639\n", "2019-05-27 13:50:56,544 INFO : train_misclass 0.00000\n", "2019-05-27 13:50:56,546 INFO : valid_misclass 0.10000\n", "2019-05-27 13:50:56,548 INFO : runtime 6.77185\n", "2019-05-27 13:50:56,550 INFO : \n", "2019-05-27 13:51:00,538 INFO : Time only for training updates: 3.98s\n", "2019-05-27 13:51:03,489 INFO : Epoch 30\n", "2019-05-27 13:51:03,492 INFO : train_loss 0.05384\n", "2019-05-27 13:51:03,494 INFO : valid_loss 0.29441\n", "2019-05-27 13:51:03,496 INFO : train_misclass 0.00000\n", "2019-05-27 13:51:03,497 INFO : valid_misclass 0.10000\n", "2019-05-27 13:51:03,499 INFO : runtime 6.87712\n", "2019-05-27 13:51:03,501 INFO : \n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "input_time_length = 450\n", "model.fit(train_set.X, train_set.y, epochs=30, batch_size=64, scheduler='cosine',\n", " input_time_length=input_time_length,\n", " validation_data=(valid_set.X, valid_set.y),)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
train_lossvalid_losstrain_misclassvalid_misclassruntime
016.71894316.0387860.5250.5333330.000000
15.7566645.0520620.5250.5333336.956634
23.6476773.0162140.5000.5333336.908031
32.3425611.9096140.5000.5333337.240101
41.5067591.2904580.4750.5000007.399405
51.0192370.9684460.4000.4333337.065770
60.7585630.8212830.3500.4333337.214281
70.6115570.7585450.3000.4333335.655106
80.5189170.7404520.2500.3666673.405795
90.4338320.7104160.2000.3000003.383932
100.3427820.6522110.1750.2666673.303478
110.2708210.6006100.1500.2666673.260772
120.2186090.5631650.0250.2666673.459012
130.1819910.5356910.0000.2333333.346393
140.1548390.5084050.0000.2000003.260915
150.1338870.4807970.0000.1666673.267457
160.1173860.4540110.0000.1333333.318306
170.1047240.4301650.0000.1666673.256755
180.0940640.4069260.0000.1666673.273476
190.0852070.3860020.0000.1333333.268065
200.0779450.3674220.0000.1333333.257596
210.0717090.3508470.0000.1000003.971547
220.0668110.3372600.0000.1000004.507347
230.0628910.3259950.0000.1000006.996382
240.0599930.3173530.0000.1000006.871776
250.0578490.3106330.0000.1000006.769685
260.0563500.3056170.0000.1000006.659091
270.0553150.3017960.0000.1000006.849715
280.0546130.2987910.0000.1000006.767460
290.0541490.2963890.0000.1000006.771852
300.0538440.2944130.0000.1000006.877121
\n", "
" ], "text/plain": [ " train_loss valid_loss train_misclass valid_misclass runtime\n", "0 16.718943 16.038786 0.525 0.533333 0.000000\n", "1 5.756664 5.052062 0.525 0.533333 6.956634\n", "2 3.647677 3.016214 0.500 0.533333 6.908031\n", "3 2.342561 1.909614 0.500 0.533333 7.240101\n", "4 1.506759 1.290458 0.475 0.500000 7.399405\n", "5 1.019237 0.968446 0.400 0.433333 7.065770\n", "6 0.758563 0.821283 0.350 0.433333 7.214281\n", "7 0.611557 0.758545 0.300 0.433333 5.655106\n", "8 0.518917 0.740452 0.250 0.366667 3.405795\n", "9 0.433832 0.710416 0.200 0.300000 3.383932\n", "10 0.342782 0.652211 0.175 0.266667 3.303478\n", "11 0.270821 0.600610 0.150 0.266667 3.260772\n", "12 0.218609 0.563165 0.025 0.266667 3.459012\n", "13 0.181991 0.535691 0.000 0.233333 3.346393\n", "14 0.154839 0.508405 0.000 0.200000 3.260915\n", "15 0.133887 0.480797 0.000 0.166667 3.267457\n", "16 0.117386 0.454011 0.000 0.133333 3.318306\n", "17 0.104724 0.430165 0.000 0.166667 3.256755\n", "18 0.094064 0.406926 0.000 0.166667 3.273476\n", "19 0.085207 0.386002 0.000 0.133333 3.268065\n", "20 0.077945 0.367422 0.000 0.133333 3.257596\n", "21 0.071709 0.350847 0.000 0.100000 3.971547\n", "22 0.066811 0.337260 0.000 0.100000 4.507347\n", "23 0.062891 0.325995 0.000 0.100000 6.996382\n", "24 0.059993 0.317353 0.000 0.100000 6.871776\n", "25 0.057849 0.310633 0.000 0.100000 6.769685\n", "26 0.056350 0.305617 0.000 0.100000 6.659091\n", "27 0.055315 0.301796 0.000 0.100000 6.849715\n", "28 0.054613 0.298791 0.000 0.100000 6.767460\n", "29 0.054149 0.296389 0.000 0.100000 6.771852\n", "30 0.053844 0.294413 0.000 0.100000 6.877121" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.epochs_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Eventually, we arrive at 90% accuracy, so 27 from 30 trials are correctly predicted." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluation" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'loss': 0.4238094389438629,\n", " 'misclass': 0.09999999999999998,\n", " 'runtime': 0.00041961669921875}" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_set = SignalAndTarget(X[70:], y=y[70:])\n", "\n", "model.evaluate(test_set.X, test_set.y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now predict entire trials as before or individual crops." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.predict_classes(test_set.X)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-1.2750863e+00, -4.7210640e-01],\n", " [-6.4165510e-02, -3.2850025e+00],\n", " [-1.2179451e+00, -9.6833640e-01],\n", " [-9.6923895e-02, -2.7711761e+00],\n", " [-1.5608791e-02, -4.4860415e+00],\n", " [-3.0281614e-03, -6.5692320e+00],\n", " [-3.3592165e+00, -9.9474899e-02],\n", " [-5.2215487e-01, -1.3793353e+00],\n", " [-7.2297215e-02, -3.2223554e+00],\n", " [-1.8260284e-01, -2.6842451e+00],\n", " [-1.1441530e+00, -5.1276696e-01],\n", " [-2.6686563e+00, -2.3944007e-01],\n", " [-3.9805791e-01, -1.4446534e+00],\n", " [-8.5448694e-01, -5.9342915e-01],\n", " [-4.0538985e-01, -1.5777966e+00],\n", " [-1.4246053e+00, -4.7016972e-01],\n", " [-1.7791660e+00, -3.6660773e-01],\n", " [-1.0101254e+00, -6.9896615e-01],\n", " [-2.7277711e-01, -2.1119595e+00],\n", " [-1.4588629e+00, -4.5223159e-01]], dtype=float32)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.predict_outs(test_set.X)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For individual crops, provide `individual_crops=True`. This for example can be useful to plot accuracies over time:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Accuracy [%]')" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nTl8sC+8AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "from matplotlib import cm\n", "import matplotlib\n", "%matplotlib inline\n", "matplotlib.style.use('seaborn')\n", "labels_per_trial_per_crop = model.predict_classes(test_set.X, individual_crops=True)\n", "accs_per_crop = [l == y for l,y in zip(labels_per_trial_per_crop, test_set.y)]\n", "accs_per_crop = np.mean(accs_per_crop, axis=0)\n", "plt.figure(figsize=(8,3))\n", "plt.plot(accs_per_crop * 100)\n", "plt.title(\"Accuracies per timestep\", fontsize=16)\n", "plt.xlabel('Timestep in trial', fontsize=14)\n", "plt.ylabel('Accuracy [%]', fontsize=14)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Raw outputs could be used to visualize a prediction probability across a trial. Here we look at the first trial." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Probabilities')" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n/6m216alpaVtlhIWbX197bVtbW0tH374IVVVVdjZ2bF27VrRtl2gUCgwNDQEYOvWrcyYMYPjx4+L\n47aHDPlkLl1naVah80aOHMljjz3G7NmzyczM5P7770elUmmfv7q9ha758zF6pU3Fsdw9wsPD8fLy\nwt3dnY8//pgNGzYwduzYVtuItu24iIgItm3bxhdffEFYWJj2cXHcdq8h381+vaVZhc7z9PTUdqO5\nu7tjbW1NVVUVDQ0NQMvytn/u0hS6xsDAoE2btncsi6WEO2/OnDnahZ7mzJlDamqqaNsuOnbsGP/9\n73/59NNPMTExEcdtDxryyfx6S7MKnbdt2zY2bdoEQElJCWVlZSxevFjbxr/++ivTp0/vyxAHhSlT\nprRp07FjxxIfH09VVRW1tbWcO3eOoKCgPo504Fm9ejX5+flAy9iE4cOHi7btgurqat566y0++eQT\nzM3NAXHc9iSxahqwfv16oqKitEuzjhw5sq9DGrAuX77MM888Q11dHU1NTTz++OOMGjWK5557jsbG\nRhwdHXnjjTfQ0dHp61AHjISEBN58803y8vJQKpXY2dmxfv16nn/++TZtum/fPj7//HNkMhn33nsv\nt912W1+H36+117b33HMPn3/+OYaGhhgYGPDGG29gZWUl2raTNm/ezIYNG1otZ71u3TrWrl0rjtse\nIJK5IAiCIAxwQ76bXRAEQRAGOpHMBUEQBGGAE8lcEARBEAY4kcwFQRAEYYATyVwQBEEQBjiRzAWh\nB3300UeEh4f3dRh94nqfPTIyEm9v73broN/otd3B19eXo0ePdmjbkJAQvvnmmx6LRRC6g5iaJghd\ntHbtWn7++WegpQRlc3Nzq6Vdv/jiC8aPH98nsSUnJ1NWVsa0adP65P3bs337doKDg7GysiIyMpL7\n7ruPc+fOaZca7S5VVVXs3buXpUuXdsv+QkJCeOCBB7j33nu7ZX+C0BPElbkgdNFrr71GfHw88fHx\nbNiwAUD7c3x8fJ8lcmipxHfixIk+e/+raTQa3njjDcrKynr8vU6dOsXmzZt7/H0EoT8RyVwQetCG\nDRtYvHgx0NK17O/vz6FDhwgJCSEgIIA33niDlJQUbr/9dgICAnj00UdpamoCWhLghx9+yJw5cxg7\ndiy3334758+f1+57x44dhIWF4e/vz/Tp0/nPf/6DJEm8/PLLfPvtt2zcuJGQkBCgpTLf//3f/zFt\n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\nQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cropped_outs = model.predict_outs(test_set.X, individual_crops=True)\n", "i_trial = 0\n", "# log-softmax outputs need to be exponentiated to get probabilities\n", "cropped_probs = np.exp(cropped_outs[i_trial])\n", "plt.figure(figsize=(8,3))\n", "plt.plot(cropped_probs.T)\n", "plt.title(\"Network probabilities for trial {:d} of class {:d}\".format(\n", " i_trial, test_set.y[i_trial]), fontsize=16)\n", "plt.legend((\"Class 0\", \"Class 1\"), fontsize=12)\n", "plt.xlabel(\"Timestep within trial\", fontsize=14)\n", "plt.ylabel(\"Probabilities\", fontsize=14)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Dataset references\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " This dataset was created and contributed to PhysioNet by the developers of the [BCI2000](http://www.schalklab.org/research/bci2000) instrumentation system, which they used in making these recordings. The system is described in:\n", " \n", " Schalk, G., McFarland, D.J., Hinterberger, T., Birbaumer, N., Wolpaw, J.R. (2004) BCI2000: A General-Purpose Brain-Computer Interface (BCI) System. IEEE TBME 51(6):1034-1043.\n", "\n", "[PhysioBank](https://physionet.org/physiobank/) is a large and growing archive of well-characterized digital recordings of physiologic signals and related data for use by the biomedical research community and further described in:\n", "\n", " Goldberger AL, Amaral LAN, Glass L, Hausdorff JM, Ivanov PCh, Mark RG, Mietus JE, Moody GB, Peng C-K, Stanley HE. (2000) PhysioBank, PhysioToolkit, and PhysioNet: Components of a New Research Resource for Complex Physiologic Signals. Circulation 101(23):e215-e220." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }