In [1]:
from __future__ import print_function

import sys
import os
import time
import string

import numpy as np
import theano
import theano.tensor as T

import os; import sys; sys.path.append('..')
import gp

import gp.nets as nets
import gp.nets.BatchNormLayer as BatchNormLayer

import lasagne

sys.setrecursionlimit(10000)


Using gpu device 0: GeForce GTX TITAN (CNMeM is disabled, CuDNN 4007)
/home/d/nolearn/local/lib/python2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
  warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')
/home/d/nolearn/local/lib/python2.7/site-packages/theano/tensor/signal/downsample.py:6: UserWarning: downsample module has been moved to the theano.tensor.signal.pool module.
  "downsample module has been moved to the theano.tensor.signal.pool module.")

In [2]:
%load_ext autoreload
%autoreload 2

In [2]:
# helper function for projection_b
def ceildiv(a, b):
    return -(-a // b)

def build_cnn(input_var=None, n=1, num_filters=8, cudnn='no'):
    import lasagne # For some odd reason it can't read the global import, please PR/Issue if you know why
    projection_type = 'B'
    # Setting up layers
    if cudnn == 'yes':
        import lasagne.layers.dnn
        conv = lasagne.layers.dnn.Conv2DDNNLayer # cuDNN
    else:
        conv = lasagne.layers.Conv2DLayer
    nonlin = lasagne.nonlinearities.rectify
    nonlin_layer = lasagne.layers.NonlinearityLayer
    sumlayer = lasagne.layers.ElemwiseSumLayer
    #batchnorm = BatchNormLayer.BatchNormLayer
    batchnorm = lasagne.layers.BatchNormLayer

    # Setting the projection type for when reducing height/width
    # and increasing dimensions.
    # Default is 'B' as B performs slightly better
    # and A requires newer version of lasagne with ExpressionLayer
    projection_type = 'B'
    if projection_type == 'A':
        expression = lasagne.layers.ExpressionLayer
        pad = lasagne.layers.PadLayer

    if projection_type == 'A':
        # option A for projection as described in paper
        # (should perform slightly worse than B)
        def projection(l_inp):
            n_filters = l_inp.output_shape[1]*2
            l = expression(l_inp, lambda X: X[:, :, ::2, ::2], lambda s: (s[0], s[1], ceildiv(s[2], 2), ceildiv(s[3], 2)))
            l = pad(l, [n_filters//4,0,0], batch_ndim=1)
            return l

    if projection_type == 'B':
        # option B for projection as described in paper
        def projection(l_inp):
            # twice normal channels when projecting!
            n_filters = l_inp.output_shape[1]*2 
            l = conv(l_inp, num_filters=n_filters, filter_size=(1, 1),
                     stride=(2, 2), nonlinearity=None, pad='same', b=None)
            l = batchnorm(l)
            return l

    # helper function to handle filters/strides when increasing dims
    def filters_increase_dims(l, increase_dims):
        in_num_filters = l.output_shape[1]
        if increase_dims:
            first_stride = (2, 2)
            out_num_filters = in_num_filters*2
        else:
            first_stride = (1, 1)
            out_num_filters = in_num_filters
 
        return out_num_filters, first_stride

    # block as described and used in cifar in the original paper:
    # http://arxiv.org/abs/1512.03385
    def res_block_v1(l_inp, nonlinearity=nonlin, increase_dim=False):
        # first figure filters/strides
        n_filters, first_stride = filters_increase_dims(l_inp, increase_dim)
        # conv -> BN -> nonlin -> conv -> BN -> sum -> nonlin
        l = conv(l_inp, num_filters=n_filters, filter_size=(3, 3),
                 stride=first_stride, nonlinearity=None, pad='same',
                 W=lasagne.init.HeNormal(gain='relu'))
        l = batchnorm(l)
        l = nonlin_layer(l, nonlinearity=nonlin)
        l = conv(l, num_filters=n_filters, filter_size=(3, 3),
                 stride=(1, 1), nonlinearity=None, pad='same',
                 W=lasagne.init.HeNormal(gain='relu'))
        l = batchnorm(l)
        if increase_dim:
            # Use projection (A, B) as described in paper
            p = projection(l_inp)
        else:
            # Identity shortcut
            p = l_inp
        l = sumlayer([l, p])
        l = nonlin_layer(l, nonlinearity=nonlin)
        return l

    # block as described in second paper on the subject (by same authors):
    # http://arxiv.org/abs/1603.05027
    def res_block_v2(l_inp, nonlinearity=nonlin, increase_dim=False):
        # first figure filters/strides
        n_filters, first_stride = filters_increase_dims(l_inp, increase_dim)
        # BN -> nonlin -> conv -> BN -> nonlin -> conv -> sum
        l = batchnorm(l_inp)
        l = nonlin_layer(l, nonlinearity=nonlin)
        l = conv(l, num_filters=n_filters, filter_size=(3, 3),
                 stride=first_stride, nonlinearity=None, pad='same',
                 W=lasagne.init.HeNormal(gain='relu'))
        l = batchnorm(l)
        l = nonlin_layer(l, nonlinearity=nonlin)
        l = conv(l, num_filters=n_filters, filter_size=(3, 3),
                 stride=(1, 1), nonlinearity=None, pad='same',
                 W=lasagne.init.HeNormal(gain='relu'))
        if increase_dim:
            # Use projection (A, B) as described in paper
            p = projection(l_inp)
        else:
            # Identity shortcut
            p = l_inp
        l = sumlayer([l, p])
        return l

    def bottleneck_block(l_inp, nonlinearity=nonlin, increase_dim=False):
        # first figure filters/strides
        n_filters, first_stride = filters_increase_dims(l_inp, increase_dim)
        # conv -> BN -> nonlin -> conv -> BN -> nonlin -> conv -> BN -> sum
        # -> nonlin
        # first make the bottleneck, scale the filters ..!
        scale = 4 # as per bottleneck architecture used in paper
        scaled_filters = n_filters/scale
        l = conv(l_inp, num_filters=scaled_filters, filter_size=(1, 1),
                 stride=first_stride, nonlinearity=None, pad='same',
                 W=lasagne.init.HeNormal(gain='relu'))
        l = batchnorm(l)
        l = nonlin_layer(l, nonlinearity=nonlin)
        l = conv(l, num_filters=scaled_filters, filter_size=(3, 3),
                 stride=(1, 1), nonlinearity=None, pad='same',
                 W=lasagne.init.HeNormal(gain='relu'))
        l = batchnorm(l)
        l = nonlin_layer(l, nonlinearity=nonlin)
        l = conv(l, num_filters=n_filters, filter_size=(1, 1),
                 stride=(1, 1), nonlinearity=None, pad='same',
                 W=lasagne.init.HeNormal(gain='relu'))
        if increase_dim:
            # Use projection (A, B) as described in paper
            p = projection(l_inp)
        else:
            # Identity shortcut
            p = l_inp
        l = sumlayer([l, p])
        l = nonlin_layer(l, nonlinearity=nonlin)
        return l

    # Bottleneck architecture with more efficiency (the post with Kaiming He's response)
    # https://www.reddit.com/r/MachineLearning/comments/3ywi6x/deep_residual_learning_the_bottleneck/ 
    def bottleneck_block_fast(l_inp, nonlinearity=nonlin, increase_dim=False):
        # first figure filters/strides
        n_filters, last_stride = filters_increase_dims(l_inp, increase_dim)
        # conv -> BN -> nonlin -> conv -> BN -> nonlin -> conv -> BN -> sum
        # -> nonlin
        # first make the bottleneck, scale the filters ..!
        scale = 4 # as per bottleneck architecture used in paper
        scaled_filters = n_filters/scale
        l = conv(l_inp, num_filters=scaled_filters, filter_size=(1, 1),
                 stride=(1, 1), nonlinearity=None, pad='same',
                 W=lasagne.init.HeNormal(gain='relu'))
        l = batchnorm(l)
        l = nonlin_layer(l, nonlinearity=nonlin)
        l = conv(l, num_filters=scaled_filters, filter_size=(3, 3),
                 stride=(1, 1), nonlinearity=None, pad='same',
                 W=lasagne.init.HeNormal(gain='relu'))
        l = batchnorm(l)
        l = nonlin_layer(l, nonlinearity=nonlin)
        l = conv(l, num_filters=n_filters, filter_size=(1, 1),
                 stride=last_stride, nonlinearity=None, pad='same',
                 W=lasagne.init.HeNormal(gain='relu'))
        if increase_dim:
            # Use projection (A, B) as described in paper
            p = projection(l_inp)
        else:
            # Identity shortcut
            p = l_inp
        l = sumlayer([l, p])
        l = nonlin_layer(l, nonlinearity=nonlin)
        return l
       
    res_block = res_block_v1

    # Stacks the residual blocks, makes it easy to model size of architecture with int n   
    def blockstack(l, n, nonlinearity=nonlin):
        for _ in range(n):
            l = res_block(l, nonlinearity=nonlin)
        return l

    # Building the network
    l_in = lasagne.layers.InputLayer(shape=(None, 4, 75, 75),
                                        input_var=input_var)
    # First layer! just a plain convLayer
    l1 = conv(l_in, num_filters=num_filters, stride=(1, 1),
              filter_size=(3, 3), nonlinearity=None, pad='same')
    l1 = batchnorm(l1)
    l1 = nonlin_layer(l1, nonlinearity=nonlin)

    # Stacking bottlenecks and increasing dims! (while reducing shape size)
    l1_bs = blockstack(l1, n=n)
    l1_id = res_block(l1_bs, increase_dim=True)

    l2_bs = blockstack(l1_id, n=n)
    l2_id = res_block(l2_bs, increase_dim=True)

    l3_bs = blockstack(l2_id, n=n)

    # And, finally, the 10-unit output layer:
    network = lasagne.layers.DenseLayer(
            l3_bs,
            num_units=2,
            nonlinearity=lasagne.nonlinearities.softmax)

    return network


# ############################# Batch iterator ###############################
# This is just a simple helper function iterating over training data in
# mini-batches of a particular size, optionally in random order. It assumes
# data is available as numpy arrays. For big datasets, you could load numpy
# arrays as memory-mapped files (np.load(..., mmap_mode='r')), or write your
# own custom data iteration function. For small datasets, you can also copy
# them to GPU at once for slightly improved performance. This would involve
# several changes in the main program, though, and is not demonstrated here.

def iterate_minibatches(inputs, targets, batchsize, shuffle=False):
    assert len(inputs) == len(targets)
    if shuffle:
        indices = np.arange(len(inputs))
        np.random.shuffle(indices)
    for start_idx in range(0, len(inputs) - batchsize + 1, batchsize):
        if shuffle:
            excerpt = indices[start_idx:start_idx + batchsize]
        else:
            excerpt = slice(start_idx, start_idx + batchsize)
            
            Xb = inputs[excerpt]
            yb = targets[excerpt]
            
            Xb = Xb - .5
            
            k_s = np.array([0,1,2,3],dtype=np.uint8)
            for i in range(len(Xb)):
                k = np.random.choice(k_s)
                for j in range(Xb.shape[1]):
                    Xb[j][0] = np.rot90(Xb[j][0], k)
                    
            yield Xb, yb
            
#         yield inputs[excerpt], targets[excerpt]

In [3]:
PATCH_PATH = ('ipmlb')
X_train, y_train, X_test, y_test = gp.Patch.load_rgba(PATCH_PATH)


Loaded /home/d/patches//ipmlb/ in 0.161231994629 seconds.

In [4]:
X_val = X_train[-X_train.shape[0]/4:]
y_val = y_train[-X_train.shape[0]/4:]

In [5]:
X_train2 = X_train[:-X_train.shape[0]/4]
y_train2 = y_train[:-X_train.shape[0]/4]

In [6]:
n=1
num_filters=16
num_epochs=200
cudnn='yes'

In [7]:
# Prepare Theano variables for inputs and targets
input_var = T.tensor4('inputs')
target_var = T.ivector('targets')

# Create neural network model (depending on first command line parameter)
print("Building model and compiling functions...")
network = build_cnn(input_var, n, num_filters, cudnn)
all_layers = lasagne.layers.get_all_layers(network)
num_params = lasagne.layers.count_params(network)
num_conv = 0
num_nonlin = 0
num_input = 0
num_batchnorm = 0
num_elemsum = 0
num_dense = 0
num_unknown = 0
print("  layer output shapes:")
for layer in all_layers:
    name = string.ljust(layer.__class__.__name__, 32)
    print("    %s %s" %(name, lasagne.layers.get_output_shape(layer)))
    if "Conv2D" in name:
        num_conv += 1
    elif "NonlinearityLayer" in name:
        num_nonlin += 1
    elif "InputLayer" in name:
        num_input += 1
    elif "BatchNormLayer" in name:
        num_batchnorm += 1
    elif "ElemwiseSumLayer" in name:
        num_elemsum += 1
    elif "DenseLayer" in name:
        num_dense += 1
    else:
        num_unknown += 1
print("  no. of InputLayers: %d" % num_input)
print("  no. of Conv2DLayers: %d" % num_conv)
print("  no. of BatchNormLayers: %d" % num_batchnorm)
print("  no. of NonlinearityLayers: %d" % num_nonlin)
print("  no. of DenseLayers: %d" % num_dense)
print("  no. of ElemwiseSumLayers: %d" % num_elemsum)
print("  no. of Unknown Layers: %d" % num_unknown)
print("  total no. of layers: %d" % len(all_layers))
print("  no. of parameters: %d" % num_params)
# Create a loss expression for training, i.e., a scalar objective we want
# to minimize (for our multi-class problem, it is the cross-entropy loss):
prediction = lasagne.layers.get_output(network)
loss = lasagne.objectives.categorical_crossentropy(prediction, target_var)
loss = loss.mean()
# We could add some weight decay as well here, see lasagne.regularization.

# Create update expressions for training, i.e., how to modify the
# parameters at each training step. Here, we'll use Stochastic Gradient
# Descent (SGD) with Nesterov momentum, but Lasagne offers plenty more.
params = lasagne.layers.get_all_params(network, trainable=True)

# several learning rates for low initial learning rates and
# learning rate anealing (id is epoch)
learning_rate_schedule = {
0: 0.0001, # low initial learning rate as described in paper
2: 0.01,
100: 0.001,
150: 0.0001
}


learning_rate = theano.shared(np.float32(learning_rate_schedule[0]))

updates = lasagne.updates.nesterov_momentum(
        loss, params, learning_rate=learning_rate, momentum=0.9)

# Create a loss expression for validation/testing. The crucial difference
# here is that we do a deterministic forward pass through the network,
# disabling dropout layers.
test_prediction = lasagne.layers.get_output(network, deterministic=True)
test_loss = lasagne.objectives.categorical_crossentropy(test_prediction,
                                                        target_var)
test_loss = test_loss.mean()
# As a bonus, also create an expression for the classification accuracy:
test_acc = T.mean(T.eq(T.argmax(test_prediction, axis=1), target_var),
                  dtype=theano.config.floatX)

# Compile a function performing a training step on a mini-batch (by giving
# the updates dictionary) and returning the corresponding training loss:
train_fn = theano.function([input_var, target_var], loss, updates=updates)

# Compile a second function computing the validation loss and accuracy:
val_fn = theano.function([input_var, target_var], [test_loss, test_acc])


Building model and compiling functions...
  layer output shapes:
    InputLayer                       (None, 4, 75, 75)
    Conv2DDNNLayer                   (None, 16, 75, 75)
    BatchNormLayer                   (None, 16, 75, 75)
    NonlinearityLayer                (None, 16, 75, 75)
    Conv2DDNNLayer                   (None, 16, 75, 75)
    BatchNormLayer                   (None, 16, 75, 75)
    NonlinearityLayer                (None, 16, 75, 75)
    Conv2DDNNLayer                   (None, 16, 75, 75)
    BatchNormLayer                   (None, 16, 75, 75)
    ElemwiseSumLayer                 (None, 16, 75, 75)
    NonlinearityLayer                (None, 16, 75, 75)
    Conv2DDNNLayer                   (None, 32, 38, 38)
    BatchNormLayer                   (None, 32, 38, 38)
    NonlinearityLayer                (None, 32, 38, 38)
    Conv2DDNNLayer                   (None, 32, 38, 38)
    BatchNormLayer                   (None, 32, 38, 38)
    Conv2DDNNLayer                   (None, 32, 38, 38)
    BatchNormLayer                   (None, 32, 38, 38)
    ElemwiseSumLayer                 (None, 32, 38, 38)
    NonlinearityLayer                (None, 32, 38, 38)
    Conv2DDNNLayer                   (None, 32, 38, 38)
    BatchNormLayer                   (None, 32, 38, 38)
    NonlinearityLayer                (None, 32, 38, 38)
    Conv2DDNNLayer                   (None, 32, 38, 38)
    BatchNormLayer                   (None, 32, 38, 38)
    ElemwiseSumLayer                 (None, 32, 38, 38)
    NonlinearityLayer                (None, 32, 38, 38)
    Conv2DDNNLayer                   (None, 64, 19, 19)
    BatchNormLayer                   (None, 64, 19, 19)
    NonlinearityLayer                (None, 64, 19, 19)
    Conv2DDNNLayer                   (None, 64, 19, 19)
    BatchNormLayer                   (None, 64, 19, 19)
    Conv2DDNNLayer                   (None, 64, 19, 19)
    BatchNormLayer                   (None, 64, 19, 19)
    ElemwiseSumLayer                 (None, 64, 19, 19)
    NonlinearityLayer                (None, 64, 19, 19)
    Conv2DDNNLayer                   (None, 64, 19, 19)
    BatchNormLayer                   (None, 64, 19, 19)
    NonlinearityLayer                (None, 64, 19, 19)
    Conv2DDNNLayer                   (None, 64, 19, 19)
    BatchNormLayer                   (None, 64, 19, 19)
    ElemwiseSumLayer                 (None, 64, 19, 19)
    NonlinearityLayer                (None, 64, 19, 19)
    DenseLayer                       (None, 2)
  no. of InputLayers: 1
  no. of Conv2DLayers: 13
  no. of BatchNormLayers: 13
  no. of NonlinearityLayers: 11
  no. of DenseLayers: 1
  no. of ElemwiseSumLayers: 5
  no. of Unknown Layers: 0
  total no. of layers: 44
  no. of parameters: 217778

In [49]:
# Finally, launch the training loop.
print("Starting training...")
# We iterate over epochs:
for epoch in range(num_epochs):
    if epoch in learning_rate_schedule:
        lr = np.float32(learning_rate_schedule[epoch])
        print(" setting learning rate to %.7f" % lr)
        learning_rate.set_value(lr)
    # In each epoch, we do a full pass over the training data:
    train_err = 0
    train_batches = 0
    start_time = time.time()
    for batch in iterate_minibatches(X_train2, y_train2, 500, shuffle=False):
        inputs, targets = batch
        train_err += train_fn(inputs, targets)
        train_batches += 1

    # And a full pass over the validation data:
    val_err = 0
    val_acc = 0
    val_batches = 0
    for batch in iterate_minibatches(X_val, y_val, 500, shuffle=False):
        inputs, targets = batch
        err, acc = val_fn(inputs, targets)
        val_err += err
        val_acc += acc
        val_batches += 1

    # Then we print the results for this epoch:
    print("Epoch {} of {} took {:.3f}s".format(
        epoch + 1, num_epochs, time.time() - start_time))
    print("  training loss:\t\t{:.6f}".format(train_err / train_batches))
    print("  validation loss:\t\t{:.6f}".format(val_err / val_batches))
    print("  validation accuracy:\t\t{:.2f} %".format(
        val_acc / val_batches * 100))


Starting training...
 setting learning rate to 0.0001000
Epoch 1 of 500 took 273.906s
  training loss:		0.525972
  validation loss:		0.411783
  validation accuracy:		82.94 %
Epoch 2 of 500 took 274.976s
  training loss:		0.364997
  validation loss:		0.341984
  validation accuracy:		86.23 %
 setting learning rate to 0.0100000
Epoch 3 of 500 took 274.992s
  training loss:		0.603202
  validation loss:		0.231432
  validation accuracy:		90.50 %
Epoch 4 of 500 took 274.845s
  training loss:		0.214063
  validation loss:		0.209323
  validation accuracy:		91.97 %
Epoch 5 of 500 took 274.957s
  training loss:		0.200622
  validation loss:		0.199121
  validation accuracy:		92.53 %
Epoch 6 of 500 took 274.935s
  training loss:		0.190989
  validation loss:		0.195666
  validation accuracy:		92.80 %
Epoch 7 of 500 took 274.876s
  training loss:		0.182546
  validation loss:		0.193178
  validation accuracy:		92.82 %
Epoch 8 of 500 took 275.007s
  training loss:		0.174501
  validation loss:		0.181994
  validation accuracy:		93.24 %
Epoch 9 of 500 took 274.913s
  training loss:		0.166674
  validation loss:		0.177469
  validation accuracy:		93.35 %
Epoch 10 of 500 took 274.961s
  training loss:		0.158963
  validation loss:		0.173296
  validation accuracy:		93.47 %
Epoch 11 of 500 took 274.939s
  training loss:		0.151424
  validation loss:		0.170585
  validation accuracy:		93.66 %
Epoch 12 of 500 took 274.959s
  training loss:		0.143806
  validation loss:		0.166776
  validation accuracy:		93.77 %
Epoch 13 of 500 took 274.940s
  training loss:		0.136393
  validation loss:		0.167214
  validation accuracy:		93.70 %
Epoch 14 of 500 took 275.084s
  training loss:		0.129090
  validation loss:		0.162699
  validation accuracy:		93.94 %
Epoch 15 of 500 took 275.135s
  training loss:		0.121785
  validation loss:		0.162171
  validation accuracy:		94.01 %
Epoch 16 of 500 took 274.811s
  training loss:		0.114568
  validation loss:		0.160853
  validation accuracy:		93.92 %
Epoch 17 of 500 took 274.952s
  training loss:		0.107391
  validation loss:		0.157906
  validation accuracy:		94.15 %
Epoch 18 of 500 took 274.957s
  training loss:		0.100383
  validation loss:		0.156327
  validation accuracy:		94.34 %
Epoch 19 of 500 took 274.838s
  training loss:		0.093513
  validation loss:		0.159147
  validation accuracy:		94.26 %
Epoch 20 of 500 took 274.856s
  training loss:		0.087196
  validation loss:		0.162578
  validation accuracy:		94.38 %
Epoch 21 of 500 took 274.940s
  training loss:		0.081014
  validation loss:		0.155076
  validation accuracy:		94.36 %
Epoch 22 of 500 took 274.782s
  training loss:		0.075149
  validation loss:		0.148147
  validation accuracy:		94.73 %
Epoch 23 of 500 took 274.919s
  training loss:		0.069111
  validation loss:		0.145106
  validation accuracy:		94.96 %
Epoch 24 of 500 took 275.030s
  training loss:		0.063785
  validation loss:		0.140536
  validation accuracy:		95.24 %
Epoch 25 of 500 took 274.778s
  training loss:		0.058663
  validation loss:		0.134384
  validation accuracy:		95.50 %
Epoch 26 of 500 took 275.080s
  training loss:		0.054045
  validation loss:		0.135181
  validation accuracy:		95.38 %
Epoch 27 of 500 took 274.826s
  training loss:		0.049663
  validation loss:		0.131245
  validation accuracy:		95.59 %
Epoch 28 of 500 took 274.875s
  training loss:		0.045703
  validation loss:		0.134718
  validation accuracy:		95.58 %
Epoch 29 of 500 took 274.803s
  training loss:		0.041939
  validation loss:		0.134026
  validation accuracy:		95.70 %
Epoch 30 of 500 took 274.235s
  training loss:		0.038375
  validation loss:		0.132246
  validation accuracy:		95.68 %
Epoch 31 of 500 took 274.234s
  training loss:		0.034664
  validation loss:		0.134482
  validation accuracy:		95.49 %
Epoch 32 of 500 took 274.243s
  training loss:		0.031810
  validation loss:		0.131226
  validation accuracy:		95.66 %
Epoch 33 of 500 took 274.193s
  training loss:		0.029503
  validation loss:		0.116156
  validation accuracy:		96.42 %
Epoch 34 of 500 took 274.230s
  training loss:		0.026646
  validation loss:		0.110445
  validation accuracy:		96.62 %
Epoch 35 of 500 took 274.234s
  training loss:		0.024195
  validation loss:		0.109905
  validation accuracy:		96.74 %
Epoch 36 of 500 took 274.229s
  training loss:		0.022112
  validation loss:		0.109599
  validation accuracy:		96.92 %
Epoch 37 of 500 took 274.231s
  training loss:		0.020033
  validation loss:		0.114158
  validation accuracy:		96.73 %
Epoch 38 of 500 took 274.246s
  training loss:		0.018206
  validation loss:		0.112010
  validation accuracy:		96.87 %
Epoch 39 of 500 took 274.293s
  training loss:		0.017151
  validation loss:		0.105058
  validation accuracy:		97.18 %
Epoch 40 of 500 took 274.195s
  training loss:		0.015018
  validation loss:		0.113442
  validation accuracy:		97.00 %
Epoch 41 of 500 took 274.228s
  training loss:		0.014090
  validation loss:		0.129953
  validation accuracy:		96.72 %
Epoch 42 of 500 took 274.238s
  training loss:		0.012604
  validation loss:		0.122794
  validation accuracy:		96.87 %
Epoch 43 of 500 took 274.254s
  training loss:		0.011587
  validation loss:		0.139061
  validation accuracy:		96.59 %
Epoch 44 of 500 took 274.197s
  training loss:		0.009657
  validation loss:		0.151959
  validation accuracy:		96.18 %
Epoch 45 of 500 took 274.280s
  training loss:		0.008691
  validation loss:		0.137810
  validation accuracy:		96.65 %
Epoch 46 of 500 took 274.182s
  training loss:		0.007600
  validation loss:		0.123054
  validation accuracy:		97.10 %
Epoch 47 of 500 took 274.228s
  training loss:		0.006489
  validation loss:		0.095529
  validation accuracy:		98.03 %
Epoch 48 of 500 took 274.227s
  training loss:		0.005587
  validation loss:		0.087004
  validation accuracy:		98.27 %
Epoch 49 of 500 took 283.544s
  training loss:		0.004895
  validation loss:		0.084536
  validation accuracy:		98.37 %
Epoch 50 of 500 took 274.315s
  training loss:		0.003969
  validation loss:		0.082435
  validation accuracy:		98.49 %
Epoch 51 of 500 took 274.895s
  training loss:		0.003324
  validation loss:		0.081999
  validation accuracy:		98.49 %
Epoch 52 of 500 took 275.043s
  training loss:		0.002745
  validation loss:		0.080958
  validation accuracy:		98.56 %
Epoch 53 of 500 took 274.832s
  training loss:		0.002297
  validation loss:		0.080562
  validation accuracy:		98.64 %
Epoch 54 of 500 took 274.881s
  training loss:		0.002008
  validation loss:		0.080135
  validation accuracy:		98.65 %
Epoch 55 of 500 took 274.816s
  training loss:		0.001766
  validation loss:		0.079283
  validation accuracy:		98.71 %
Epoch 56 of 500 took 275.066s
  training loss:		0.001591
  validation loss:		0.078649
  validation accuracy:		98.76 %
Epoch 57 of 500 took 274.595s
  training loss:		0.001448
  validation loss:		0.078596
  validation accuracy:		98.78 %
Epoch 58 of 500 took 283.904s
  training loss:		0.001337
  validation loss:		0.078527
  validation accuracy:		98.81 %
Epoch 59 of 500 took 275.067s
  training loss:		0.001237
  validation loss:		0.078694
  validation accuracy:		98.83 %
Epoch 60 of 500 took 284.265s
  training loss:		0.001153
  validation loss:		0.079122
  validation accuracy:		98.84 %
Epoch 61 of 500 took 274.808s
  training loss:		0.001076
  validation loss:		0.079790
  validation accuracy:		98.85 %
Epoch 62 of 500 took 276.327s
  training loss:		0.001010
  validation loss:		0.080642
  validation accuracy:		98.85 %
Epoch 63 of 500 took 286.318s
  training loss:		0.000950
  validation loss:		0.081524
  validation accuracy:		98.84 %
Epoch 64 of 500 took 285.662s
  training loss:		0.000898
  validation loss:		0.082597
  validation accuracy:		98.83 %
Epoch 65 of 500 took 292.515s
  training loss:		0.000850
  validation loss:		0.083504
  validation accuracy:		98.83 %
Epoch 66 of 500 took 298.238s
  training loss:		0.000807
  validation loss:		0.084363
  validation accuracy:		98.82 %
Epoch 67 of 500 took 286.525s
  training loss:		0.000768
  validation loss:		0.085236
  validation accuracy:		98.82 %
Epoch 68 of 500 took 286.586s
  training loss:		0.000732
  validation loss:		0.086014
  validation accuracy:		98.81 %
Epoch 69 of 500 took 279.426s
  training loss:		0.000700
  validation loss:		0.086727
  validation accuracy:		98.81 %
Epoch 70 of 500 took 281.917s
  training loss:		0.000671
  validation loss:		0.087458
  validation accuracy:		98.81 %
Epoch 71 of 500 took 292.987s
  training loss:		0.000644
  validation loss:		0.088091
  validation accuracy:		98.80 %
Epoch 72 of 500 took 289.481s
  training loss:		0.000619
  validation loss:		0.088636
  validation accuracy:		98.79 %
Epoch 73 of 500 took 290.789s
  training loss:		0.000596
  validation loss:		0.089315
  validation accuracy:		98.80 %
Epoch 74 of 500 took 286.087s
  training loss:		0.000575
  validation loss:		0.089846
  validation accuracy:		98.80 %
Epoch 75 of 500 took 285.556s
  training loss:		0.000555
  validation loss:		0.090368
  validation accuracy:		98.79 %
Epoch 76 of 500 took 280.500s
  training loss:		0.000537
  validation loss:		0.090868
  validation accuracy:		98.79 %
Epoch 77 of 500 took 287.787s
  training loss:		0.000520
  validation loss:		0.091207
  validation accuracy:		98.79 %
Epoch 78 of 500 took 287.568s
  training loss:		0.000503
  validation loss:		0.091478
  validation accuracy:		98.79 %
Epoch 79 of 500 took 283.057s
  training loss:		0.000489
  validation loss:		0.091713
  validation accuracy:		98.79 %
Epoch 80 of 500 took 284.904s
  training loss:		0.000474
  validation loss:		0.091850
  validation accuracy:		98.79 %
Epoch 81 of 500 took 284.965s
  training loss:		0.000461
  validation loss:		0.091944
  validation accuracy:		98.79 %
Epoch 82 of 500 took 279.892s
  training loss:		0.000448
  validation loss:		0.092132
  validation accuracy:		98.79 %
Epoch 83 of 500 took 285.364s
  training loss:		0.000436
  validation loss:		0.092168
  validation accuracy:		98.80 %
Epoch 84 of 500 took 280.957s
  training loss:		0.000425
  validation loss:		0.092250
  validation accuracy:		98.80 %
Epoch 85 of 500 took 283.706s
  training loss:		0.000414
  validation loss:		0.092320
  validation accuracy:		98.81 %
Epoch 86 of 500 took 281.311s
  training loss:		0.000404
  validation loss:		0.092421
  validation accuracy:		98.82 %
Epoch 87 of 500 took 282.482s
  training loss:		0.000394
  validation loss:		0.092375
  validation accuracy:		98.82 %
Epoch 88 of 500 took 283.276s
  training loss:		0.000385
  validation loss:		0.092533
  validation accuracy:		98.82 %
Epoch 89 of 500 took 283.266s
  training loss:		0.000376
  validation loss:		0.092512
  validation accuracy:		98.83 %
Epoch 90 of 500 took 280.765s
  training loss:		0.000368
  validation loss:		0.092549
  validation accuracy:		98.83 %
Epoch 91 of 500 took 285.472s
  training loss:		0.000360
  validation loss:		0.092601
  validation accuracy:		98.83 %
Epoch 92 of 500 took 280.316s
  training loss:		0.000352
  validation loss:		0.092599
  validation accuracy:		98.84 %
Epoch 93 of 500 took 284.024s
  training loss:		0.000345
  validation loss:		0.092650
  validation accuracy:		98.85 %
Epoch 94 of 500 took 283.598s
  training loss:		0.000337
  validation loss:		0.092645
  validation accuracy:		98.85 %
Epoch 95 of 500 took 285.868s
  training loss:		0.000331
  validation loss:		0.092665
  validation accuracy:		98.86 %
Epoch 96 of 500 took 288.291s
  training loss:		0.000324
  validation loss:		0.092730
  validation accuracy:		98.86 %
Epoch 97 of 500 took 283.991s
  training loss:		0.000318
  validation loss:		0.092707
  validation accuracy:		98.86 %
Epoch 98 of 500 took 285.237s
  training loss:		0.000312
  validation loss:		0.092736
  validation accuracy:		98.86 %
Epoch 99 of 500 took 282.943s
  training loss:		0.000306
  validation loss:		0.092767
  validation accuracy:		98.86 %
Epoch 100 of 500 took 283.561s
  training loss:		0.000300
  validation loss:		0.092815
  validation accuracy:		98.87 %
 setting learning rate to 0.0010000
Epoch 101 of 500 took 282.367s
  training loss:		0.000312
  validation loss:		0.086174
  validation accuracy:		98.95 %
Epoch 102 of 500 took 283.792s
  training loss:		0.000295
  validation loss:		0.086169
  validation accuracy:		98.95 %
Epoch 103 of 500 took 282.886s
  training loss:		0.000292
  validation loss:		0.086167
  validation accuracy:		98.95 %
Epoch 104 of 500 took 281.913s
  training loss:		0.000291
  validation loss:		0.086168
  validation accuracy:		98.96 %
Epoch 105 of 500 took 281.863s
  training loss:		0.000289
  validation loss:		0.086172
  validation accuracy:		98.96 %
Epoch 106 of 500 took 281.447s
  training loss:		0.000288
  validation loss:		0.086173
  validation accuracy:		98.96 %
Epoch 107 of 500 took 283.382s
  training loss:		0.000287
  validation loss:		0.086180
  validation accuracy:		98.96 %
Epoch 108 of 500 took 284.308s
  training loss:		0.000286
  validation loss:		0.086192
  validation accuracy:		98.96 %
Epoch 109 of 500 took 288.158s
  training loss:		0.000285
  validation loss:		0.086201
  validation accuracy:		98.96 %
Epoch 110 of 500 took 284.187s
  training loss:		0.000284
  validation loss:		0.086209
  validation accuracy:		98.96 %
Epoch 111 of 500 took 284.599s
  training loss:		0.000283
  validation loss:		0.086219
  validation accuracy:		98.96 %
Epoch 112 of 500 took 290.558s
  training loss:		0.000282
  validation loss:		0.086229
  validation accuracy:		98.96 %
Epoch 113 of 500 took 286.051s
  training loss:		0.000282
  validation loss:		0.086239
  validation accuracy:		98.96 %
Epoch 114 of 500 took 289.379s
  training loss:		0.000281
  validation loss:		0.086250
  validation accuracy:		98.96 %
Epoch 115 of 500 took 288.092s
  training loss:		0.000280
  validation loss:		0.086262
  validation accuracy:		98.96 %
Epoch 116 of 500 took 290.835s
  training loss:		0.000279
  validation loss:		0.086276
  validation accuracy:		98.96 %
Epoch 117 of 500 took 290.050s
  training loss:		0.000279
  validation loss:		0.086286
  validation accuracy:		98.96 %
Epoch 118 of 500 took 285.373s
  training loss:		0.000278
  validation loss:		0.086298
  validation accuracy:		98.96 %
Epoch 119 of 500 took 288.308s
  training loss:		0.000277
  validation loss:		0.086309
  validation accuracy:		98.96 %
Epoch 120 of 500 took 287.893s
  training loss:		0.000276
  validation loss:		0.086321
  validation accuracy:		98.95 %
Epoch 121 of 500 took 285.907s
  training loss:		0.000276
  validation loss:		0.086333
  validation accuracy:		98.95 %
Epoch 122 of 500 took 288.010s
  training loss:		0.000275
  validation loss:		0.086344
  validation accuracy:		98.95 %
Epoch 123 of 500 took 288.690s
  training loss:		0.000274
  validation loss:		0.086357
  validation accuracy:		98.96 %
Epoch 124 of 500 took 287.711s
  training loss:		0.000274
  validation loss:		0.086370
  validation accuracy:		98.96 %
Epoch 125 of 500 took 288.504s
  training loss:		0.000273
  validation loss:		0.086383
  validation accuracy:		98.96 %
Epoch 126 of 500 took 288.261s
  training loss:		0.000272
  validation loss:		0.086397
  validation accuracy:		98.96 %
Epoch 127 of 500 took 288.398s
  training loss:		0.000272
  validation loss:		0.086409
  validation accuracy:		98.96 %
Epoch 128 of 500 took 287.932s
  training loss:		0.000271
  validation loss:		0.086420
  validation accuracy:		98.96 %
Epoch 129 of 500 took 288.111s
  training loss:		0.000271
  validation loss:		0.086433
  validation accuracy:		98.96 %
Epoch 130 of 500 took 288.333s
  training loss:		0.000270
  validation loss:		0.086445
  validation accuracy:		98.96 %
Epoch 131 of 500 took 288.360s
  training loss:		0.000269
  validation loss:		0.086456
  validation accuracy:		98.96 %
Epoch 132 of 500 took 287.854s
  training loss:		0.000269
  validation loss:		0.086468
  validation accuracy:		98.96 %
Epoch 133 of 500 took 288.271s
  training loss:		0.000268
  validation loss:		0.086479
  validation accuracy:		98.96 %
Epoch 134 of 500 took 288.583s
  training loss:		0.000268
  validation loss:		0.086494
  validation accuracy:		98.96 %
Epoch 135 of 500 took 289.036s
  training loss:		0.000267
  validation loss:		0.086504
  validation accuracy:		98.96 %
Epoch 136 of 500 took 287.969s
  training loss:		0.000266
  validation loss:		0.086515
  validation accuracy:		98.96 %
Epoch 137 of 500 took 288.340s
  training loss:		0.000266
  validation loss:		0.086527
  validation accuracy:		98.95 %
Epoch 138 of 500 took 288.571s
  training loss:		0.000265
  validation loss:		0.086540
  validation accuracy:		98.95 %
Epoch 139 of 500 took 288.801s
  training loss:		0.000265
  validation loss:		0.086554
  validation accuracy:		98.95 %
Epoch 140 of 500 took 288.259s
  training loss:		0.000264
  validation loss:		0.086565
  validation accuracy:		98.95 %
Epoch 141 of 500 took 288.531s
  training loss:		0.000264
  validation loss:		0.086577
  validation accuracy:		98.95 %
Epoch 142 of 500 took 289.307s
  training loss:		0.000263
  validation loss:		0.086591
  validation accuracy:		98.95 %
Epoch 143 of 500 took 289.069s
  training loss:		0.000263
  validation loss:		0.086603
  validation accuracy:		98.95 %
Epoch 144 of 500 took 289.144s
  training loss:		0.000262
  validation loss:		0.086615
  validation accuracy:		98.95 %
Epoch 145 of 500 took 288.686s
  training loss:		0.000262
  validation loss:		0.086628
  validation accuracy:		98.95 %
Epoch 146 of 500 took 288.911s
  training loss:		0.000261
  validation loss:		0.086639
  validation accuracy:		98.95 %
Epoch 147 of 500 took 288.361s
  training loss:		0.000260
  validation loss:		0.086653
  validation accuracy:		98.95 %
Epoch 148 of 500 took 289.204s
  training loss:		0.000260
  validation loss:		0.086665
  validation accuracy:		98.95 %
Epoch 149 of 500 took 289.983s
  training loss:		0.000259
  validation loss:		0.086678
  validation accuracy:		98.95 %
Epoch 150 of 500 took 288.225s
  training loss:		0.000259
  validation loss:		0.086690
  validation accuracy:		98.95 %
 setting learning rate to 0.0001000
Epoch 151 of 500 took 288.741s
  training loss:		0.000257
  validation loss:		0.086443
  validation accuracy:		98.96 %
Epoch 152 of 500 took 289.040s
  training loss:		0.000256
  validation loss:		0.086320
  validation accuracy:		98.96 %
Epoch 153 of 500 took 288.632s
  training loss:		0.000256
  validation loss:		0.086271
  validation accuracy:		98.96 %
Epoch 154 of 500 took 288.908s
  training loss:		0.000256
  validation loss:		0.086252
  validation accuracy:		98.96 %
Epoch 155 of 500 took 288.897s
  training loss:		0.000256
  validation loss:		0.086245
  validation accuracy:		98.96 %
Epoch 156 of 500 took 289.511s
  training loss:		0.000256
  validation loss:		0.086244
  validation accuracy:		98.96 %
Epoch 157 of 500 took 289.073s
  training loss:		0.000256
  validation loss:		0.086243
  validation accuracy:		98.96 %
Epoch 158 of 500 took 289.281s
  training loss:		0.000256
  validation loss:		0.086244
  validation accuracy:		98.96 %
Epoch 159 of 500 took 289.040s
  training loss:		0.000256
  validation loss:		0.086246
  validation accuracy:		98.95 %
Epoch 160 of 500 took 288.893s
  training loss:		0.000255
  validation loss:		0.086247
  validation accuracy:		98.95 %
Epoch 161 of 500 took 289.348s
  training loss:		0.000255
  validation loss:		0.086248
  validation accuracy:		98.95 %
Epoch 162 of 500 took 288.633s
  training loss:		0.000255
  validation loss:		0.086248
  validation accuracy:		98.95 %
Epoch 163 of 500 took 289.382s
  training loss:		0.000255
  validation loss:		0.086250
  validation accuracy:		98.95 %
Epoch 164 of 500 took 289.298s
  training loss:		0.000255
  validation loss:		0.086250
  validation accuracy:		98.95 %
Epoch 165 of 500 took 289.562s
  training loss:		0.000255
  validation loss:		0.086252
  validation accuracy:		98.95 %
Epoch 166 of 500 took 289.184s
  training loss:		0.000255
  validation loss:		0.086253
  validation accuracy:		98.95 %
Epoch 167 of 500 took 289.654s
  training loss:		0.000255
  validation loss:		0.086254
  validation accuracy:		98.95 %
Epoch 168 of 500 took 289.304s
  training loss:		0.000255
  validation loss:		0.086255
  validation accuracy:		98.95 %
Epoch 169 of 500 took 289.509s
  training loss:		0.000255
  validation loss:		0.086256
  validation accuracy:		98.95 %
Epoch 170 of 500 took 289.957s
  training loss:		0.000255
  validation loss:		0.086257
  validation accuracy:		98.95 %
Epoch 171 of 500 took 290.333s
  training loss:		0.000255
  validation loss:		0.086258
  validation accuracy:		98.95 %
Epoch 172 of 500 took 290.147s
  training loss:		0.000255
  validation loss:		0.086259
  validation accuracy:		98.95 %
Epoch 173 of 500 took 290.691s
  training loss:		0.000255
  validation loss:		0.086260
  validation accuracy:		98.95 %
Epoch 174 of 500 took 291.176s
  training loss:		0.000255
  validation loss:		0.086262
  validation accuracy:		98.95 %
Epoch 175 of 500 took 290.241s
  training loss:		0.000255
  validation loss:		0.086262
  validation accuracy:		98.95 %
Epoch 176 of 500 took 289.769s
  training loss:		0.000255
  validation loss:		0.086264
  validation accuracy:		98.95 %
Epoch 177 of 500 took 289.547s
  training loss:		0.000255
  validation loss:		0.086265
  validation accuracy:		98.95 %
Epoch 178 of 500 took 290.000s
  training loss:		0.000255
  validation loss:		0.086266
  validation accuracy:		98.95 %
Epoch 179 of 500 took 290.148s
  training loss:		0.000255
  validation loss:		0.086267
  validation accuracy:		98.95 %
Epoch 180 of 500 took 290.243s
  training loss:		0.000254
  validation loss:		0.086268
  validation accuracy:		98.95 %
Epoch 181 of 500 took 290.287s
  training loss:		0.000254
  validation loss:		0.086269
  validation accuracy:		98.95 %
Epoch 182 of 500 took 289.804s
  training loss:		0.000254
  validation loss:		0.086271
  validation accuracy:		98.95 %
Epoch 183 of 500 took 289.973s
  training loss:		0.000254
  validation loss:		0.086272
  validation accuracy:		98.95 %
Epoch 184 of 500 took 290.091s
  training loss:		0.000254
  validation loss:		0.086273
  validation accuracy:		98.95 %
Epoch 185 of 500 took 289.957s
  training loss:		0.000254
  validation loss:		0.086274
  validation accuracy:		98.95 %
Epoch 186 of 500 took 289.963s
  training loss:		0.000254
  validation loss:		0.086275
  validation accuracy:		98.95 %
Epoch 187 of 500 took 289.610s
  training loss:		0.000254
  validation loss:		0.086276
  validation accuracy:		98.95 %
Epoch 188 of 500 took 289.780s
  training loss:		0.000254
  validation loss:		0.086277
  validation accuracy:		98.95 %
Epoch 189 of 500 took 290.574s
  training loss:		0.000254
  validation loss:		0.086278
  validation accuracy:		98.95 %
Epoch 190 of 500 took 289.804s
  training loss:		0.000254
  validation loss:		0.086279
  validation accuracy:		98.95 %
Epoch 191 of 500 took 290.119s
  training loss:		0.000254
  validation loss:		0.086281
  validation accuracy:		98.95 %
Epoch 192 of 500 took 289.869s
  training loss:		0.000254
  validation loss:		0.086282
  validation accuracy:		98.95 %
Epoch 193 of 500 took 289.650s
  training loss:		0.000254
  validation loss:		0.086283
  validation accuracy:		98.95 %
Epoch 194 of 500 took 290.255s
  training loss:		0.000254
  validation loss:		0.086284
  validation accuracy:		98.95 %
Epoch 195 of 500 took 289.889s
  training loss:		0.000254
  validation loss:		0.086285
  validation accuracy:		98.95 %
Epoch 196 of 500 took 289.835s
  training loss:		0.000254
  validation loss:		0.086286
  validation accuracy:		98.95 %
Epoch 197 of 500 took 290.162s
  training loss:		0.000254
  validation loss:		0.086287
  validation accuracy:		98.95 %
Epoch 198 of 500 took 289.995s
  training loss:		0.000254
  validation loss:		0.086288
  validation accuracy:		98.95 %
Epoch 199 of 500 took 289.836s
  training loss:		0.000254
  validation loss:		0.086289
  validation accuracy:		98.95 %
Epoch 200 of 500 took 290.196s
  training loss:		0.000254
  validation loss:		0.086291
  validation accuracy:		98.95 %
Epoch 201 of 500 took 290.268s
  training loss:		0.000254
  validation loss:		0.086292
  validation accuracy:		98.95 %
Epoch 202 of 500 took 289.369s
  training loss:		0.000253
  validation loss:		0.086293
  validation accuracy:		98.95 %
Epoch 203 of 500 took 290.226s
  training loss:		0.000253
  validation loss:		0.086294
  validation accuracy:		98.95 %
Epoch 204 of 500 took 290.078s
  training loss:		0.000253
  validation loss:		0.086295
  validation accuracy:		98.95 %
Epoch 205 of 500 took 290.231s
  training loss:		0.000253
  validation loss:		0.086296
  validation accuracy:		98.95 %
Epoch 206 of 500 took 289.764s
  training loss:		0.000253
  validation loss:		0.086298
  validation accuracy:		98.95 %
Epoch 207 of 500 took 289.346s
  training loss:		0.000253
  validation loss:		0.086299
  validation accuracy:		98.95 %
Epoch 208 of 500 took 289.578s
  training loss:		0.000253
  validation loss:		0.086300
  validation accuracy:		98.95 %
Epoch 209 of 500 took 289.686s
  training loss:		0.000253
  validation loss:		0.086301
  validation accuracy:		98.95 %
Epoch 210 of 500 took 289.548s
  training loss:		0.000253
  validation loss:		0.086302
  validation accuracy:		98.95 %
Epoch 211 of 500 took 289.326s
  training loss:		0.000253
  validation loss:		0.086303
  validation accuracy:		98.95 %
Epoch 212 of 500 took 289.387s
  training loss:		0.000253
  validation loss:		0.086304
  validation accuracy:		98.95 %
Epoch 213 of 500 took 289.469s
  training loss:		0.000253
  validation loss:		0.086306
  validation accuracy:		98.95 %
Epoch 214 of 500 took 289.987s
  training loss:		0.000253
  validation loss:		0.086307
  validation accuracy:		98.95 %
Epoch 215 of 500 took 289.651s
  training loss:		0.000253
  validation loss:		0.086308
  validation accuracy:		98.95 %
Epoch 216 of 500 took 289.323s
  training loss:		0.000253
  validation loss:		0.086309
  validation accuracy:		98.95 %
Epoch 217 of 500 took 289.544s
  training loss:		0.000253
  validation loss:		0.086310
  validation accuracy:		98.95 %
Epoch 218 of 500 took 289.085s
  training loss:		0.000253
  validation loss:		0.086311
  validation accuracy:		98.95 %
Epoch 219 of 500 took 289.575s
  training loss:		0.000253
  validation loss:		0.086313
  validation accuracy:		98.95 %
Epoch 220 of 500 took 289.471s
  training loss:		0.000253
  validation loss:		0.086314
  validation accuracy:		98.95 %
Epoch 221 of 500 took 288.950s
  training loss:		0.000253
  validation loss:		0.086315
  validation accuracy:		98.95 %
Epoch 222 of 500 took 288.720s
  training loss:		0.000253
  validation loss:		0.086316
  validation accuracy:		98.95 %
Epoch 223 of 500 took 289.372s
  training loss:		0.000252
  validation loss:		0.086318
  validation accuracy:		98.95 %
Epoch 224 of 500 took 288.776s
  training loss:		0.000252
  validation loss:		0.086319
  validation accuracy:		98.95 %
Epoch 225 of 500 took 289.457s
  training loss:		0.000252
  validation loss:		0.086320
  validation accuracy:		98.95 %
Epoch 226 of 500 took 289.039s
  training loss:		0.000252
  validation loss:		0.086321
  validation accuracy:		98.95 %
Epoch 227 of 500 took 288.928s
  training loss:		0.000252
  validation loss:		0.086322
  validation accuracy:		98.95 %
Epoch 228 of 500 took 288.539s
  training loss:		0.000252
  validation loss:		0.086323
  validation accuracy:		98.95 %
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-49-d557231b7b71> in <module>()
     14     for batch in iterate_minibatches(X_train2, y_train2, 500, shuffle=False):
     15         inputs, targets = batch
---> 16         train_err += train_fn(inputs, targets)
     17         train_batches += 1
     18 

/home/d/nolearn/local/lib/python2.7/site-packages/theano/compile/function_module.pyc in __call__(self, *args, **kwargs)
    857         t0_fn = time.time()
    858         try:
--> 859             outputs = self.fn()
    860         except Exception:
    861             if hasattr(self.fn, 'position_of_error'):

KeyboardInterrupt: 

In [50]:
# After training, we compute and print the test error:
test_err = 0
test_acc = 0
test_batches = 0
for batch in iterate_minibatches(X_test, y_test, 500, shuffle=False):
    inputs, targets = batch
    err, acc = val_fn(inputs, targets)
    test_err += err
    test_acc += acc
    test_batches += 1
print("Final results:")
print("  test loss:\t\t\t{:.6f}".format(test_err / test_batches))
print("  test accuracy:\t\t{:.2f} %".format(
    test_acc / test_batches * 100))


Final results:
  test loss:			0.831464
  test accuracy:		90.46 %

In [65]:
# Finally, launch the training loop.
print("Starting training...")
# We iterate over epochs:
for epoch in range(num_epochs):
    if epoch in learning_rate_schedule:
        lr = np.float32(learning_rate_schedule[epoch])
        print(" setting learning rate to %.7f" % lr)
        learning_rate.set_value(lr)
    # In each epoch, we do a full pass over the training data:
    train_err = 0
    train_batches = 0
    start_time = time.time()
    for batch in iterate_minibatches(X_train2, y_train2, 500, shuffle=False):
        inputs, targets = batch
        train_err += train_fn(inputs, targets)
        train_batches += 1

    # And a full pass over the validation data:
    val_err = 0
    val_acc = 0
    val_batches = 0
    for batch in iterate_minibatches(X_val, y_val, 500, shuffle=False):
        inputs, targets = batch
        err, acc = val_fn(inputs, targets)
        val_err += err
        val_acc += acc
        val_batches += 1

    # Then we print the results for this epoch:
    print("Epoch {} of {} took {:.3f}s".format(
        epoch + 1, num_epochs, time.time() - start_time))
    print("  training loss:\t\t{:.6f}".format(train_err / train_batches))
    print("  validation loss:\t\t{:.6f}".format(val_err / val_batches))
    print("  validation accuracy:\t\t{:.2f} %".format(
        val_acc / val_batches * 100))


Starting training...
 setting learning rate to 0.0001000
Epoch 1 of 200 took 470.882s
  training loss:		0.469967
  validation loss:		0.358939
  validation accuracy:		85.52 %
Epoch 2 of 200 took 482.666s
  training loss:		0.311313
  validation loss:		0.299062
  validation accuracy:		88.38 %
 setting learning rate to 0.0100000
Epoch 3 of 200 took 481.257s
  training loss:		1.173967
  validation loss:		0.294466
  validation accuracy:		86.91 %
Epoch 4 of 200 took 476.688s
  training loss:		0.223470
  validation loss:		0.254502
  validation accuracy:		89.41 %
Epoch 5 of 200 took 481.711s
  training loss:		0.208328
  validation loss:		0.230796
  validation accuracy:		90.81 %
Epoch 6 of 200 took 481.467s
  training loss:		0.199105
  validation loss:		0.211668
  validation accuracy:		91.84 %
Epoch 7 of 200 took 481.601s
  training loss:		0.192134
  validation loss:		0.203365
  validation accuracy:		92.26 %
Epoch 8 of 200 took 481.462s
  training loss:		0.186225
  validation loss:		0.200710
  validation accuracy:		92.39 %
Epoch 9 of 200 took 481.613s
  training loss:		0.180898
  validation loss:		0.197895
  validation accuracy:		92.43 %
Epoch 10 of 200 took 480.563s
  training loss:		0.175844
  validation loss:		0.192544
  validation accuracy:		92.69 %
Epoch 11 of 200 took 479.999s
  training loss:		0.170885
  validation loss:		0.190165
  validation accuracy:		92.68 %
Epoch 12 of 200 took 479.896s
  training loss:		0.165902
  validation loss:		0.185151
  validation accuracy:		92.93 %
Epoch 13 of 200 took 479.353s
  training loss:		0.161054
  validation loss:		0.183555
  validation accuracy:		92.96 %
Epoch 14 of 200 took 478.997s
  training loss:		0.156245
  validation loss:		0.183042
  validation accuracy:		92.98 %
Epoch 15 of 200 took 479.438s
  training loss:		0.151298
  validation loss:		0.180539
  validation accuracy:		93.14 %
Epoch 16 of 200 took 478.290s
  training loss:		0.146110
  validation loss:		0.179271
  validation accuracy:		93.12 %
Epoch 17 of 200 took 473.067s
  training loss:		0.140677
  validation loss:		0.175448
  validation accuracy:		93.33 %
Epoch 18 of 200 took 474.051s
  training loss:		0.135166
  validation loss:		0.169781
  validation accuracy:		93.62 %
Epoch 19 of 200 took 479.337s
  training loss:		0.129518
  validation loss:		0.163130
  validation accuracy:		93.92 %
Epoch 20 of 200 took 474.061s
  training loss:		0.123747
  validation loss:		0.158072
  validation accuracy:		94.06 %
Epoch 21 of 200 took 474.005s
  training loss:		0.117733
  validation loss:		0.152016
  validation accuracy:		94.35 %
Epoch 22 of 200 took 472.428s
  training loss:		0.111381
  validation loss:		0.151203
  validation accuracy:		94.41 %
Epoch 23 of 200 took 471.523s
  training loss:		0.105136
  validation loss:		0.144045
  validation accuracy:		94.72 %
Epoch 24 of 200 took 473.634s
  training loss:		0.098774
  validation loss:		0.142352
  validation accuracy:		94.88 %
Epoch 25 of 200 took 474.666s
  training loss:		0.092555
  validation loss:		0.139601
  validation accuracy:		95.01 %
Epoch 26 of 200 took 475.457s
  training loss:		0.086278
  validation loss:		0.132363
  validation accuracy:		95.26 %
Epoch 27 of 200 took 472.943s
  training loss:		0.080092
  validation loss:		0.134367
  validation accuracy:		95.21 %
Epoch 28 of 200 took 470.925s
  training loss:		0.073954
  validation loss:		0.130861
  validation accuracy:		95.30 %
Epoch 29 of 200 took 471.571s
  training loss:		0.068291
  validation loss:		0.125399
  validation accuracy:		95.57 %
Epoch 30 of 200 took 470.100s
  training loss:		0.062280
  validation loss:		0.119888
  validation accuracy:		95.86 %
Epoch 31 of 200 took 469.430s
  training loss:		0.057161
  validation loss:		0.119014
  validation accuracy:		95.74 %
Epoch 32 of 200 took 463.650s
  training loss:		0.052001
  validation loss:		0.111229
  validation accuracy:		96.32 %
Epoch 33 of 200 took 468.104s
  training loss:		0.046916
  validation loss:		0.104690
  validation accuracy:		96.50 %
Epoch 34 of 200 took 466.045s
  training loss:		0.042138
  validation loss:		0.102622
  validation accuracy:		96.58 %
Epoch 35 of 200 took 467.376s
  training loss:		0.037936
  validation loss:		0.106572
  validation accuracy:		96.45 %
Epoch 36 of 200 took 468.242s
  training loss:		0.033836
  validation loss:		0.105033
  validation accuracy:		96.49 %
Epoch 37 of 200 took 463.128s
  training loss:		0.030328
  validation loss:		0.102595
  validation accuracy:		96.61 %
Epoch 38 of 200 took 467.011s
  training loss:		0.026724
  validation loss:		0.097706
  validation accuracy:		96.95 %
Epoch 39 of 200 took 464.165s
  training loss:		0.024014
  validation loss:		0.091947
  validation accuracy:		97.08 %
Epoch 40 of 200 took 462.945s
  training loss:		0.020890
  validation loss:		0.092923
  validation accuracy:		97.12 %
Epoch 41 of 200 took 464.860s
  training loss:		0.018433
  validation loss:		0.088140
  validation accuracy:		97.33 %
Epoch 42 of 200 took 461.848s
  training loss:		0.016581
  validation loss:		0.083593
  validation accuracy:		97.54 %
Epoch 43 of 200 took 461.054s
  training loss:		0.014476
  validation loss:		0.081696
  validation accuracy:		97.77 %
Epoch 44 of 200 took 458.289s
  training loss:		0.012780
  validation loss:		0.080388
  validation accuracy:		97.92 %
Epoch 45 of 200 took 452.453s
  training loss:		0.011065
  validation loss:		0.077044
  validation accuracy:		98.01 %
Epoch 46 of 200 took 456.479s
  training loss:		0.009711
  validation loss:		0.080158
  validation accuracy:		98.07 %
Epoch 47 of 200 took 456.711s
  training loss:		0.008738
  validation loss:		0.084959
  validation accuracy:		97.98 %
Epoch 48 of 200 took 457.218s
  training loss:		0.007678
  validation loss:		0.080651
  validation accuracy:		98.19 %
Epoch 49 of 200 took 455.677s
  training loss:		0.006589
  validation loss:		0.075482
  validation accuracy:		98.41 %
Epoch 50 of 200 took 454.161s
  training loss:		0.005566
  validation loss:		0.068332
  validation accuracy:		98.60 %
Epoch 51 of 200 took 453.764s
  training loss:		0.004571
  validation loss:		0.066132
  validation accuracy:		98.69 %
Epoch 52 of 200 took 449.711s
  training loss:		0.003740
  validation loss:		0.066036
  validation accuracy:		98.72 %
Epoch 53 of 200 took 454.130s
  training loss:		0.002995
  validation loss:		0.064127
  validation accuracy:		98.87 %
Epoch 54 of 200 took 453.757s
  training loss:		0.002406
  validation loss:		0.065001
  validation accuracy:		98.82 %
Epoch 55 of 200 took 449.373s
  training loss:		0.002019
  validation loss:		0.061982
  validation accuracy:		98.86 %
Epoch 56 of 200 took 453.159s
  training loss:		0.001711
  validation loss:		0.059337
  validation accuracy:		99.04 %
Epoch 57 of 200 took 453.193s
  training loss:		0.001486
  validation loss:		0.058226
  validation accuracy:		99.12 %
Epoch 58 of 200 took 453.144s
  training loss:		0.001318
  validation loss:		0.058024
  validation accuracy:		99.17 %
Epoch 59 of 200 took 453.589s
  training loss:		0.001187
  validation loss:		0.058371
  validation accuracy:		99.19 %
Epoch 60 of 200 took 453.743s
  training loss:		0.001083
  validation loss:		0.059028
  validation accuracy:		99.16 %
Epoch 61 of 200 took 453.090s
  training loss:		0.000995
  validation loss:		0.059877
  validation accuracy:		99.18 %
Epoch 62 of 200 took 452.814s
  training loss:		0.000921
  validation loss:		0.060679
  validation accuracy:		99.16 %
Epoch 63 of 200 took 452.933s
  training loss:		0.000859
  validation loss:		0.061381
  validation accuracy:		99.14 %
Epoch 64 of 200 took 448.693s
  training loss:		0.000804
  validation loss:		0.062220
  validation accuracy:		99.13 %
Epoch 65 of 200 took 448.494s
  training loss:		0.000757
  validation loss:		0.063036
  validation accuracy:		99.13 %
Epoch 66 of 200 took 452.810s
  training loss:		0.000715
  validation loss:		0.063841
  validation accuracy:		99.12 %
Epoch 67 of 200 took 448.481s
  training loss:		0.000678
  validation loss:		0.064554
  validation accuracy:		99.11 %
Epoch 68 of 200 took 448.375s
  training loss:		0.000644
  validation loss:		0.065249
  validation accuracy:		99.12 %
Epoch 69 of 200 took 452.767s
  training loss:		0.000614
  validation loss:		0.065866
  validation accuracy:		99.12 %
Epoch 70 of 200 took 452.712s
  training loss:		0.000587
  validation loss:		0.066505
  validation accuracy:		99.12 %
Epoch 71 of 200 took 453.547s
  training loss:		0.000563
  validation loss:		0.067044
  validation accuracy:		99.12 %
Epoch 72 of 200 took 453.544s
  training loss:		0.000540
  validation loss:		0.067551
  validation accuracy:		99.12 %
Epoch 73 of 200 took 449.495s
  training loss:		0.000519
  validation loss:		0.067959
  validation accuracy:		99.11 %
Epoch 74 of 200 took 452.704s
  training loss:		0.000499
  validation loss:		0.068419
  validation accuracy:		99.10 %
Epoch 75 of 200 took 453.015s
  training loss:		0.000481
  validation loss:		0.068760
  validation accuracy:		99.10 %
Epoch 76 of 200 took 453.102s
  training loss:		0.000464
  validation loss:		0.069116
  validation accuracy:		99.10 %
Epoch 77 of 200 took 448.380s
  training loss:		0.000449
  validation loss:		0.069384
  validation accuracy:		99.11 %
Epoch 78 of 200 took 452.773s
  training loss:		0.000434
  validation loss:		0.069629
  validation accuracy:		99.10 %
Epoch 79 of 200 took 452.933s
  training loss:		0.000420
  validation loss:		0.069859
  validation accuracy:		99.10 %
Epoch 80 of 200 took 453.075s
  training loss:		0.000407
  validation loss:		0.070053
  validation accuracy:		99.10 %
Epoch 81 of 200 took 450.184s
  training loss:		0.000395
  validation loss:		0.070198
  validation accuracy:		99.10 %
Epoch 82 of 200 took 452.732s
  training loss:		0.000383
  validation loss:		0.070346
  validation accuracy:		99.10 %
Epoch 83 of 200 took 452.075s
  training loss:		0.000372
  validation loss:		0.070420
  validation accuracy:		99.10 %
Epoch 84 of 200 took 448.519s
  training loss:		0.000362
  validation loss:		0.070513
  validation accuracy:		99.10 %
Epoch 85 of 200 took 452.684s
  training loss:		0.000352
  validation loss:		0.070547
  validation accuracy:		99.10 %
Epoch 86 of 200 took 449.268s
  training loss:		0.000343
  validation loss:		0.070676
  validation accuracy:		99.11 %
Epoch 87 of 200 took 448.791s
  training loss:		0.000334
  validation loss:		0.070726
  validation accuracy:		99.11 %
Epoch 88 of 200 took 448.350s
  training loss:		0.000326
  validation loss:		0.070785
  validation accuracy:		99.12 %
Epoch 89 of 200 took 448.096s
  training loss:		0.000318
  validation loss:		0.070841
  validation accuracy:		99.12 %
Epoch 90 of 200 took 447.995s
  training loss:		0.000310
  validation loss:		0.070887
  validation accuracy:		99.12 %
Epoch 91 of 200 took 448.423s
  training loss:		0.000303
  validation loss:		0.070953
  validation accuracy:		99.12 %
Epoch 92 of 200 took 448.096s
  training loss:		0.000296
  validation loss:		0.070981
  validation accuracy:		99.13 %
Epoch 93 of 200 took 448.200s
  training loss:		0.000290
  validation loss:		0.071006
  validation accuracy:		99.13 %
Epoch 94 of 200 took 448.063s
  training loss:		0.000283
  validation loss:		0.071040
  validation accuracy:		99.13 %
Epoch 95 of 200 took 448.213s
  training loss:		0.000277
  validation loss:		0.071081
  validation accuracy:		99.13 %
Epoch 96 of 200 took 448.007s
  training loss:		0.000271
  validation loss:		0.071105
  validation accuracy:		99.13 %
Epoch 97 of 200 took 448.070s
  training loss:		0.000266
  validation loss:		0.071153
  validation accuracy:		99.13 %
Epoch 98 of 200 took 448.187s
  training loss:		0.000260
  validation loss:		0.071209
  validation accuracy:		99.13 %
Epoch 99 of 200 took 447.945s
  training loss:		0.000255
  validation loss:		0.071242
  validation accuracy:		99.13 %
Epoch 100 of 200 took 448.028s
  training loss:		0.000250
  validation loss:		0.071282
  validation accuracy:		99.13 %
 setting learning rate to 0.0010000
Epoch 101 of 200 took 448.164s
  training loss:		0.000255
  validation loss:		0.067507
  validation accuracy:		99.18 %
Epoch 102 of 200 took 447.995s
  training loss:		0.000245
  validation loss:		0.067498
  validation accuracy:		99.18 %
Epoch 103 of 200 took 448.219s
  training loss:		0.000243
  validation loss:		0.067491
  validation accuracy:		99.18 %
Epoch 104 of 200 took 448.155s
  training loss:		0.000241
  validation loss:		0.067491
  validation accuracy:		99.18 %
Epoch 105 of 200 took 448.222s
  training loss:		0.000240
  validation loss:		0.067495
  validation accuracy:		99.18 %
Epoch 106 of 200 took 448.655s
  training loss:		0.000240
  validation loss:		0.067501
  validation accuracy:		99.18 %
Epoch 107 of 200 took 448.215s
  training loss:		0.000239
  validation loss:		0.067510
  validation accuracy:		99.18 %
Epoch 108 of 200 took 447.969s
  training loss:		0.000238
  validation loss:		0.067521
  validation accuracy:		99.18 %
Epoch 109 of 200 took 448.020s
  training loss:		0.000238
  validation loss:		0.067532
  validation accuracy:		99.18 %
Epoch 110 of 200 took 448.257s
  training loss:		0.000237
  validation loss:		0.067543
  validation accuracy:		99.18 %
Epoch 111 of 200 took 447.820s
  training loss:		0.000236
  validation loss:		0.067556
  validation accuracy:		99.18 %
Epoch 112 of 200 took 448.135s
  training loss:		0.000236
  validation loss:		0.067568
  validation accuracy:		99.18 %
Epoch 113 of 200 took 447.936s
  training loss:		0.000235
  validation loss:		0.067580
  validation accuracy:		99.18 %
Epoch 114 of 200 took 448.655s
  training loss:		0.000234
  validation loss:		0.067594
  validation accuracy:		99.18 %
Epoch 115 of 200 took 448.239s
  training loss:		0.000234
  validation loss:		0.067606
  validation accuracy:		99.18 %
Epoch 116 of 200 took 448.215s
  training loss:		0.000233
  validation loss:		0.067619
  validation accuracy:		99.18 %
Epoch 117 of 200 took 448.072s
  training loss:		0.000233
  validation loss:		0.067632
  validation accuracy:		99.18 %
Epoch 118 of 200 took 447.842s
  training loss:		0.000232
  validation loss:		0.067645
  validation accuracy:		99.18 %
Epoch 119 of 200 took 448.010s
  training loss:		0.000232
  validation loss:		0.067656
  validation accuracy:		99.18 %
Epoch 120 of 200 took 447.966s
  training loss:		0.000231
  validation loss:		0.067670
  validation accuracy:		99.18 %
Epoch 121 of 200 took 448.076s
  training loss:		0.000231
  validation loss:		0.067681
  validation accuracy:		99.18 %
Epoch 122 of 200 took 447.805s
  training loss:		0.000230
  validation loss:		0.067693
  validation accuracy:		99.18 %
Epoch 123 of 200 took 448.090s
  training loss:		0.000229
  validation loss:		0.067706
  validation accuracy:		99.18 %
Epoch 124 of 200 took 447.891s
  training loss:		0.000229
  validation loss:		0.067717
  validation accuracy:		99.18 %
Epoch 125 of 200 took 447.785s
  training loss:		0.000228
  validation loss:		0.067728
  validation accuracy:		99.18 %
Epoch 126 of 200 took 448.248s
  training loss:		0.000228
  validation loss:		0.067740
  validation accuracy:		99.18 %
Epoch 127 of 200 took 448.025s
  training loss:		0.000227
  validation loss:		0.067750
  validation accuracy:		99.18 %
Epoch 128 of 200 took 447.897s
  training loss:		0.000227
  validation loss:		0.067763
  validation accuracy:		99.18 %
Epoch 129 of 200 took 447.921s
  training loss:		0.000226
  validation loss:		0.067774
  validation accuracy:		99.18 %
Epoch 130 of 200 took 447.910s
  training loss:		0.000226
  validation loss:		0.067785
  validation accuracy:		99.18 %
Epoch 131 of 200 took 448.055s
  training loss:		0.000225
  validation loss:		0.067796
  validation accuracy:		99.18 %
Epoch 132 of 200 took 447.967s
  training loss:		0.000225
  validation loss:		0.067807
  validation accuracy:		99.18 %
Epoch 133 of 200 took 447.830s
  training loss:		0.000224
  validation loss:		0.067819
  validation accuracy:		99.18 %
Epoch 134 of 200 took 447.748s
  training loss:		0.000224
  validation loss:		0.067830
  validation accuracy:		99.18 %
Epoch 135 of 200 took 447.897s
  training loss:		0.000224
  validation loss:		0.067841
  validation accuracy:		99.18 %
Epoch 136 of 200 took 447.732s
  training loss:		0.000223
  validation loss:		0.067851
  validation accuracy:		99.18 %
Epoch 137 of 200 took 447.722s
  training loss:		0.000223
  validation loss:		0.067862
  validation accuracy:		99.18 %
Epoch 138 of 200 took 447.840s
  training loss:		0.000222
  validation loss:		0.067872
  validation accuracy:		99.18 %
Epoch 139 of 200 took 447.782s
  training loss:		0.000222
  validation loss:		0.067883
  validation accuracy:		99.18 %
Epoch 140 of 200 took 447.934s
  training loss:		0.000221
  validation loss:		0.067894
  validation accuracy:		99.18 %
Epoch 141 of 200 took 448.163s
  training loss:		0.000221
  validation loss:		0.067906
  validation accuracy:		99.18 %
Epoch 142 of 200 took 447.935s
  training loss:		0.000220
  validation loss:		0.067916
  validation accuracy:		99.18 %
Epoch 143 of 200 took 448.110s
  training loss:		0.000220
  validation loss:		0.067926
  validation accuracy:		99.18 %
Epoch 144 of 200 took 447.993s
  training loss:		0.000219
  validation loss:		0.067936
  validation accuracy:		99.18 %
Epoch 145 of 200 took 447.970s
  training loss:		0.000219
  validation loss:		0.067947
  validation accuracy:		99.18 %
Epoch 146 of 200 took 447.918s
  training loss:		0.000219
  validation loss:		0.067958
  validation accuracy:		99.18 %
Epoch 147 of 200 took 447.984s
  training loss:		0.000218
  validation loss:		0.067967
  validation accuracy:		99.18 %
Epoch 148 of 200 took 447.849s
  training loss:		0.000218
  validation loss:		0.067978
  validation accuracy:		99.18 %
Epoch 149 of 200 took 447.891s
  training loss:		0.000217
  validation loss:		0.067989
  validation accuracy:		99.18 %
Epoch 150 of 200 took 447.771s
  training loss:		0.000217
  validation loss:		0.067999
  validation accuracy:		99.18 %
 setting learning rate to 0.0001000
Epoch 151 of 200 took 448.041s
  training loss:		0.000216
  validation loss:		0.067961
  validation accuracy:		99.18 %
Epoch 152 of 200 took 448.017s
  training loss:		0.000215
  validation loss:		0.067899
  validation accuracy:		99.18 %
Epoch 153 of 200 took 447.962s
  training loss:		0.000215
  validation loss:		0.067875
  validation accuracy:		99.18 %
Epoch 154 of 200 took 447.751s
  training loss:		0.000215
  validation loss:		0.067865
  validation accuracy:		99.18 %
Epoch 155 of 200 took 448.082s
  training loss:		0.000215
  validation loss:		0.067862
  validation accuracy:		99.18 %
Epoch 156 of 200 took 447.968s
  training loss:		0.000215
  validation loss:		0.067860
  validation accuracy:		99.18 %
Epoch 157 of 200 took 447.833s
  training loss:		0.000215
  validation loss:		0.067860
  validation accuracy:		99.18 %
Epoch 158 of 200 took 447.916s
  training loss:		0.000215
  validation loss:		0.067861
  validation accuracy:		99.18 %
Epoch 159 of 200 took 448.028s
  training loss:		0.000215
  validation loss:		0.067862
  validation accuracy:		99.18 %
Epoch 160 of 200 took 447.987s
  training loss:		0.000215
  validation loss:		0.067862
  validation accuracy:		99.18 %
Epoch 161 of 200 took 447.831s
  training loss:		0.000215
  validation loss:		0.067863
  validation accuracy:		99.18 %
Epoch 162 of 200 took 447.939s
  training loss:		0.000214
  validation loss:		0.067864
  validation accuracy:		99.18 %
Epoch 163 of 200 took 447.776s
  training loss:		0.000214
  validation loss:		0.067864
  validation accuracy:		99.18 %
Epoch 164 of 200 took 447.694s
  training loss:		0.000214
  validation loss:		0.067865
  validation accuracy:		99.18 %
Epoch 165 of 200 took 447.785s
  training loss:		0.000214
  validation loss:		0.067866
  validation accuracy:		99.18 %
Epoch 166 of 200 took 447.931s
  training loss:		0.000214
  validation loss:		0.067867
  validation accuracy:		99.18 %
Epoch 167 of 200 took 447.747s
  training loss:		0.000214
  validation loss:		0.067867
  validation accuracy:		99.18 %
Epoch 168 of 200 took 447.762s
  training loss:		0.000214
  validation loss:		0.067868
  validation accuracy:		99.18 %
Epoch 169 of 200 took 447.800s
  training loss:		0.000214
  validation loss:		0.067869
  validation accuracy:		99.18 %
Epoch 170 of 200 took 447.765s
  training loss:		0.000214
  validation loss:		0.067870
  validation accuracy:		99.18 %
Epoch 171 of 200 took 447.775s
  training loss:		0.000214
  validation loss:		0.067871
  validation accuracy:		99.18 %
Epoch 172 of 200 took 447.840s
  training loss:		0.000214
  validation loss:		0.067871
  validation accuracy:		99.18 %
Epoch 173 of 200 took 447.961s
  training loss:		0.000214
  validation loss:		0.067872
  validation accuracy:		99.18 %
Epoch 174 of 200 took 447.894s
  training loss:		0.000214
  validation loss:		0.067873
  validation accuracy:		99.18 %
Epoch 175 of 200 took 447.788s
  training loss:		0.000214
  validation loss:		0.067874
  validation accuracy:		99.18 %
Epoch 176 of 200 took 447.814s
  training loss:		0.000214
  validation loss:		0.067875
  validation accuracy:		99.18 %
Epoch 177 of 200 took 447.906s
  training loss:		0.000214
  validation loss:		0.067875
  validation accuracy:		99.18 %
Epoch 178 of 200 took 447.891s
  training loss:		0.000214
  validation loss:		0.067876
  validation accuracy:		99.18 %
Epoch 179 of 200 took 447.759s
  training loss:		0.000214
  validation loss:		0.067877
  validation accuracy:		99.18 %
Epoch 180 of 200 took 447.675s
  training loss:		0.000214
  validation loss:		0.067878
  validation accuracy:		99.18 %
Epoch 181 of 200 took 447.829s
  training loss:		0.000214
  validation loss:		0.067879
  validation accuracy:		99.18 %
Epoch 182 of 200 took 447.811s
  training loss:		0.000214
  validation loss:		0.067879
  validation accuracy:		99.18 %
Epoch 183 of 200 took 447.942s
  training loss:		0.000214
  validation loss:		0.067880
  validation accuracy:		99.18 %
Epoch 184 of 200 took 448.123s
  training loss:		0.000214
  validation loss:		0.067881
  validation accuracy:		99.18 %
Epoch 185 of 200 took 448.242s
  training loss:		0.000214
  validation loss:		0.067882
  validation accuracy:		99.18 %
Epoch 186 of 200 took 448.107s
  training loss:		0.000214
  validation loss:		0.067882
  validation accuracy:		99.18 %
Epoch 187 of 200 took 450.294s
  training loss:		0.000214
  validation loss:		0.067883
  validation accuracy:		99.18 %
Epoch 188 of 200 took 448.929s
  training loss:		0.000213
  validation loss:		0.067884
  validation accuracy:		99.18 %
Epoch 189 of 200 took 453.019s
  training loss:		0.000213
  validation loss:		0.067885
  validation accuracy:		99.18 %
Epoch 190 of 200 took 453.020s
  training loss:		0.000213
  validation loss:		0.067885
  validation accuracy:		99.18 %
Epoch 191 of 200 took 453.102s
  training loss:		0.000213
  validation loss:		0.067886
  validation accuracy:		99.18 %
Epoch 192 of 200 took 453.259s
  training loss:		0.000213
  validation loss:		0.067887
  validation accuracy:		99.18 %
Epoch 193 of 200 took 453.896s
  training loss:		0.000213
  validation loss:		0.067887
  validation accuracy:		99.18 %
Epoch 194 of 200 took 453.337s
  training loss:		0.000213
  validation loss:		0.067888
  validation accuracy:		99.18 %
Epoch 195 of 200 took 456.470s
  training loss:		0.000213
  validation loss:		0.067889
  validation accuracy:		99.18 %
Epoch 196 of 200 took 458.355s
  training loss:		0.000213
  validation loss:		0.067890
  validation accuracy:		99.18 %
Epoch 197 of 200 took 454.195s
  training loss:		0.000213
  validation loss:		0.067891
  validation accuracy:		99.18 %
Epoch 198 of 200 took 458.123s
  training loss:		0.000213
  validation loss:		0.067891
  validation accuracy:		99.18 %
Epoch 199 of 200 took 453.852s
  training loss:		0.000213
  validation loss:		0.067892
  validation accuracy:		99.18 %
Epoch 200 of 200 took 458.350s
  training loss:		0.000213
  validation loss:		0.067893
  validation accuracy:		99.18 %

In [67]:
# After training, we compute and print the test error:
test_err = 0
test_acc = 0
test_batches = 0
for batch in iterate_minibatches(X_test, y_test, 500, shuffle=False):
    inputs, targets = batch
    err, acc = val_fn(inputs, targets)
    test_err += err
    test_acc += acc
    test_batches += 1
print("Final results:")
print("  test loss:\t\t\t{:.6f}".format(test_err / test_batches))
print("  test accuracy:\t\t{:.2f} %".format(
    test_acc / test_batches * 100))


Final results:
  test loss:			0.728302
  test accuracy:		91.67 %

In [80]:
# Finally, launch the training loop.
print("Starting training...")
# We iterate over epochs:
for epoch in range(num_epochs):
    if epoch in learning_rate_schedule:
        lr = np.float32(learning_rate_schedule[epoch])
        print(" setting learning rate to %.7f" % lr)
        learning_rate.set_value(lr)
    # In each epoch, we do a full pass over the training data:
    train_err = 0
    train_batches = 0
    start_time = time.time()
    for batch in iterate_minibatches(X_train2, y_train2, 128, shuffle=False):
        inputs, targets = batch
        train_err += train_fn(inputs, targets)
        train_batches += 1

    # And a full pass over the validation data:
    val_err = 0
    val_acc = 0
    val_batches = 0
    for batch in iterate_minibatches(X_val, y_val, 128, shuffle=False):
        inputs, targets = batch
        err, acc = val_fn(inputs, targets)
        val_err += err
        val_acc += acc
        val_batches += 1

    # Then we print the results for this epoch:
    print("Epoch {} of {} took {:.3f}s".format(
        epoch + 1, num_epochs, time.time() - start_time))
    print("  training loss:\t\t{:.6f}".format(train_err / train_batches))
    print("  validation loss:\t\t{:.6f}".format(val_err / val_batches))
    print("  validation accuracy:\t\t{:.2f} %".format(
        val_acc / val_batches * 100))


Starting training...
 setting learning rate to 0.0001000
Epoch 1 of 200 took 520.895s
  training loss:		0.317072
  validation loss:		0.254573
  validation accuracy:		90.61 %
Epoch 2 of 200 took 521.402s
  training loss:		0.225555
  validation loss:		0.222932
  validation accuracy:		91.76 %
 setting learning rate to 0.0100000
Epoch 3 of 200 took 518.592s
  training loss:		0.575495
  validation loss:		0.214508
  validation accuracy:		91.87 %
Epoch 4 of 200 took 518.519s
  training loss:		0.209358
  validation loss:		0.202045
  validation accuracy:		92.51 %
Epoch 5 of 200 took 518.630s
  training loss:		0.196816
  validation loss:		0.194025
  validation accuracy:		92.88 %
Epoch 6 of 200 took 518.534s
  training loss:		0.187074
  validation loss:		0.186987
  validation accuracy:		93.22 %
Epoch 7 of 200 took 518.552s
  training loss:		0.178218
  validation loss:		0.180372
  validation accuracy:		93.37 %
Epoch 8 of 200 took 518.561s
  training loss:		0.169869
  validation loss:		0.174328
  validation accuracy:		93.68 %
Epoch 9 of 200 took 518.510s
  training loss:		0.161694
  validation loss:		0.169427
  validation accuracy:		93.89 %
Epoch 10 of 200 took 518.569s
  training loss:		0.153662
  validation loss:		0.164586
  validation accuracy:		94.12 %
Epoch 11 of 200 took 518.548s
  training loss:		0.145438
  validation loss:		0.160083
  validation accuracy:		94.36 %
Epoch 12 of 200 took 518.511s
  training loss:		0.137135
  validation loss:		0.156126
  validation accuracy:		94.49 %
Epoch 13 of 200 took 518.572s
  training loss:		0.128795
  validation loss:		0.152451
  validation accuracy:		94.60 %
Epoch 14 of 200 took 518.577s
  training loss:		0.120065
  validation loss:		0.147664
  validation accuracy:		94.78 %
Epoch 15 of 200 took 518.541s
  training loss:		0.111027
  validation loss:		0.142362
  validation accuracy:		94.97 %
Epoch 16 of 200 took 518.511s
  training loss:		0.102170
  validation loss:		0.140912
  validation accuracy:		95.16 %
Epoch 17 of 200 took 518.523s
  training loss:		0.093407
  validation loss:		0.135118
  validation accuracy:		95.49 %
Epoch 18 of 200 took 518.567s
  training loss:		0.084493
  validation loss:		0.136140
  validation accuracy:		95.55 %
Epoch 19 of 200 took 518.555s
  training loss:		0.075657
  validation loss:		0.131702
  validation accuracy:		95.74 %
Epoch 20 of 200 took 518.491s
  training loss:		0.067624
  validation loss:		0.130959
  validation accuracy:		95.85 %
Epoch 21 of 200 took 518.471s
  training loss:		0.059544
  validation loss:		0.123196
  validation accuracy:		96.21 %
Epoch 22 of 200 took 518.517s
  training loss:		0.051988
  validation loss:		0.127672
  validation accuracy:		96.24 %
Epoch 23 of 200 took 518.481s
  training loss:		0.045835
  validation loss:		0.120618
  validation accuracy:		96.38 %
Epoch 24 of 200 took 518.559s
  training loss:		0.039916
  validation loss:		0.121272
  validation accuracy:		96.49 %
Epoch 25 of 200 took 518.543s
  training loss:		0.034880
  validation loss:		0.126857
  validation accuracy:		96.40 %
Epoch 26 of 200 took 518.493s
  training loss:		0.031243
  validation loss:		0.118250
  validation accuracy:		96.76 %
Epoch 27 of 200 took 518.433s
  training loss:		0.026594
  validation loss:		0.126496
  validation accuracy:		96.67 %
Epoch 28 of 200 took 518.534s
  training loss:		0.022666
  validation loss:		0.119378
  validation accuracy:		96.95 %
Epoch 29 of 200 took 518.449s
  training loss:		0.020202
  validation loss:		0.105542
  validation accuracy:		97.38 %
Epoch 30 of 200 took 518.486s
  training loss:		0.017515
  validation loss:		0.102463
  validation accuracy:		97.56 %
Epoch 31 of 200 took 518.494s
  training loss:		0.015175
  validation loss:		0.105400
  validation accuracy:		97.66 %
Epoch 32 of 200 took 518.548s
  training loss:		0.013565
  validation loss:		0.100701
  validation accuracy:		97.63 %
Epoch 33 of 200 took 518.504s
  training loss:		0.011527
  validation loss:		0.088880
  validation accuracy:		98.13 %
Epoch 34 of 200 took 518.541s
  training loss:		0.009516
  validation loss:		0.083056
  validation accuracy:		98.25 %
Epoch 35 of 200 took 518.499s
  training loss:		0.008707
  validation loss:		0.079188
  validation accuracy:		98.39 %
Epoch 36 of 200 took 518.540s
  training loss:		0.006080
  validation loss:		0.082402
  validation accuracy:		98.56 %
Epoch 37 of 200 took 518.557s
  training loss:		0.005334
  validation loss:		0.076367
  validation accuracy:		98.49 %
Epoch 38 of 200 took 518.475s
  training loss:		0.004400
  validation loss:		0.076664
  validation accuracy:		98.70 %
Epoch 39 of 200 took 518.515s
  training loss:		0.002556
  validation loss:		0.078912
  validation accuracy:		98.83 %
Epoch 40 of 200 took 518.562s
  training loss:		0.001349
  validation loss:		0.075041
  validation accuracy:		98.98 %
Epoch 41 of 200 took 518.468s
  training loss:		0.000932
  validation loss:		0.074579
  validation accuracy:		99.04 %
Epoch 42 of 200 took 518.553s
  training loss:		0.000572
  validation loss:		0.076382
  validation accuracy:		99.03 %
Epoch 43 of 200 took 518.555s
  training loss:		0.000542
  validation loss:		0.076466
  validation accuracy:		99.04 %
Epoch 44 of 200 took 518.511s
  training loss:		0.000445
  validation loss:		0.077455
  validation accuracy:		99.00 %
Epoch 45 of 200 took 518.488s
  training loss:		0.000427
  validation loss:		0.076310
  validation accuracy:		99.04 %
Epoch 46 of 200 took 518.510s
  training loss:		0.000322
  validation loss:		0.078473
  validation accuracy:		99.02 %
Epoch 47 of 200 took 518.559s
  training loss:		0.000280
  validation loss:		0.078704
  validation accuracy:		99.02 %
Epoch 48 of 200 took 518.594s
  training loss:		0.000275
  validation loss:		0.079658
  validation accuracy:		99.03 %
Epoch 49 of 200 took 518.589s
  training loss:		0.000272
  validation loss:		0.080147
  validation accuracy:		99.02 %
Epoch 50 of 200 took 518.513s
  training loss:		0.000237
  validation loss:		0.079687
  validation accuracy:		99.02 %
Epoch 51 of 200 took 518.558s
  training loss:		0.000224
  validation loss:		0.080518
  validation accuracy:		99.04 %
Epoch 52 of 200 took 518.501s
  training loss:		0.000204
  validation loss:		0.080893
  validation accuracy:		99.04 %
Epoch 53 of 200 took 518.598s
  training loss:		0.000194
  validation loss:		0.081220
  validation accuracy:		99.03 %
Epoch 54 of 200 took 518.595s
  training loss:		0.000182
  validation loss:		0.082189
  validation accuracy:		99.03 %
Epoch 55 of 200 took 518.687s
  training loss:		0.000174
  validation loss:		0.082701
  validation accuracy:		99.04 %
Epoch 56 of 200 took 518.612s
  training loss:		0.000168
  validation loss:		0.083316
  validation accuracy:		99.03 %
Epoch 57 of 200 took 518.590s
  training loss:		0.000160
  validation loss:		0.082631
  validation accuracy:		99.04 %
Epoch 58 of 200 took 518.699s
  training loss:		0.000155
  validation loss:		0.082949
  validation accuracy:		99.04 %
Epoch 59 of 200 took 518.613s
  training loss:		0.000147
  validation loss:		0.084121
  validation accuracy:		99.03 %
Epoch 60 of 200 took 518.560s
  training loss:		0.000143
  validation loss:		0.084106
  validation accuracy:		99.03 %
Epoch 61 of 200 took 518.630s
  training loss:		0.000140
  validation loss:		0.084109
  validation accuracy:		99.03 %
Epoch 62 of 200 took 518.638s
  training loss:		0.000133
  validation loss:		0.084849
  validation accuracy:		99.03 %
Epoch 63 of 200 took 518.666s
  training loss:		0.000132
  validation loss:		0.084728
  validation accuracy:		99.03 %
Epoch 64 of 200 took 518.645s
  training loss:		0.000126
  validation loss:		0.085354
  validation accuracy:		99.03 %
Epoch 65 of 200 took 518.637s
  training loss:		0.000121
  validation loss:		0.085525
  validation accuracy:		99.04 %
Epoch 66 of 200 took 518.628s
  training loss:		0.000118
  validation loss:		0.085811
  validation accuracy:		99.04 %
Epoch 67 of 200 took 518.510s
  training loss:		0.000116
  validation loss:		0.085493
  validation accuracy:		99.02 %
Epoch 68 of 200 took 518.603s
  training loss:		0.000112
  validation loss:		0.086174
  validation accuracy:		99.03 %
Epoch 69 of 200 took 518.564s
  training loss:		0.000109
  validation loss:		0.086267
  validation accuracy:		99.03 %
Epoch 70 of 200 took 518.486s
  training loss:		0.000106
  validation loss:		0.086326
  validation accuracy:		99.03 %
Epoch 71 of 200 took 518.585s
  training loss:		0.000104
  validation loss:		0.085958
  validation accuracy:		99.05 %
Epoch 72 of 200 took 518.665s
  training loss:		0.000102
  validation loss:		0.087503
  validation accuracy:		99.02 %
Epoch 73 of 200 took 518.688s
  training loss:		0.000099
  validation loss:		0.086480
  validation accuracy:		99.05 %
Epoch 74 of 200 took 518.567s
  training loss:		0.000096
  validation loss:		0.087493
  validation accuracy:		99.03 %
Epoch 75 of 200 took 518.639s
  training loss:		0.000093
  validation loss:		0.088101
  validation accuracy:		99.03 %
Epoch 76 of 200 took 518.631s
  training loss:		0.000092
  validation loss:		0.087986
  validation accuracy:		99.03 %
Epoch 77 of 200 took 518.664s
  training loss:		0.000090
  validation loss:		0.087958
  validation accuracy:		99.04 %
Epoch 78 of 200 took 518.648s
  training loss:		0.000089
  validation loss:		0.087689
  validation accuracy:		99.04 %
Epoch 79 of 200 took 518.641s
  training loss:		0.000087
  validation loss:		0.087991
  validation accuracy:		99.03 %
Epoch 80 of 200 took 518.614s
  training loss:		0.000085
  validation loss:		0.088197
  validation accuracy:		99.04 %
Epoch 81 of 200 took 518.635s
  training loss:		0.000084
  validation loss:		0.088901
  validation accuracy:		99.03 %
Epoch 82 of 200 took 518.526s
  training loss:		0.000081
  validation loss:		0.088944
  validation accuracy:		99.04 %
Epoch 83 of 200 took 518.565s
  training loss:		0.000080
  validation loss:		0.089500
  validation accuracy:		99.04 %
Epoch 84 of 200 took 518.624s
  training loss:		0.000079
  validation loss:		0.089642
  validation accuracy:		99.03 %
Epoch 85 of 200 took 518.603s
  training loss:		0.000076
  validation loss:		0.089621
  validation accuracy:		99.02 %
Epoch 86 of 200 took 518.563s
  training loss:		0.000075
  validation loss:		0.089303
  validation accuracy:		99.05 %
Epoch 87 of 200 took 518.669s
  training loss:		0.000075
  validation loss:		0.089364
  validation accuracy:		99.05 %
Epoch 88 of 200 took 518.625s
  training loss:		0.000073
  validation loss:		0.089726
  validation accuracy:		99.03 %
Epoch 89 of 200 took 518.678s
  training loss:		0.000071
  validation loss:		0.090202
  validation accuracy:		99.04 %
Epoch 90 of 200 took 518.640s
  training loss:		0.000070
  validation loss:		0.090502
  validation accuracy:		99.03 %
Epoch 91 of 200 took 518.663s
  training loss:		0.000070
  validation loss:		0.090185
  validation accuracy:		99.03 %
Epoch 92 of 200 took 518.729s
  training loss:		0.000069
  validation loss:		0.090351
  validation accuracy:		99.02 %
Epoch 93 of 200 took 518.680s
  training loss:		0.000067
  validation loss:		0.090103
  validation accuracy:		99.04 %
Epoch 94 of 200 took 518.591s
  training loss:		0.000065
  validation loss:		0.090656
  validation accuracy:		99.04 %
Epoch 95 of 200 took 518.625s
  training loss:		0.000065
  validation loss:		0.090612
  validation accuracy:		99.03 %
Epoch 96 of 200 took 518.610s
  training loss:		0.000064
  validation loss:		0.091399
  validation accuracy:		99.03 %
Epoch 97 of 200 took 518.673s
  training loss:		0.000063
  validation loss:		0.091596
  validation accuracy:		99.03 %
Epoch 98 of 200 took 518.575s
  training loss:		0.000061
  validation loss:		0.091644
  validation accuracy:		99.03 %
Epoch 99 of 200 took 518.734s
  training loss:		0.000061
  validation loss:		0.091931
  validation accuracy:		99.02 %
Epoch 100 of 200 took 518.632s
  training loss:		0.000060
  validation loss:		0.091425
  validation accuracy:		99.03 %
 setting learning rate to 0.0010000
Epoch 101 of 200 took 518.654s
  training loss:		0.000059
  validation loss:		0.091799
  validation accuracy:		99.03 %
Epoch 102 of 200 took 518.617s
  training loss:		0.000059
  validation loss:		0.091314
  validation accuracy:		99.04 %
Epoch 103 of 200 took 518.612s
  training loss:		0.000059
  validation loss:		0.092240
  validation accuracy:		99.02 %
Epoch 104 of 200 took 518.616s
  training loss:		0.000058
  validation loss:		0.091728
  validation accuracy:		99.03 %
Epoch 105 of 200 took 518.684s
  training loss:		0.000058
  validation loss:		0.091858
  validation accuracy:		99.02 %
Epoch 106 of 200 took 518.601s
  training loss:		0.000058
  validation loss:		0.091655
  validation accuracy:		99.04 %
Epoch 107 of 200 took 518.664s
  training loss:		0.000058
  validation loss:		0.091630
  validation accuracy:		99.03 %
Epoch 108 of 200 took 518.624s
  training loss:		0.000058
  validation loss:		0.091361
  validation accuracy:		99.04 %
Epoch 109 of 200 took 520.673s
  training loss:		0.000058
  validation loss:		0.092065
  validation accuracy:		99.03 %
Epoch 110 of 200 took 521.561s
  training loss:		0.000058
  validation loss:		0.092168
  validation accuracy:		99.02 %
Epoch 111 of 200 took 519.679s
  training loss:		0.000058
  validation loss:		0.092052
  validation accuracy:		99.02 %
Epoch 112 of 200 took 518.628s
  training loss:		0.000058
  validation loss:		0.091276
  validation accuracy:		99.03 %
Epoch 113 of 200 took 518.701s
  training loss:		0.000058
  validation loss:		0.092112
  validation accuracy:		99.03 %
Epoch 114 of 200 took 518.630s
  training loss:		0.000058
  validation loss:		0.092057
  validation accuracy:		99.02 %
Epoch 115 of 200 took 518.609s
  training loss:		0.000057
  validation loss:		0.091769
  validation accuracy:		99.03 %
Epoch 116 of 200 took 518.675s
  training loss:		0.000057
  validation loss:		0.091724
  validation accuracy:		99.03 %
Epoch 117 of 200 took 518.662s
  training loss:		0.000058
  validation loss:		0.092056
  validation accuracy:		99.02 %
Epoch 118 of 200 took 518.841s
  training loss:		0.000057
  validation loss:		0.091962
  validation accuracy:		99.02 %
Epoch 119 of 200 took 519.226s
  training loss:		0.000058
  validation loss:		0.091550
  validation accuracy:		99.03 %
Epoch 120 of 200 took 519.148s
  training loss:		0.000057
  validation loss:		0.091727
  validation accuracy:		99.03 %
Epoch 121 of 200 took 518.649s
  training loss:		0.000057
  validation loss:		0.091499
  validation accuracy:		99.04 %
Epoch 122 of 200 took 518.648s
  training loss:		0.000057
  validation loss:		0.091426
  validation accuracy:		99.03 %
Epoch 123 of 200 took 518.691s
  training loss:		0.000057
  validation loss:		0.091598
  validation accuracy:		99.03 %
Epoch 124 of 200 took 518.780s
  training loss:		0.000057
  validation loss:		0.092511
  validation accuracy:		99.01 %
Epoch 125 of 200 took 518.742s
  training loss:		0.000056
  validation loss:		0.091404
  validation accuracy:		99.03 %
Epoch 126 of 200 took 518.692s
  training loss:		0.000056
  validation loss:		0.092471
  validation accuracy:		99.03 %
Epoch 127 of 200 took 518.738s
  training loss:		0.000057
  validation loss:		0.092281
  validation accuracy:		99.03 %
Epoch 128 of 200 took 518.686s
  training loss:		0.000057
  validation loss:		0.092041
  validation accuracy:		99.03 %
Epoch 129 of 200 took 518.683s
  training loss:		0.000057
  validation loss:		0.091264
  validation accuracy:		99.04 %
Epoch 130 of 200 took 518.729s
  training loss:		0.000056
  validation loss:		0.091803
  validation accuracy:		99.03 %
Epoch 131 of 200 took 518.648s
  training loss:		0.000056
  validation loss:		0.091846
  validation accuracy:		99.03 %
Epoch 132 of 200 took 518.723s
  training loss:		0.000057
  validation loss:		0.092398
  validation accuracy:		99.03 %
Epoch 133 of 200 took 518.651s
  training loss:		0.000056
  validation loss:		0.092041
  validation accuracy:		99.03 %
Epoch 134 of 200 took 518.607s
  training loss:		0.000056
  validation loss:		0.092550
  validation accuracy:		99.02 %
Epoch 135 of 200 took 518.727s
  training loss:		0.000056
  validation loss:		0.092301
  validation accuracy:		99.02 %
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-80-46c5a900cd85> in <module>()
     14     for batch in iterate_minibatches(X_train2, y_train2, 128, shuffle=False):
     15         inputs, targets = batch
---> 16         train_err += train_fn(inputs, targets)
     17         train_batches += 1
     18 

/home/d/nolearn/local/lib/python2.7/site-packages/theano/compile/function_module.pyc in __call__(self, *args, **kwargs)
    857         t0_fn = time.time()
    858         try:
--> 859             outputs = self.fn()
    860         except Exception:
    861             if hasattr(self.fn, 'position_of_error'):

KeyboardInterrupt: 

In [81]:
# After training, we compute and print the test error:
test_err = 0
test_acc = 0
test_batches = 0
for batch in iterate_minibatches(X_test, y_test, 128, shuffle=False):
    inputs, targets = batch
    err, acc = val_fn(inputs, targets)
    test_err += err
    test_acc += acc
    test_batches += 1
print("Final results:")
print("  test loss:\t\t\t{:.6f}".format(test_err / test_batches))
print("  test accuracy:\t\t{:.2f} %".format(
    test_acc / test_batches * 100))


Final results:
  test loss:			0.836620
  test accuracy:		91.32 %

In [82]:
np.savez('/home/d/resnet.npz', *lasagne.layers.get_all_param_values(network))

In [84]:
network.input_layer


Out[84]:
<lasagne.layers.special.NonlinearityLayer at 0x7f674cf3b410>

In [8]:
with np.load('/home/d/resnet.npz') as f:
    param_values = [f['arr_%d' % i] for i in range(len(f.files))]
lasagne.layers.set_all_param_values(network, param_values)

In [9]:
from sklearn.metrics import classification_report, accuracy_score, roc_curve, auc, precision_recall_fscore_support, f1_score, precision_recall_curve, average_precision_score, zero_one_loss

In [10]:
test_prediction = lasagne.layers.get_output(network, deterministic=True)
test_loss = lasagne.objectives.categorical_crossentropy(test_prediction,
                                                        target_var)
test_loss = test_loss.mean()
# As a bonus, also create an expression for the classification accuracy:
test_acc = T.mean(T.eq(T.argmax(test_prediction, axis=1), target_var),
                  dtype=theano.config.floatX)

pred_fn = theano.function([input_var, target_var], [test_prediction, test_loss, test_acc])
pred2_fn = theano.function([input_var], [test_prediction])

In [11]:
all_preds = []
for i,p in enumerate(X_test):
    pred = pred2_fn(p.reshape(1,4,75,75))
    all_preds.append(pred[0][:,1][0].astype(np.uint8))
    if i % 1000 == 0:
        print(i)


0
1000
2000
3000
4000
5000
6000
7000
8000
9000
10000
11000
12000
13000
14000
15000
16000
17000

In [12]:
print(classification_report(y_test, all_preds))


             precision    recall  f1-score   support

          0       0.79      0.79      0.79      8780
          1       0.79      0.79      0.79      8780

avg / total       0.79      0.79      0.79     17560


In [ ]: