Read and Decode BBCI Data

This tutorial shows how to read and decode BBCI data.

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

First set the filename and the sensors you want to load. If you set

load_sensor_names=None

or just remove the parameter from the function call, all sensors will be loaded.

In [3]:
from braindecode.datasets.bbci import BBCIDataset
train_filename = '/home/schirrmr/data/BBCI-without-last-runs/BhNoMoSc1S001R01_ds10_1-12.BBCI.mat'
cnt = BBCIDataset(train_filename, load_sensor_names=['C3', 'CPz', 'C4']).load()
Creating RawArray with float64 data, n_channels=3, n_times=3451320
    Range : 0 ... 3451319 =      0.000 ...  6902.638 secs
Ready.

Preprocessing on continous data

First remove the stimulus channel, than apply any preprocessing you like. There are some very few directions available from Braindecode, such as resample_cnt. But you can apply any function on the chan x time matrix of the mne raw object (cnt in the code) by calling mne_apply with two arguments:

  1. Your function (2d-array-> 2darray), that transforms the channel x timesteps data array
  2. the Raw data object from mne itself
In [4]:
from braindecode.mne_ext.signalproc import resample_cnt, mne_apply
from braindecode.datautil.signalproc import exponential_running_standardize
# Remove stimulus channel
cnt = cnt.drop_channels(['STI 014'])
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)
2017-11-03 17:59:09,513 WARNING : This is not causal, uses future data....
2017-11-03 17:59:09,514 INFO : Resampling from 500.000000 to 250.000000 Hz.
Creating RawArray with float64 data, n_channels=3, n_times=1725660
    Range : 0 ... 1725659 =      0.000 ...  6902.636 secs
Ready.

Transform to epoched dataset

Braindecode supplies the create_signal_target_from_raw_mne function, which will transform the mne raw object into a SignalAndTarget object for use in Braindecode. name_to_code should be an OrderedDict that maps class names to either one or a list of marker codes for that class.

In [5]:
from braindecode.datautil.trial_segment import create_signal_target_from_raw_mne
from collections import OrderedDict
# can also give lists of marker codes in case a class has multiple marker codes...
name_to_code = OrderedDict([('Right', 1), ('Left', 2), ('Rest', 3), ('Feet', 4)])
segment_ival_ms = [-500,4000]

train_set = create_signal_target_from_raw_mne(cnt, name_to_code, segment_ival_ms)
2017-11-03 17:59:11,376 INFO : Trial per class:
Counter({'Feet': 225, 'Right': 224, 'Rest': 224, 'Left': 224})

Same for test set

In [6]:
test_filename = '/home/schirrmr/data/BBCI-only-last-runs/BhNoMoSc1S001R13_ds10_1-2BBCI.mat'
cnt = BBCIDataset(test_filename, load_sensor_names=['C3', 'CPz', 'C4']).load()
# Remove stimulus channel
cnt = cnt.drop_channels(['STI 014'])
cnt = resample_cnt(cnt, 250)
cnt = mne_apply(lambda a: exponential_running_standardize(
    a.T, init_block_size=1000,factor_new=0.001, eps=1e-4).T,
    cnt)
test_set = create_signal_target_from_raw_mne(cnt, name_to_code, segment_ival_ms)
Creating RawArray with float64 data, n_channels=3, n_times=617090
    Range : 0 ... 617089 =      0.000 ...  1234.178 secs
Ready.
2017-11-03 17:59:12,305 WARNING : This is not causal, uses future data....
2017-11-03 17:59:12,306 INFO : Resampling from 500.000000 to 250.000000 Hz.
Creating RawArray with float64 data, n_channels=3, n_times=308545
    Range : 0 ... 308544 =      0.000 ...  1234.176 secs
Ready.
2017-11-03 17:59:12,653 INFO : Trial per class:
Counter({'Feet': 40, 'Left': 40, 'Rest': 40, 'Right': 40})
In case of start and stop markers, provide a name_to_stop_codes dictionary (same as for the start codes in this example) as a final argument to create_signal_target_from_raw_mne. See Read and Decode BBCI Data with Start-Stop-Markers Tutorial

Split off a validation set.

In [7]:
from braindecode.datautil.splitters import split_into_two_sets

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

Create the model

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

