Read and Decode BBCI Data with Start-Stop-Markers

This tutorial shows how to read and decode BBCI data with start and stop markers. The data loading part is more complicated and it is advised to read the other tutorials before.

Setup logging to see outputs

In [2]:
import logging
import sys
logging.basicConfig(format='%(asctime)s %(levelname)s : %(message)s',
                     level=logging.DEBUG, stream=sys.stdout)
log = logging.getLogger()

Load and preprocess data

This is a bit more complicated than before since we have to add breaks etc. Here I now opt to add breaks do all preprocessings per run and only later combine them together.

In [3]:
import numpy as np
from braindecode.datautil.splitters import concatenate_sets
from braindecode.datautil.trial_segment import create_signal_target_from_raw_mne, add_breaks
from braindecode.datasets.bbci import load_bbci_sets_from_folder
from copy import deepcopy
from braindecode.mne_ext.signalproc import resample_cnt, mne_apply
from braindecode.datautil.signalproc import lowpass_cnt
from braindecode.datautil.signalproc import exponential_running_standardize

def create_cnts(folder, runs,):
    # Load data
    cnts = load_bbci_sets_from_folder(folder, runs)

    # Now do some preprocessings:
    # Resampling to 250 Hz, lowpass below 38, eponential standardization

    new_cnts = []
    for cnt in cnts:
        # Only take some channels
        #cnt = cnt.drop_channels(['STI 014']) # This would remove stimulus channel
        cnt = cnt.pick_channels(['C3', 'CPz', 'C4'])
        log.info("Preprocessing....")
        cnt = mne_apply(lambda a: lowpass_cnt(a, 38,cnt.info['sfreq'], axis=1), cnt)
        cnt = resample_cnt(cnt, 250)
        # mne apply will apply the function to the data (a 2d-numpy-array)
        # have to transpose data back and forth, since
        # exponential_running_standardize expects time x chans order
        # while mne object has chans x time order
        cnt = mne_apply(lambda a: exponential_running_standardize(
            a.T, init_block_size=1000,factor_new=0.001, eps=1e-4).T,
            cnt)
        new_cnts.append(cnt)
    return new_cnts
In [4]:
from collections import OrderedDict

train_runs = [1,2,3]
train_cnts = create_cnts('/home/schirrmr/data/robot-hall/AnLa/AnLaNBD1R01-8/',
                         train_runs,)

name_to_start_code = OrderedDict([('Right Hand', 1), ('Feet', 4),
            ('Rotation', 8), ('Words', [10])])

name_to_stop_code = OrderedDict([('Right Hand', [20,21,22,23,24,28,30]),
        ('Feet', [20,21,22,23,24,28,30]),
        ('Rotation', [20,21,22,23,24,28,30]),
        ('Words', [20,21,22,23,24,28,30])])

2017-11-03 17:54:16,149 INFO : Loading /home/schirrmr/data/robot-hall/AnLa/AnLaNBD1R01-8/AnLaNBD1S001R01_1-1_250Hz.BBCI.mat
Creating RawArray with float64 data, n_channels=64, n_times=151350
    Range : 0 ... 151349 =      0.000 ...   605.396 secs
Ready.
2017-11-03 17:54:17,481 INFO : Loading /home/schirrmr/data/robot-hall/AnLa/AnLaNBD1R01-8/AnLaNBD1S001R02_1-1_250Hz.BBCI.mat
Creating RawArray with float64 data, n_channels=64, n_times=153500
    Range : 0 ... 153499 =      0.000 ...   613.996 secs
Ready.
2017-11-03 17:54:18,843 INFO : Loading /home/schirrmr/data/robot-hall/AnLa/AnLaNBD1R01-8/AnLaNBD1S001R03_1-1_250Hz.BBCI.mat
Creating RawArray with float64 data, n_channels=64, n_times=180700
    Range : 0 ... 180699 =      0.000 ...   722.796 secs
Ready.
2017-11-03 17:54:20,609 INFO : Preprocessing....
2017-11-03 17:54:20,626 INFO : Just copying data, no resampling, since new sampling rate same.
2017-11-03 17:54:20,801 INFO : Preprocessing....
2017-11-03 17:54:20,809 INFO : Just copying data, no resampling, since new sampling rate same.
2017-11-03 17:54:21,018 INFO : Preprocessing....
2017-11-03 17:54:21,026 INFO : Just copying data, no resampling, since new sampling rate same.
In [5]:
test_runs = [9,10]
test_cnts = create_cnts('/home/schirrmr/data/robot-hall/AnLa/AnLaNBD1R09-10/', test_runs,)
2017-11-03 17:54:21,179 INFO : Loading /home/schirrmr/data/robot-hall/AnLa/AnLaNBD1R09-10/AnLaNBD1S001R09_1-1_250Hz.BBCI.mat
Creating RawArray with float64 data, n_channels=64, n_times=152050
    Range : 0 ... 152049 =      0.000 ...   608.196 secs
Ready.
2017-11-03 17:54:22,618 INFO : Loading /home/schirrmr/data/robot-hall/AnLa/AnLaNBD1R09-10/AnLaNBD1S001R10_1-1_250Hz.BBCI.mat
Creating RawArray with float64 data, n_channels=64, n_times=151100
    Range : 0 ... 151099 =      0.000 ...   604.396 secs
Ready.
2017-11-03 17:54:24,103 INFO : Preprocessing....
2017-11-03 17:54:24,112 INFO : Just copying data, no resampling, since new sampling rate same.
2017-11-03 17:54:24,277 INFO : Preprocessing....
2017-11-03 17:54:24,284 INFO : Just copying data, no resampling, since new sampling rate same.

Create the model

We already create the model now, since we need to know the receptive field size for properly cutting out the data to predict. We need to cut out data starting at -receptive_field_size samples before the first sample we want to predict.

In [6]:
from braindecode.models.shallow_fbcsp import ShallowFBCSPNet
from torch import nn
from braindecode.torch_ext.util import set_random_seeds
from braindecode.models.util import to_dense_prediction_model

# Set if you want to use GPU
# You can also use torch.cuda.is_available() to determine if cuda is available on your machine.
cuda = True
set_random_seeds(seed=20170629, cuda=cuda)

# This will determine how many crops are processed in parallel
input_time_length = 650
in_chans = train_cnts[0].get_data().shape[0]
# final_conv_length determines the size of the receptive field of the ConvNet
model = ShallowFBCSPNet(in_chans=in_chans, n_classes=5, input_time_length=input_time_length,
                        final_conv_length=29).create_network()
to_dense_prediction_model(model)

if cuda:
    model.cuda()
from braindecode.torch_ext.util import np_to_var
import numpy as np
# determine output size
test_input = np_to_var(np.ones((2, in_chans, input_time_length, 1), dtype=np.float32))
if cuda:
    test_input = test_input.cuda()
out = model(test_input)
n_preds_per_input = out.cpu().data.numpy().shape[2]
print("{:d} predictions per input/trial".format(n_preds_per_input))
n_receptive_field = input_time_length - n_preds_per_input
receptive_field_ms = n_receptive_field * 1000.0 / train_cnts[0].info['sfreq']
print("Receptive field: {:d}/{:.2f} (samples/ms)".format(n_receptive_field,
                                                      receptive_field_ms))
132 predictions per input/trial
Receptive field: 518/2072.00 (samples/ms)

Create SignalAndTarget Sets

In [7]:
from braindecode.datautil.trial_segment import create_signal_target_with_breaks_from_mne

break_start_offset_ms = 1000
break_stop_offset_ms = -500

train_sets = [create_signal_target_with_breaks_from_mne(
    cnt, name_to_start_code, [0,0],
    name_to_stop_code, min_break_length_ms=1000, max_break_length_ms=10000,
    break_epoch_ival_ms=[500,-500],
    prepad_trials_to_n_samples=input_time_length)
              for cnt in train_cnts]
train_set = concatenate_sets(train_sets)
2017-11-03 17:54:27,739 INFO : Trial per class:
Counter({'Break': 72, 'Right Hand': 29, 'Words': 21, 'Feet': 19, 'Rotation': 4})
2017-11-03 17:54:27,766 INFO : Trial per class:
Counter({'Break': 80, 'Feet': 31, 'Words': 26, 'Right Hand': 18, 'Rotation': 6})
2017-11-03 17:54:27,796 INFO : Trial per class:
Counter({'Break': 95, 'Feet': 38, 'Words': 29, 'Right Hand': 22, 'Rotation': 7})
In [8]:
test_sets = [create_signal_target_with_breaks_from_mne(
    cnt, name_to_start_code, [0,0],
    name_to_stop_code, min_break_length_ms=1000, max_break_length_ms=10000,
    break_epoch_ival_ms=[500,-500],
    prepad_trials_to_n_samples=input_time_length)
              for cnt in test_cnts]
test_set = concatenate_sets(test_sets)
2017-11-03 17:54:27,856 INFO : Trial per class:
Counter({'Break': 76, 'Feet': 24, 'Right Hand': 24, 'Words': 19, 'Rotation': 10})
2017-11-03 17:54:27,884 INFO : Trial per class:
Counter({'Break': 80, 'Feet': 30, 'Right Hand': 22, 'Words': 21, 'Rotation': 8})
In [9]:
from braindecode.datautil.splitters import split_into_two_sets

train_set, valid_set = split_into_two_sets(train_set, first_set_fraction=0.8)

Setup optimizer and iterator

In [10]:
from torch import optim

optimizer = optim.Adam(model.parameters())
In [11]:
from braindecode.datautil.iterators import CropsFromTrialsIterator
iterator = CropsFromTrialsIterator(batch_size=32,input_time_length=input_time_length,
                                  n_preds_per_input=n_preds_per_input)

Setup Monitors, Loss function, Stop Criteria

In [12]:
from braindecode.experiments.experiment import Experiment
from braindecode.experiments.monitors import RuntimeMonitor, LossMonitor, CroppedTrialMisclassMonitor, MisclassMonitor
from braindecode.experiments.stopcriteria import MaxEpochs
import torch.nn.functional as F
import torch as th
from braindecode.torch_ext.modules import Expression
from braindecode.torch_ext.losses import log_categorical_crossentropy


loss_function = log_categorical_crossentropy

model_constraint = None
monitors = [LossMonitor(), MisclassMonitor(col_suffix='sample_misclass'),
            CroppedTrialMisclassMonitor(input_time_length), RuntimeMonitor(),]
stop_criterion = MaxEpochs(20)
exp = Experiment(model, train_set, valid_set, test_set, iterator, loss_function, optimizer, model_constraint,
          monitors, stop_criterion, remember_best_column='valid_misclass',
          run_after_early_stop=True, batch_modifier=None, cuda=cuda)

Run experiment

In [13]:
exp.run()
2017-11-03 17:54:28,100 INFO : Run until first stop...
2017-11-03 17:54:29,008 INFO : Epoch 0
2017-11-03 17:54:29,011 INFO : train_loss                6.69229
2017-11-03 17:54:29,012 INFO : valid_loss                6.46568
2017-11-03 17:54:29,013 INFO : test_loss                 7.03033
2017-11-03 17:54:29,014 INFO : train_sample_misclass     0.82260
2017-11-03 17:54:29,015 INFO : valid_sample_misclass     0.80963
2017-11-03 17:54:29,016 INFO : test_sample_misclass      0.84529
2017-11-03 17:54:29,017 INFO : train_misclass            0.84673
2017-11-03 17:54:29,018 INFO : valid_misclass            0.83838
2017-11-03 17:54:29,019 INFO : test_misclass             0.87261
2017-11-03 17:54:29,020 INFO : runtime                   0.00000
2017-11-03 17:54:29,021 INFO :
2017-11-03 17:54:29,023 INFO : New best valid_misclass: 0.838384
2017-11-03 17:54:29,024 INFO :
2017-11-03 17:54:29,883 INFO : Time only for training updates: 0.76s
2017-11-03 17:54:30,662 INFO : Epoch 1
2017-11-03 17:54:30,663 INFO : train_loss                1.11019
2017-11-03 17:54:30,664 INFO : valid_loss                1.27928
2017-11-03 17:54:30,665 INFO : test_loss                 1.36444
2017-11-03 17:54:30,666 INFO : train_sample_misclass     0.42905
2017-11-03 17:54:30,667 INFO : valid_sample_misclass     0.49247
2017-11-03 17:54:30,668 INFO : test_sample_misclass      0.53468
2017-11-03 17:54:30,669 INFO : train_misclass            0.35427
2017-11-03 17:54:30,670 INFO : valid_misclass            0.44444
2017-11-03 17:54:30,671 INFO : test_misclass             0.45541
2017-11-03 17:54:30,672 INFO : runtime                   1.78367
2017-11-03 17:54:30,673 INFO :
2017-11-03 17:54:30,675 INFO : New best valid_misclass: 0.444444
2017-11-03 17:54:30,676 INFO :
2017-11-03 17:54:31,506 INFO : Time only for training updates: 0.72s
2017-11-03 17:54:32,301 INFO : Epoch 2
2017-11-03 17:54:32,304 INFO : train_loss                0.89880
2017-11-03 17:54:32,305 INFO : valid_loss                1.17010
2017-11-03 17:54:32,306 INFO : test_loss                 1.30903
2017-11-03 17:54:32,307 INFO : train_sample_misclass     0.34776
2017-11-03 17:54:32,308 INFO : valid_sample_misclass     0.41259
2017-11-03 17:54:32,309 INFO : test_sample_misclass      0.50234
2017-11-03 17:54:32,310 INFO : train_misclass            0.28643
2017-11-03 17:54:32,311 INFO : valid_misclass            0.40404
2017-11-03 17:54:32,312 INFO : test_misclass             0.46815
2017-11-03 17:54:32,313 INFO : runtime                   1.62281
2017-11-03 17:54:32,314 INFO :
2017-11-03 17:54:32,317 INFO : New best valid_misclass: 0.404040
2017-11-03 17:54:32,318 INFO :
2017-11-03 17:54:33,151 INFO : Time only for training updates: 0.73s
2017-11-03 17:54:33,950 INFO : Epoch 3
2017-11-03 17:54:33,952 INFO : train_loss                0.81194
2017-11-03 17:54:33,953 INFO : valid_loss                1.23906
2017-11-03 17:54:33,954 INFO : test_loss                 1.32349
2017-11-03 17:54:33,955 INFO : train_sample_misclass     0.31683
2017-11-03 17:54:33,956 INFO : valid_sample_misclass     0.44712
2017-11-03 17:54:33,957 INFO : test_sample_misclass      0.49383
2017-11-03 17:54:33,957 INFO : train_misclass            0.25628
2017-11-03 17:54:33,958 INFO : valid_misclass            0.43434
2017-11-03 17:54:33,959 INFO : test_misclass             0.45860
2017-11-03 17:54:33,960 INFO : runtime                   1.64646
2017-11-03 17:54:33,960 INFO :
2017-11-03 17:54:34,776 INFO : Time only for training updates: 0.72s
2017-11-03 17:54:35,547 INFO : Epoch 4
2017-11-03 17:54:35,549 INFO : train_loss                0.73879
2017-11-03 17:54:35,549 INFO : valid_loss                1.21058
2017-11-03 17:54:35,550 INFO : test_loss                 1.31367
2017-11-03 17:54:35,551 INFO : train_sample_misclass     0.27924
2017-11-03 17:54:35,552 INFO : valid_sample_misclass     0.42925
2017-11-03 17:54:35,553 INFO : test_sample_misclass      0.47731
2017-11-03 17:54:35,553 INFO : train_misclass            0.23618
2017-11-03 17:54:35,554 INFO : valid_misclass            0.39394
2017-11-03 17:54:35,555 INFO : test_misclass             0.44586
2017-11-03 17:54:35,556 INFO : runtime                   1.62406
2017-11-03 17:54:35,556 INFO :
2017-11-03 17:54:35,559 INFO : New best valid_misclass: 0.393939
2017-11-03 17:54:35,559 INFO :
2017-11-03 17:54:36,368 INFO : Time only for training updates: 0.71s
2017-11-03 17:54:37,117 INFO : Epoch 5
2017-11-03 17:54:37,118 INFO : train_loss                0.69937
2017-11-03 17:54:37,119 INFO : valid_loss                1.20308
2017-11-03 17:54:37,120 INFO : test_loss                 1.31024
2017-11-03 17:54:37,121 INFO : train_sample_misclass     0.26148
2017-11-03 17:54:37,121 INFO : valid_sample_misclass     0.42965
2017-11-03 17:54:37,122 INFO : test_sample_misclass      0.46976
2017-11-03 17:54:37,123 INFO : train_misclass            0.23116
2017-11-03 17:54:37,124 INFO : valid_misclass            0.41414
2017-11-03 17:54:37,124 INFO : test_misclass             0.46497
2017-11-03 17:54:37,125 INFO : runtime                   1.59298
2017-11-03 17:54:37,126 INFO :
2017-11-03 17:54:37,940 INFO : Time only for training updates: 0.72s
2017-11-03 17:54:38,703 INFO : Epoch 6
2017-11-03 17:54:38,704 INFO : train_loss                0.68692
2017-11-03 17:54:38,705 INFO : valid_loss                1.21140
2017-11-03 17:54:38,706 INFO : test_loss                 1.37866
2017-11-03 17:54:38,707 INFO : train_sample_misclass     0.26337
2017-11-03 17:54:38,707 INFO : valid_sample_misclass     0.42246
2017-11-03 17:54:38,708 INFO : test_sample_misclass      0.47892
2017-11-03 17:54:38,709 INFO : train_misclass            0.22613
2017-11-03 17:54:38,710 INFO : valid_misclass            0.41414
2017-11-03 17:54:38,710 INFO : test_misclass             0.43631
2017-11-03 17:54:38,711 INFO : runtime                   1.57037
2017-11-03 17:54:38,712 INFO :
2017-11-03 17:54:39,529 INFO : Time only for training updates: 0.72s
2017-11-03 17:54:40,288 INFO : Epoch 7
2017-11-03 17:54:40,290 INFO : train_loss                0.64330
2017-11-03 17:54:40,291 INFO : valid_loss                1.26310
2017-11-03 17:54:40,291 INFO : test_loss                 1.33326
2017-11-03 17:54:40,292 INFO : train_sample_misclass     0.23914
2017-11-03 17:54:40,293 INFO : valid_sample_misclass     0.43057
2017-11-03 17:54:40,294 INFO : test_sample_misclass      0.45974
2017-11-03 17:54:40,295 INFO : train_misclass            0.19347
2017-11-03 17:54:40,295 INFO : valid_misclass            0.37374
2017-11-03 17:54:40,296 INFO : test_misclass             0.43312
2017-11-03 17:54:40,297 INFO : runtime                   1.58912
2017-11-03 17:54:40,298 INFO :
2017-11-03 17:54:40,300 INFO : New best valid_misclass: 0.373737
2017-11-03 17:54:40,301 INFO :
2017-11-03 17:54:41,126 INFO : Time only for training updates: 0.72s
2017-11-03 17:54:41,882 INFO : Epoch 8
2017-11-03 17:54:41,884 INFO : train_loss                0.63941
2017-11-03 17:54:41,885 INFO : valid_loss                1.26822
2017-11-03 17:54:41,885 INFO : test_loss                 1.37385
2017-11-03 17:54:41,886 INFO : train_sample_misclass     0.24020
2017-11-03 17:54:41,887 INFO : valid_sample_misclass     0.43108
2017-11-03 17:54:41,888 INFO : test_sample_misclass      0.47164
2017-11-03 17:54:41,888 INFO : train_misclass            0.20352
2017-11-03 17:54:41,889 INFO : valid_misclass            0.44444
2017-11-03 17:54:41,890 INFO : test_misclass             0.42675
2017-11-03 17:54:41,891 INFO : runtime                   1.59709
2017-11-03 17:54:41,891 INFO :
2017-11-03 17:54:42,704 INFO : Time only for training updates: 0.72s
2017-11-03 17:54:43,453 INFO : Epoch 9
2017-11-03 17:54:43,455 INFO : train_loss                0.61007
2017-11-03 17:54:43,456 INFO : valid_loss                1.22956
2017-11-03 17:54:43,456 INFO : test_loss                 1.40305
2017-11-03 17:54:43,457 INFO : train_sample_misclass     0.22529
2017-11-03 17:54:43,458 INFO : valid_sample_misclass     0.43356
2017-11-03 17:54:43,459 INFO : test_sample_misclass      0.48479
2017-11-03 17:54:43,459 INFO : train_misclass            0.19849
2017-11-03 17:54:43,460 INFO : valid_misclass            0.43434
2017-11-03 17:54:43,461 INFO : test_misclass             0.46497
2017-11-03 17:54:43,462 INFO : runtime                   1.57837
2017-11-03 17:54:43,462 INFO :
2017-11-03 17:54:44,271 INFO : Time only for training updates: 0.71s
2017-11-03 17:54:45,020 INFO : Epoch 10
2017-11-03 17:54:45,021 INFO : train_loss                0.64797
2017-11-03 17:54:45,022 INFO : valid_loss                1.28604
2017-11-03 17:54:45,023 INFO : test_loss                 1.41996
2017-11-03 17:54:45,023 INFO : train_sample_misclass     0.24798
2017-11-03 17:54:45,024 INFO : valid_sample_misclass     0.44050
2017-11-03 17:54:45,025 INFO : test_sample_misclass      0.47793
2017-11-03 17:54:45,026 INFO : train_misclass            0.23869
2017-11-03 17:54:45,027 INFO : valid_misclass            0.41414
2017-11-03 17:54:45,027 INFO : test_misclass             0.44904
2017-11-03 17:54:45,028 INFO : runtime                   1.56668
2017-11-03 17:54:45,029 INFO :
2017-11-03 17:54:45,847 INFO : Time only for training updates: 0.72s
2017-11-03 17:54:46,639 INFO : Epoch 11
2017-11-03 17:54:46,640 INFO : train_loss                0.60028
2017-11-03 17:54:46,641 INFO : valid_loss                1.19866
2017-11-03 17:54:46,642 INFO : test_loss                 1.51705
2017-11-03 17:54:46,642 INFO : train_sample_misclass     0.22617
2017-11-03 17:54:46,643 INFO : valid_sample_misclass     0.43046
2017-11-03 17:54:46,644 INFO : test_sample_misclass      0.50496
2017-11-03 17:54:46,645 INFO : train_misclass            0.18593
2017-11-03 17:54:46,646 INFO : valid_misclass            0.34343
2017-11-03 17:54:46,646 INFO : test_misclass             0.47134
2017-11-03 17:54:46,647 INFO : runtime                   1.57587
2017-11-03 17:54:46,648 INFO :
2017-11-03 17:54:46,650 INFO : New best valid_misclass: 0.343434
2017-11-03 17:54:46,651 INFO :
2017-11-03 17:54:47,467 INFO : Time only for training updates: 0.72s
2017-11-03 17:54:48,218 INFO : Epoch 12
2017-11-03 17:54:48,219 INFO : train_loss                0.57952
2017-11-03 17:54:48,220 INFO : valid_loss                1.23002
2017-11-03 17:54:48,221 INFO : test_loss                 1.39561
2017-11-03 17:54:48,222 INFO : train_sample_misclass     0.21030
2017-11-03 17:54:48,222 INFO : valid_sample_misclass     0.42522
2017-11-03 17:54:48,223 INFO : test_sample_misclass      0.45922
2017-11-03 17:54:48,224 INFO : train_misclass            0.17337
2017-11-03 17:54:48,225 INFO : valid_misclass            0.39394
2017-11-03 17:54:48,225 INFO : test_misclass             0.42038
2017-11-03 17:54:48,226 INFO : runtime                   1.61997
2017-11-03 17:54:48,227 INFO :
2017-11-03 17:54:49,066 INFO : Time only for training updates: 0.74s
2017-11-03 17:54:49,828 INFO : Epoch 13
2017-11-03 17:54:49,829 INFO : train_loss                0.56454
2017-11-03 17:54:49,830 INFO : valid_loss                1.30951
2017-11-03 17:54:49,831 INFO : test_loss                 1.35587
2017-11-03 17:54:49,832 INFO : train_sample_misclass     0.20067
2017-11-03 17:54:49,833 INFO : valid_sample_misclass     0.43243
2017-11-03 17:54:49,833 INFO : test_sample_misclass      0.45508
2017-11-03 17:54:49,834 INFO : train_misclass            0.17839
2017-11-03 17:54:49,835 INFO : valid_misclass            0.40404
2017-11-03 17:54:49,836 INFO : test_misclass             0.41083
2017-11-03 17:54:49,836 INFO : runtime                   1.59916
2017-11-03 17:54:49,837 INFO :
2017-11-03 17:54:50,655 INFO : Time only for training updates: 0.72s
2017-11-03 17:54:51,412 INFO : Epoch 14
2017-11-03 17:54:51,413 INFO : train_loss                0.62104
2017-11-03 17:54:51,414 INFO : valid_loss                1.40254
2017-11-03 17:54:51,415 INFO : test_loss                 1.41643
2017-11-03 17:54:51,415 INFO : train_sample_misclass     0.23836
2017-11-03 17:54:51,416 INFO : valid_sample_misclass     0.45438
2017-11-03 17:54:51,417 INFO : test_sample_misclass      0.46678
2017-11-03 17:54:51,418 INFO : train_misclass            0.23367
2017-11-03 17:54:51,419 INFO : valid_misclass            0.39394
2017-11-03 17:54:51,419 INFO : test_misclass             0.39172
2017-11-03 17:54:51,420 INFO : runtime                   1.58891
2017-11-03 17:54:51,421 INFO :
2017-11-03 17:54:52,235 INFO : Time only for training updates: 0.72s
2017-11-03 17:54:53,001 INFO : Epoch 15
2017-11-03 17:54:53,002 INFO : train_loss                0.55985
2017-11-03 17:54:53,003 INFO : valid_loss                1.38133
2017-11-03 17:54:53,004 INFO : test_loss                 1.49168
2017-11-03 17:54:53,005 INFO : train_sample_misclass     0.19814
2017-11-03 17:54:53,006 INFO : valid_sample_misclass     0.44258
2017-11-03 17:54:53,006 INFO : test_sample_misclass      0.47665
2017-11-03 17:54:53,007 INFO : train_misclass            0.16332
2017-11-03 17:54:53,008 INFO : valid_misclass            0.43434
2017-11-03 17:54:53,009 INFO : test_misclass             0.43312
2017-11-03 17:54:53,009 INFO : runtime                   1.57987
2017-11-03 17:54:53,010 INFO :
2017-11-03 17:54:53,824 INFO : Time only for training updates: 0.72s
2017-11-03 17:54:54,592 INFO : Epoch 16
2017-11-03 17:54:54,593 INFO : train_loss                0.52848
2017-11-03 17:54:54,594 INFO : valid_loss                1.33559
2017-11-03 17:54:54,595 INFO : test_loss                 1.51660
2017-11-03 17:54:54,596 INFO : train_sample_misclass     0.18632
2017-11-03 17:54:54,596 INFO : valid_sample_misclass     0.46433
2017-11-03 17:54:54,597 INFO : test_sample_misclass      0.48484
2017-11-03 17:54:54,598 INFO : train_misclass            0.15578
2017-11-03 17:54:54,599 INFO : valid_misclass            0.42424
2017-11-03 17:54:54,599 INFO : test_misclass             0.43949
2017-11-03 17:54:54,600 INFO : runtime                   1.58907
2017-11-03 17:54:54,601 INFO :
2017-11-03 17:54:55,417 INFO : Time only for training updates: 0.72s
2017-11-03 17:54:56,169 INFO : Epoch 17
2017-11-03 17:54:56,171 INFO : train_loss                0.53104
2017-11-03 17:54:56,171 INFO : valid_loss                1.27837
2017-11-03 17:54:56,172 INFO : test_loss                 1.56129
2017-11-03 17:54:56,173 INFO : train_sample_misclass     0.19424
2017-11-03 17:54:56,174 INFO : valid_sample_misclass     0.43299
2017-11-03 17:54:56,175 INFO : test_sample_misclass      0.48812
2017-11-03 17:54:56,175 INFO : train_misclass            0.16583
2017-11-03 17:54:56,176 INFO : valid_misclass            0.39394
2017-11-03 17:54:56,177 INFO : test_misclass             0.44904
2017-11-03 17:54:56,178 INFO : runtime                   1.59308
2017-11-03 17:54:56,178 INFO :
2017-11-03 17:54:56,988 INFO : Time only for training updates: 0.71s
2017-11-03 17:54:57,764 INFO : Epoch 18
2017-11-03 17:54:57,766 INFO : train_loss                0.52136
2017-11-03 17:54:57,767 INFO : valid_loss                1.35125
2017-11-03 17:54:57,767 INFO : test_loss                 1.46087
2017-11-03 17:54:57,768 INFO : train_sample_misclass     0.18336
2017-11-03 17:54:57,769 INFO : valid_sample_misclass     0.44739
2017-11-03 17:54:57,770 INFO : test_sample_misclass      0.48096
2017-11-03 17:54:57,770 INFO : train_misclass            0.16332
2017-11-03 17:54:57,771 INFO : valid_misclass            0.39394
2017-11-03 17:54:57,772 INFO : test_misclass             0.42675
2017-11-03 17:54:57,773 INFO : runtime                   1.57133
2017-11-03 17:54:57,774 INFO :
2017-11-03 17:54:58,595 INFO : Time only for training updates: 0.72s
2017-11-03 17:54:59,356 INFO : Epoch 19
2017-11-03 17:54:59,357 INFO : train_loss                0.52737
2017-11-03 17:54:59,358 INFO : valid_loss                1.33823
2017-11-03 17:54:59,359 INFO : test_loss                 1.56256
2017-11-03 17:54:59,360 INFO : train_sample_misclass     0.19466
2017-11-03 17:54:59,360 INFO : valid_sample_misclass     0.44720
2017-11-03 17:54:59,361 INFO : test_sample_misclass      0.47450
2017-11-03 17:54:59,362 INFO : train_misclass            0.15578
2017-11-03 17:54:59,363 INFO : valid_misclass            0.42424
2017-11-03 17:54:59,364 INFO : test_misclass             0.42675
2017-11-03 17:54:59,364 INFO : runtime                   1.60626
2017-11-03 17:54:59,365 INFO :
2017-11-03 17:55:00,184 INFO : Time only for training updates: 0.72s
2017-11-03 17:55:00,944 INFO : Epoch 20
2017-11-03 17:55:00,945 INFO : train_loss                0.50380
2017-11-03 17:55:00,946 INFO : valid_loss                1.28838
2017-11-03 17:55:00,947 INFO : test_loss                 1.54519
2017-11-03 17:55:00,947 INFO : train_sample_misclass     0.17429
2017-11-03 17:55:00,948 INFO : valid_sample_misclass     0.43744
2017-11-03 17:55:00,949 INFO : test_sample_misclass      0.48286
2017-11-03 17:55:00,950 INFO : train_misclass            0.17085
2017-11-03 17:55:00,950 INFO : valid_misclass            0.38384
2017-11-03 17:55:00,951 INFO : test_misclass             0.42994
2017-11-03 17:55:00,952 INFO : runtime                   1.58936
2017-11-03 17:55:00,953 INFO :
2017-11-03 17:55:00,954 INFO : Setup for second stop...
2017-11-03 17:55:00,957 INFO : Train loss to reach 0.60028
2017-11-03 17:55:00,958 INFO : Run until second stop...
2017-11-03 17:55:01,805 INFO : Epoch 12
2017-11-03 17:55:01,806 INFO : train_loss                0.71588
2017-11-03 17:55:01,807 INFO : valid_loss                1.19866
2017-11-03 17:55:01,808 INFO : test_loss                 1.51705
2017-11-03 17:55:01,808 INFO : train_sample_misclass     0.26564
2017-11-03 17:55:01,809 INFO : valid_sample_misclass     0.43046
2017-11-03 17:55:01,810 INFO : test_sample_misclass      0.50496
2017-11-03 17:55:01,811 INFO : train_misclass            0.21730
2017-11-03 17:55:01,812 INFO : valid_misclass            0.34343
2017-11-03 17:55:01,812 INFO : test_misclass             0.47134
2017-11-03 17:55:01,813 INFO : runtime                   0.77324
2017-11-03 17:55:01,814 INFO :
2017-11-03 17:55:02,820 INFO : Time only for training updates: 0.89s
2017-11-03 17:55:03,681 INFO : Epoch 13
2017-11-03 17:55:03,683 INFO : train_loss                0.71408
2017-11-03 17:55:03,684 INFO : valid_loss                1.02489
2017-11-03 17:55:03,684 INFO : test_loss                 1.36414
2017-11-03 17:55:03,685 INFO : train_sample_misclass     0.26404
2017-11-03 17:55:03,686 INFO : valid_sample_misclass     0.38184
2017-11-03 17:55:03,687 INFO : test_sample_misclass      0.47608
2017-11-03 17:55:03,688 INFO : train_misclass            0.21328
2017-11-03 17:55:03,688 INFO : valid_misclass            0.35354
2017-11-03 17:55:03,689 INFO : test_misclass             0.42357
2017-11-03 17:55:03,690 INFO : runtime                   1.86268
2017-11-03 17:55:03,691 INFO :
2017-11-03 17:55:04,693 INFO : Time only for training updates: 0.88s
2017-11-03 17:55:05,529 INFO : Epoch 14
2017-11-03 17:55:05,531 INFO : train_loss                0.68211
2017-11-03 17:55:05,532 INFO : valid_loss                0.92467
2017-11-03 17:55:05,532 INFO : test_loss                 1.41786
2017-11-03 17:55:05,533 INFO : train_sample_misclass     0.25519
2017-11-03 17:55:05,534 INFO : valid_sample_misclass     0.34189
2017-11-03 17:55:05,535 INFO : test_sample_misclass      0.48768
2017-11-03 17:55:05,536 INFO : train_misclass            0.22133
2017-11-03 17:55:05,537 INFO : valid_misclass            0.28283
2017-11-03 17:55:05,539 INFO : test_misclass             0.45860
2017-11-03 17:55:05,540 INFO : runtime                   1.87288
2017-11-03 17:55:05,541 INFO :
2017-11-03 17:55:06,539 INFO : Time only for training updates: 0.88s
2017-11-03 17:55:07,379 INFO : Epoch 15
2017-11-03 17:55:07,381 INFO : train_loss                0.65594
2017-11-03 17:55:07,382 INFO : valid_loss                0.87031
2017-11-03 17:55:07,383 INFO : test_loss                 1.45573
2017-11-03 17:55:07,385 INFO : train_sample_misclass     0.23964
2017-11-03 17:55:07,386 INFO : valid_sample_misclass     0.33582
2017-11-03 17:55:07,387 INFO : test_sample_misclass      0.49530
2017-11-03 17:55:07,388 INFO : train_misclass            0.22938
2017-11-03 17:55:07,389 INFO : valid_misclass            0.33333
2017-11-03 17:55:07,390 INFO : test_misclass             0.50637
2017-11-03 17:55:07,392 INFO : runtime                   1.84665
2017-11-03 17:55:07,393 INFO :
2017-11-03 17:55:08,391 INFO : Time only for training updates: 0.88s
2017-11-03 17:55:09,225 INFO : Epoch 16
2017-11-03 17:55:09,227 INFO : train_loss                0.67155
2017-11-03 17:55:09,228 INFO : valid_loss                0.88822
2017-11-03 17:55:09,229 INFO : test_loss                 1.46725
2017-11-03 17:55:09,231 INFO : train_sample_misclass     0.25023
2017-11-03 17:55:09,232 INFO : valid_sample_misclass     0.35430
2017-11-03 17:55:09,233 INFO : test_sample_misclass      0.51942
2017-11-03 17:55:09,234 INFO : train_misclass            0.22736
2017-11-03 17:55:09,235 INFO : valid_misclass            0.30303
2017-11-03 17:55:09,237 INFO : test_misclass             0.47134
2017-11-03 17:55:09,238 INFO : runtime                   1.85138
2017-11-03 17:55:09,239 INFO :
2017-11-03 17:55:10,282 INFO : Time only for training updates: 0.92s
2017-11-03 17:55:11,169 INFO : Epoch 17
2017-11-03 17:55:11,171 INFO : train_loss                0.65888
2017-11-03 17:55:11,172 INFO : valid_loss                0.85140
2017-11-03 17:55:11,174 INFO : test_loss                 1.38991
2017-11-03 17:55:11,175 INFO : train_sample_misclass     0.24352
2017-11-03 17:55:11,176 INFO : valid_sample_misclass     0.32228
2017-11-03 17:55:11,177 INFO : test_sample_misclass      0.47197
2017-11-03 17:55:11,179 INFO : train_misclass            0.23139
2017-11-03 17:55:11,180 INFO : valid_misclass            0.28283
2017-11-03 17:55:11,181 INFO : test_misclass             0.44904
2017-11-03 17:55:11,182 INFO : runtime                   1.89099
2017-11-03 17:55:11,183 INFO :
2017-11-03 17:55:12,185 INFO : Time only for training updates: 0.88s
2017-11-03 17:55:13,031 INFO : Epoch 18
2017-11-03 17:55:13,033 INFO : train_loss                0.60783
2017-11-03 17:55:13,034 INFO : valid_loss                0.75969
2017-11-03 17:55:13,035 INFO : test_loss                 1.40295
2017-11-03 17:55:13,037 INFO : train_sample_misclass     0.22382
2017-11-03 17:55:13,038 INFO : valid_sample_misclass     0.29660
2017-11-03 17:55:13,039 INFO : test_sample_misclass      0.48256
2017-11-03 17:55:13,040 INFO : train_misclass            0.18511
2017-11-03 17:55:13,042 INFO : valid_misclass            0.27273
2017-11-03 17:55:13,043 INFO : test_misclass             0.45860
2017-11-03 17:55:13,044 INFO : runtime                   1.90315
2017-11-03 17:55:13,045 INFO :
2017-11-03 17:55:14,056 INFO : Time only for training updates: 0.89s
2017-11-03 17:55:14,953 INFO : Epoch 19
2017-11-03 17:55:14,956 INFO : train_loss                0.61093
2017-11-03 17:55:14,959 INFO : valid_loss                0.78444
2017-11-03 17:55:14,960 INFO : test_loss                 1.37623
2017-11-03 17:55:14,963 INFO : train_sample_misclass     0.22366
2017-11-03 17:55:14,965 INFO : valid_sample_misclass     0.30558
2017-11-03 17:55:14,966 INFO : test_sample_misclass      0.47023
2017-11-03 17:55:14,969 INFO : train_misclass            0.18712
2017-11-03 17:55:14,970 INFO : valid_misclass            0.24242
2017-11-03 17:55:14,973 INFO : test_misclass             0.43312
2017-11-03 17:55:14,975 INFO : runtime                   1.87216
2017-11-03 17:55:14,977 INFO :
2017-11-03 17:55:15,992 INFO : Time only for training updates: 0.89s
2017-11-03 17:55:16,858 INFO : Epoch 20
2017-11-03 17:55:16,860 INFO : train_loss                0.59346
2017-11-03 17:55:16,861 INFO : valid_loss                0.71784
2017-11-03 17:55:16,861 INFO : test_loss                 1.45776
2017-11-03 17:55:16,862 INFO : train_sample_misclass     0.21111
2017-11-03 17:55:16,863 INFO : valid_sample_misclass     0.26341
2017-11-03 17:55:16,864 INFO : test_sample_misclass      0.49474
2017-11-03 17:55:16,865 INFO : train_misclass            0.20322
2017-11-03 17:55:16,865 INFO : valid_misclass            0.27273
2017-11-03 17:55:16,866 INFO : test_misclass             0.46815
2017-11-03 17:55:16,867 INFO : runtime                   1.93566
2017-11-03 17:55:16,868 INFO :
2017-11-03 17:55:17,876 INFO : Time only for training updates: 0.89s
2017-11-03 17:55:18,753 INFO : Epoch 21
2017-11-03 17:55:18,755 INFO : train_loss                0.60215
2017-11-03 17:55:18,756 INFO : valid_loss                0.75351
2017-11-03 17:55:18,756 INFO : test_loss                 1.50636
2017-11-03 17:55:18,757 INFO : train_sample_misclass     0.21574
2017-11-03 17:55:18,758 INFO : valid_sample_misclass     0.28888
2017-11-03 17:55:18,759 INFO : test_sample_misclass      0.51284
2017-11-03 17:55:18,760 INFO : train_misclass            0.19517
2017-11-03 17:55:18,760 INFO : valid_misclass            0.28283
2017-11-03 17:55:18,761 INFO : test_misclass             0.48089
2017-11-03 17:55:18,762 INFO : runtime                   1.88302
2017-11-03 17:55:18,763 INFO :
2017-11-03 17:55:19,771 INFO : Time only for training updates: 0.89s
2017-11-03 17:55:20,627 INFO : Epoch 22
2017-11-03 17:55:20,628 INFO : train_loss                0.65365
2017-11-03 17:55:20,629 INFO : valid_loss                0.82897
2017-11-03 17:55:20,629 INFO : test_loss                 1.40076
2017-11-03 17:55:20,630 INFO : train_sample_misclass     0.25455
2017-11-03 17:55:20,631 INFO : valid_sample_misclass     0.33560
2017-11-03 17:55:20,632 INFO : test_sample_misclass      0.48546
2017-11-03 17:55:20,632 INFO : train_misclass            0.24145
2017-11-03 17:55:20,633 INFO : valid_misclass            0.30303
2017-11-03 17:55:20,634 INFO : test_misclass             0.46178
2017-11-03 17:55:20,635 INFO : runtime                   1.89486
2017-11-03 17:55:20,636 INFO :

We arrive at about 54% accuracy. With only 3 sensors and 3 training runs, we cannot get much better :)