# 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 = train_set.X.shape[2]
in_chans = 3
n_classes = 4
# final_conv_length determines the size of the receptive field of the ConvNet
model = ShallowFBCSPNet(in_chans=in_chans, n_classes=n_classes, input_time_length=input_time_length,
                        final_conv_length='auto').create_network()

if cuda:
    model.cuda()

Setup optimizer and iterator

In [9]:
from torch import optim
import numpy as np

optimizer = optim.Adam(model.parameters())


from braindecode.datautil.iterators import BalancedBatchSizeIterator
iterator = BalancedBatchSizeIterator(batch_size=32)

Setup Monitors, Loss function, Stop Criteria

In [10]:
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


loss_function = F.nll_loss

model_constraint = None
monitors = [LossMonitor(), MisclassMonitor(col_suffix='misclass'),
            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 [11]:
exp.run()
2017-11-03 17:59:15,468 INFO : Run until first stop...
2017-11-03 17:59:15,979 INFO : Epoch 0
2017-11-03 17:59:15,981 INFO : train_loss                3.82544
2017-11-03 17:59:15,982 INFO : valid_loss                3.72206
2017-11-03 17:59:15,982 INFO : test_loss                 3.90394
2017-11-03 17:59:15,983 INFO : train_misclass            0.76184
2017-11-03 17:59:15,984 INFO : valid_misclass            0.76536
2017-11-03 17:59:15,985 INFO : test_misclass             0.75625
2017-11-03 17:59:15,985 INFO : runtime                   0.00000
2017-11-03 17:59:15,986 INFO :
2017-11-03 17:59:15,988 INFO : New best valid_misclass: 0.765363
2017-11-03 17:59:15,989 INFO :
2017-11-03 17:59:16,564 INFO : Time only for training updates: 0.57s
2017-11-03 17:59:16,671 INFO : Epoch 1
2017-11-03 17:59:16,672 INFO : train_loss                2.65436
2017-11-03 17:59:16,673 INFO : valid_loss                2.88156
2017-11-03 17:59:16,674 INFO : test_loss                 3.03544
2017-11-03 17:59:16,675 INFO : train_misclass            0.72006
2017-11-03 17:59:16,675 INFO : valid_misclass            0.73184
2017-11-03 17:59:16,676 INFO : test_misclass             0.71250
2017-11-03 17:59:16,677 INFO : runtime                   1.09594
2017-11-03 17:59:16,678 INFO :
2017-11-03 17:59:16,681 INFO : New best valid_misclass: 0.731844
2017-11-03 17:59:16,682 INFO :
2017-11-03 17:59:17,228 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:17,336 INFO : Epoch 2
2017-11-03 17:59:17,338 INFO : train_loss                0.60706
2017-11-03 17:59:17,339 INFO : valid_loss                0.61918
2017-11-03 17:59:17,339 INFO : test_loss                 0.81560
2017-11-03 17:59:17,340 INFO : train_misclass            0.24791
2017-11-03 17:59:17,341 INFO : valid_misclass            0.27933
2017-11-03 17:59:17,342 INFO : test_misclass             0.33750
2017-11-03 17:59:17,343 INFO : runtime                   0.66460
2017-11-03 17:59:17,344 INFO :
2017-11-03 17:59:17,346 INFO : New best valid_misclass: 0.279330
2017-11-03 17:59:17,347 INFO :
2017-11-03 17:59:17,893 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:17,998 INFO : Epoch 3
2017-11-03 17:59:17,999 INFO : train_loss                0.58638
2017-11-03 17:59:18,000 INFO : valid_loss                0.62992
2017-11-03 17:59:18,000 INFO : test_loss                 0.85668
2017-11-03 17:59:18,001 INFO : train_misclass            0.23677
2017-11-03 17:59:18,002 INFO : valid_misclass            0.27374
2017-11-03 17:59:18,003 INFO : test_misclass             0.38750
2017-11-03 17:59:18,003 INFO : runtime                   0.66507
2017-11-03 17:59:18,004 INFO :
2017-11-03 17:59:18,006 INFO : New best valid_misclass: 0.273743
2017-11-03 17:59:18,007 INFO :
2017-11-03 17:59:18,552 INFO : Time only for training updates: 0.54s
2017-11-03 17:59:18,664 INFO : Epoch 4
2017-11-03 17:59:18,666 INFO : train_loss                0.48614
2017-11-03 17:59:18,666 INFO : valid_loss                0.56710
2017-11-03 17:59:18,667 INFO : test_loss                 0.76815
2017-11-03 17:59:18,668 INFO : train_misclass            0.19638
2017-11-03 17:59:18,669 INFO : valid_misclass            0.26816
2017-11-03 17:59:18,669 INFO : test_misclass             0.31875
2017-11-03 17:59:18,670 INFO : runtime                   0.65807
2017-11-03 17:59:18,671 INFO :
2017-11-03 17:59:18,673 INFO : New best valid_misclass: 0.268156
2017-11-03 17:59:18,674 INFO :
2017-11-03 17:59:19,219 INFO : Time only for training updates: 0.54s
2017-11-03 17:59:19,327 INFO : Epoch 5
2017-11-03 17:59:19,329 INFO : train_loss                0.42408
2017-11-03 17:59:19,329 INFO : valid_loss                0.52337
2017-11-03 17:59:19,330 INFO : test_loss                 0.79153
2017-11-03 17:59:19,331 INFO : train_misclass            0.14485
2017-11-03 17:59:19,332 INFO : valid_misclass            0.22905
2017-11-03 17:59:19,333 INFO : test_misclass             0.36250
2017-11-03 17:59:19,333 INFO : runtime                   0.66796
2017-11-03 17:59:19,334 INFO :
2017-11-03 17:59:19,336 INFO : New best valid_misclass: 0.229050
2017-11-03 17:59:19,337 INFO :
2017-11-03 17:59:19,884 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:19,992 INFO : Epoch 6
2017-11-03 17:59:19,993 INFO : train_loss                0.35395
2017-11-03 17:59:19,994 INFO : valid_loss                0.51115
2017-11-03 17:59:19,995 INFO : test_loss                 0.72994
2017-11-03 17:59:19,996 INFO : train_misclass            0.11003
2017-11-03 17:59:19,996 INFO : valid_misclass            0.20112
2017-11-03 17:59:19,997 INFO : test_misclass             0.27500
2017-11-03 17:59:19,998 INFO : runtime                   0.66456
2017-11-03 17:59:19,999 INFO :
2017-11-03 17:59:20,001 INFO : New best valid_misclass: 0.201117
2017-11-03 17:59:20,002 INFO :
2017-11-03 17:59:20,548 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:20,656 INFO : Epoch 7
2017-11-03 17:59:20,657 INFO : train_loss                0.34276
2017-11-03 17:59:20,658 INFO : valid_loss                0.57949
2017-11-03 17:59:20,659 INFO : test_loss                 0.79834
2017-11-03 17:59:20,659 INFO : train_misclass            0.11978
2017-11-03 17:59:20,660 INFO : valid_misclass            0.25140
2017-11-03 17:59:20,661 INFO : test_misclass             0.32500
2017-11-03 17:59:20,662 INFO : runtime                   0.66413
2017-11-03 17:59:20,662 INFO :
2017-11-03 17:59:21,209 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:21,318 INFO : Epoch 8
2017-11-03 17:59:21,319 INFO : train_loss                0.34212
2017-11-03 17:59:21,320 INFO : valid_loss                0.45382
2017-11-03 17:59:21,321 INFO : test_loss                 0.68899
2017-11-03 17:59:21,322 INFO : train_misclass            0.09610
2017-11-03 17:59:21,323 INFO : valid_misclass            0.19553
2017-11-03 17:59:21,323 INFO : test_misclass             0.27500
2017-11-03 17:59:21,324 INFO : runtime                   0.66085
2017-11-03 17:59:21,325 INFO :
2017-11-03 17:59:21,327 INFO : New best valid_misclass: 0.195531
2017-11-03 17:59:21,328 INFO :
2017-11-03 17:59:21,874 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:21,981 INFO : Epoch 9
2017-11-03 17:59:21,982 INFO : train_loss                0.26619
2017-11-03 17:59:21,983 INFO : valid_loss                0.48593
2017-11-03 17:59:21,983 INFO : test_loss                 0.70376
2017-11-03 17:59:21,984 INFO : train_misclass            0.07242
2017-11-03 17:59:21,985 INFO : valid_misclass            0.18436
2017-11-03 17:59:21,986 INFO : test_misclass             0.26250
2017-11-03 17:59:21,987 INFO : runtime                   0.66527
2017-11-03 17:59:21,987 INFO :
2017-11-03 17:59:21,990 INFO : New best valid_misclass: 0.184358
2017-11-03 17:59:21,990 INFO :
2017-11-03 17:59:22,536 INFO : Time only for training updates: 0.54s
2017-11-03 17:59:22,644 INFO : Epoch 10
2017-11-03 17:59:22,645 INFO : train_loss                0.26250
2017-11-03 17:59:22,646 INFO : valid_loss                0.47718
2017-11-03 17:59:22,647 INFO : test_loss                 0.71324
2017-11-03 17:59:22,648 INFO : train_misclass            0.08914
2017-11-03 17:59:22,649 INFO : valid_misclass            0.18994
2017-11-03 17:59:22,649 INFO : test_misclass             0.28125
2017-11-03 17:59:22,650 INFO : runtime                   0.66180
2017-11-03 17:59:22,651 INFO :
2017-11-03 17:59:23,198 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:23,309 INFO : Epoch 11
2017-11-03 17:59:23,311 INFO : train_loss                0.21297
2017-11-03 17:59:23,312 INFO : valid_loss                0.48684
2017-11-03 17:59:23,312 INFO : test_loss                 0.74883
2017-11-03 17:59:23,313 INFO : train_misclass            0.06546
2017-11-03 17:59:23,314 INFO : valid_misclass            0.20670
2017-11-03 17:59:23,315 INFO : test_misclass             0.31250
2017-11-03 17:59:23,315 INFO : runtime                   0.66222
2017-11-03 17:59:23,316 INFO :
2017-11-03 17:59:23,864 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:23,973 INFO : Epoch 12
2017-11-03 17:59:23,974 INFO : train_loss                0.21066
2017-11-03 17:59:23,975 INFO : valid_loss                0.49149
2017-11-03 17:59:23,976 INFO : test_loss                 0.78449
2017-11-03 17:59:23,977 INFO : train_misclass            0.05710
2017-11-03 17:59:23,977 INFO : valid_misclass            0.18994
2017-11-03 17:59:23,978 INFO : test_misclass             0.30000
2017-11-03 17:59:23,979 INFO : runtime                   0.66576
2017-11-03 17:59:23,980 INFO :
2017-11-03 17:59:24,527 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:24,636 INFO : Epoch 13
2017-11-03 17:59:24,637 INFO : train_loss                0.22913
2017-11-03 17:59:24,638 INFO : valid_loss                0.52561
2017-11-03 17:59:24,639 INFO : test_loss                 0.68987
2017-11-03 17:59:24,639 INFO : train_misclass            0.06407
2017-11-03 17:59:24,640 INFO : valid_misclass            0.18436
2017-11-03 17:59:24,641 INFO : test_misclass             0.26250
2017-11-03 17:59:24,642 INFO : runtime                   0.66327
2017-11-03 17:59:24,642 INFO :
2017-11-03 17:59:24,645 INFO : New best valid_misclass: 0.184358
2017-11-03 17:59:24,645 INFO :
2017-11-03 17:59:25,191 INFO : Time only for training updates: 0.54s
2017-11-03 17:59:25,303 INFO : Epoch 14
2017-11-03 17:59:25,304 INFO : train_loss                0.29666
2017-11-03 17:59:25,305 INFO : valid_loss                0.62789
2017-11-03 17:59:25,306 INFO : test_loss                 0.88607
2017-11-03 17:59:25,306 INFO : train_misclass            0.09610
2017-11-03 17:59:25,307 INFO : valid_misclass            0.26257
2017-11-03 17:59:25,308 INFO : test_misclass             0.31875
2017-11-03 17:59:25,309 INFO : runtime                   0.66325
2017-11-03 17:59:25,309 INFO :
2017-11-03 17:59:25,857 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:25,965 INFO : Epoch 15
2017-11-03 17:59:25,966 INFO : train_loss                0.20635
2017-11-03 17:59:25,967 INFO : valid_loss                0.51987
2017-11-03 17:59:25,968 INFO : test_loss                 0.77714
2017-11-03 17:59:25,969 INFO : train_misclass            0.07103
2017-11-03 17:59:25,970 INFO : valid_misclass            0.20670
2017-11-03 17:59:25,970 INFO : test_misclass             0.31250
2017-11-03 17:59:25,971 INFO : runtime                   0.66714
2017-11-03 17:59:25,972 INFO :
2017-11-03 17:59:26,519 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:26,631 INFO : Epoch 16
2017-11-03 17:59:26,632 INFO : train_loss                0.18682
2017-11-03 17:59:26,633 INFO : valid_loss                0.47353
2017-11-03 17:59:26,634 INFO : test_loss                 0.71371
2017-11-03 17:59:26,635 INFO : train_misclass            0.05432
2017-11-03 17:59:26,636 INFO : valid_misclass            0.19553
2017-11-03 17:59:26,637 INFO : test_misclass             0.26250
2017-11-03 17:59:26,637 INFO : runtime                   0.66127
2017-11-03 17:59:26,638 INFO :
2017-11-03 17:59:27,185 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:27,293 INFO : Epoch 17
2017-11-03 17:59:27,295 INFO : train_loss                0.15229
2017-11-03 17:59:27,296 INFO : valid_loss                0.51995
2017-11-03 17:59:27,296 INFO : test_loss                 0.70597
2017-11-03 17:59:27,297 INFO : train_misclass            0.04178
2017-11-03 17:59:27,298 INFO : valid_misclass            0.21229
2017-11-03 17:59:27,299 INFO : test_misclass             0.30000
2017-11-03 17:59:27,300 INFO : runtime                   0.66622
2017-11-03 17:59:27,301 INFO :
2017-11-03 17:59:27,849 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:27,954 INFO : Epoch 18
2017-11-03 17:59:27,955 INFO : train_loss                0.19083
2017-11-03 17:59:27,956 INFO : valid_loss                0.50357
2017-11-03 17:59:27,957 INFO : test_loss                 0.67131
2017-11-03 17:59:27,957 INFO : train_misclass            0.04735
2017-11-03 17:59:27,958 INFO : valid_misclass            0.19553
2017-11-03 17:59:27,959 INFO : test_misclass             0.26250
2017-11-03 17:59:27,960 INFO : runtime                   0.66379
2017-11-03 17:59:27,960 INFO :
2017-11-03 17:59:28,508 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:28,616 INFO : Epoch 19
2017-11-03 17:59:28,617 INFO : train_loss                0.14053
2017-11-03 17:59:28,618 INFO : valid_loss                0.53879
2017-11-03 17:59:28,619 INFO : test_loss                 0.74517
2017-11-03 17:59:28,619 INFO : train_misclass            0.03343
2017-11-03 17:59:28,620 INFO : valid_misclass            0.20670
2017-11-03 17:59:28,621 INFO : test_misclass             0.25625
2017-11-03 17:59:28,622 INFO : runtime                   0.65849
2017-11-03 17:59:28,622 INFO :
2017-11-03 17:59:29,169 INFO : Time only for training updates: 0.55s
2017-11-03 17:59:29,279 INFO : Epoch 20
2017-11-03 17:59:29,280 INFO : train_loss                0.22331
2017-11-03 17:59:29,281 INFO : valid_loss                0.49784
2017-11-03 17:59:29,282 INFO : test_loss                 0.70844
2017-11-03 17:59:29,283 INFO : train_misclass            0.06964
2017-11-03 17:59:29,283 INFO : valid_misclass            0.16760
2017-11-03 17:59:29,284 INFO : test_misclass             0.23750
2017-11-03 17:59:29,285 INFO : runtime                   0.66110
2017-11-03 17:59:29,286 INFO :
2017-11-03 17:59:29,290 INFO : New best valid_misclass: 0.167598
2017-11-03 17:59:29,290 INFO :
2017-11-03 17:59:29,291 INFO : Setup for second stop...
2017-11-03 17:59:29,295 INFO : Train loss to reach 0.22331
2017-11-03 17:59:29,296 INFO : Run until second stop...
2017-11-03 17:59:29,410 INFO : Epoch 21
2017-11-03 17:59:29,412 INFO : train_loss                0.27810
2017-11-03 17:59:29,412 INFO : valid_loss                0.49784
2017-11-03 17:59:29,413 INFO : test_loss                 0.70844
2017-11-03 17:59:29,414 INFO : train_misclass            0.08919
2017-11-03 17:59:29,415 INFO : valid_misclass            0.16760
2017-11-03 17:59:29,415 INFO : test_misclass             0.23750
2017-11-03 17:59:29,416 INFO : runtime                   0.13360
2017-11-03 17:59:29,417 INFO :
2017-11-03 17:59:29,958 INFO : Time only for training updates: 0.54s
2017-11-03 17:59:30,085 INFO : Epoch 22
2017-11-03 17:59:30,087 INFO : train_loss                0.23934
2017-11-03 17:59:30,088 INFO : valid_loss                0.45107
2017-11-03 17:59:30,088 INFO : test_loss                 0.86186
2017-11-03 17:59:30,089 INFO : train_misclass            0.09142
2017-11-03 17:59:30,090 INFO : valid_misclass            0.20670
2017-11-03 17:59:30,091 INFO : test_misclass             0.28750
2017-11-03 17:59:30,091 INFO : runtime                   0.65554
2017-11-03 17:59:30,092 INFO :
2017-11-03 17:59:30,630 INFO : Time only for training updates: 0.54s
2017-11-03 17:59:30,754 INFO : Epoch 23
2017-11-03 17:59:30,755 INFO : train_loss                0.23411
2017-11-03 17:59:30,756 INFO : valid_loss                0.33481
2017-11-03 17:59:30,757 INFO : test_loss                 0.72723
2017-11-03 17:59:30,758 INFO : train_misclass            0.06132
2017-11-03 17:59:30,759 INFO : valid_misclass            0.13408
2017-11-03 17:59:30,760 INFO : test_misclass             0.31250
2017-11-03 17:59:30,761 INFO : runtime                   0.67196
2017-11-03 17:59:30,762 INFO :
2017-11-03 17:59:31,304 INFO : Time only for training updates: 0.54s
2017-11-03 17:59:31,429 INFO : Epoch 24
2017-11-03 17:59:31,431 INFO : train_loss                0.24864
2017-11-03 17:59:31,432 INFO : valid_loss                0.30050
2017-11-03 17:59:31,432 INFO : test_loss                 0.63026
2017-11-03 17:59:31,433 INFO : train_misclass            0.08250
2017-11-03 17:59:31,434 INFO : valid_misclass            0.11173
2017-11-03 17:59:31,435 INFO : test_misclass             0.23750
2017-11-03 17:59:31,435 INFO : runtime                   0.67471
2017-11-03 17:59:31,437 INFO :
2017-11-03 17:59:31,976 INFO : Time only for training updates: 0.54s
2017-11-03 17:59:32,101 INFO : Epoch 25
2017-11-03 17:59:32,102 INFO : train_loss                0.16780
2017-11-03 17:59:32,103 INFO : valid_loss                0.26910
2017-11-03 17:59:32,104 INFO : test_loss                 0.76967
2017-11-03 17:59:32,105 INFO : train_misclass            0.05017
2017-11-03 17:59:32,105 INFO : valid_misclass            0.09497
2017-11-03 17:59:32,106 INFO : test_misclass             0.29375
2017-11-03 17:59:32,107 INFO : runtime                   0.67182
2017-11-03 17:59:32,108 INFO :
2017-11-03 17:59:32,648 INFO : Time only for training updates: 0.54s
2017-11-03 17:59:32,772 INFO : Epoch 26
2017-11-03 17:59:32,773 INFO : train_loss                0.13316
2017-11-03 17:59:32,774 INFO : valid_loss                0.21726
2017-11-03 17:59:32,775 INFO : test_loss                 0.72940
2017-11-03 17:59:32,776 INFO : train_misclass            0.04571
2017-11-03 17:59:32,776 INFO : valid_misclass            0.08380
2017-11-03 17:59:32,777 INFO : test_misclass             0.27500
2017-11-03 17:59:32,778 INFO : runtime                   0.67151
2017-11-03 17:59:32,779 INFO :

We arrive around 26%, exact value depending on stars :))