Evolving Convnets to Classify notMNIST Glyphs

This notebook attempts to evolve graphs that optimially learn to classify notMNIST images.


In [1]:
%matplotlib inline
from __future__ import print_function

import datetime
import gzip
import os
import sys
import copy
import random
import ipywidgets

import numpy as np
import tensorflow as tf

from six.moves import cPickle as pickle

import outputer
import convnet
import mutate
import convevo
import darwin

In [ ]:
# For easy incorporation of module changes
from imp import reload

reload (convnet)
reload (mutate)
reload (convevo)
reload (darwin)

Load Data

Note: Requires notMNIST_setup notebook to be run first.


In [2]:
def setup_data(pickle_file):
    data = {
        "image_size": 28,
        "label_count": 10,
        "channel_count": 1
    }
    data["total_image_size"] = data["image_size"] * data["image_size"]
    
    with gzip.open(pickle_file, 'rb') as f:
        save = pickle.load(f)
        inputs_train = save['train_dataset']
        labels_train = save['train_labels']
        inputs_test = save['test_dataset']
        labels_test = save['test_labels']
        print('Training set', inputs_train.shape, labels_train.shape)
        print('Test set', inputs_test.shape, labels_test.shape)

    def setup_data(inputs, labels, name):
        shape = (-1, data["image_size"], data["image_size"], data["channel_count"])
        inputs = inputs.reshape(shape).astype(np.float32)
        # Map 2 to [0.0, 1.0, 0.0 ...], 3 to [0.0, 0.0, 1.0 ...]
        labels = (np.arange(data["label_count"]) == labels[:,None]).astype(np.float32)
        print(name + " set", inputs.shape, labels.shape)
        return inputs, labels
    data["train"], data["train_labels"] = setup_data(inputs_train, labels_train, "Training")
    data["test"], data["test_labels"] = setup_data(inputs_test, labels_test, "Test")
    return data

full_data = setup_data('notMNIST/full.pickle')
print(full_data.keys())


Training set (529114, 28, 28) (529114,)
Test set (18724, 28, 28) (18724,)
Training set (529114, 28, 28, 1) (529114, 10)
Test set (18724, 28, 28, 1) (18724, 10)
['total_image_size', 'train_labels', 'test_labels', 'channel_count', 'label_count', 'train', 'image_size', 'test']

Create training/validation split from the full data.


In [3]:
def setup_validate(data, train_count, validate_count, entropy=random):
    def randomize(inputs, labels):
        permutation = np.arange(labels.shape[0], dtype=np.int32)
        mutate.fisher_yates_shuffle(permutation, entropy)
        shuffled_inputs = inputs[permutation,:,:,:]
        shuffled_labels = labels[permutation,:]
        return shuffled_inputs, shuffled_labels

    train_inputs = data["train"][:]
    train_labels = data["train_labels"][:]
    cross_data = copy.copy(data)

    train_inputs, train_labels = randomize(train_inputs, train_labels)
    cross_data["train"] = train_inputs[:train_count]
    cross_data["train_labels"] = train_labels[:train_count]

    cross_data["valid"] = train_inputs[train_count:train_count + validate_count]
    cross_data["valid_labels"] = train_labels[train_count:train_count + validate_count]
    return cross_data

In [4]:
def test_setup_validate():
    cross_data = setup_validate(full_data, 1000, 100)
    print(cross_data["train_labels"].shape)
    print(cross_data["train_labels"][0])
    print(full_data["train_labels"][0])
    print(cross_data["valid"].shape)

test_setup_validate()


(1000, 10)
[ 0.  0.  0.  0.  0.  0.  0.  1.  0.  0.]
[ 1.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
(100, 28, 28, 1)

Graph Construction From convevo Stacks


In [5]:
def graph_input_shape(batch_size, data):
    image_size = data["image_size"]
    channel_count = data["channel_count"]
    return (batch_size, image_size, image_size, channel_count)

def graph_output_shape(batch_size, data):
    return (batch_size, data["label_count"])

def setup_graph(batch_size, data, stack):
    graph = tf.Graph()
    with graph.as_default():
        # Input data.
        input_shape = graph_input_shape(batch_size, data)
        output_shape = graph_output_shape(batch_size, data)
        train = tf.placeholder(tf.float32, shape=input_shape)
        labels= tf.placeholder(tf.float32, shape=output_shape)
        verify= tf.placeholder(tf.float32, shape=input_shape)

        operations = stack.construct(input_shape, output_shape)
        l2_loss = convnet.setup(operations)
        
        logits        = convnet.connect_model(train,  operations, True)[-1]
        verify_logits = convnet.connect_model(verify, operations, False)[-1]
        loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=labels))+l2_loss
        
        info = {
            "graph": graph,
            "batch_size": batch_size,
            "train": train,
            "labels": labels,
            "loss": loss,
            "optimizer": stack.construct_optimizer(loss),
            "predictions": tf.nn.softmax(logits),
            "verify": verify,
            "verify_predictions": tf.nn.softmax(verify_logits),
            "saver": tf.train.Saver()
        }
    return info

Graph Execution


In [6]:
def accuracy(predictions, labels):
    correct_predictions = np.argmax(predictions, 1) == np.argmax(labels, 1)
    return (100.0 * np.sum(correct_predictions) / predictions.shape[0])

In [7]:
def batch_accuracy(session, graph_info, inputs, labels, batch_size):
    total_accuracy = 0
    batch_count = len(inputs) // batch_size
    for b in range(batch_count):
        batch_data = inputs[b * batch_size: (b + 1) * batch_size]
        feed_dict = { graph_info["verify"] : batch_data }
        predictions, = session.run([graph_info["verify_predictions"]], feed_dict=feed_dict)
        total_accuracy += accuracy(predictions, labels[b*batch_size : (b + 1)*batch_size])
    return total_accuracy / float(batch_count)

In [8]:
def run_graph(
    graph_info,
    data,
    step_count,
    report_every=50,
    verbose=True,
    eval_test=False,
    accuracy_minimum=None,
    tracker=None
):
    with tf.Session(graph=graph_info["graph"]) as session:
        tf.global_variables_initializer().run()
        print("Initialized")
        
        # Optionally restore graph parameters from disk.
        convnet.restore_model(graph_info, session)
        
        batch_size = graph_info["batch_size"]
        valid_accuracy = 0
        last = step_count + 1 if step_count else 0
        try:
            for step in range(last):
                if tracker:
                    tracker.update_progress(step)

                # Pick an offset within the training data, which has been randomized.
                # Note: we could use better randomization across epochs.
                offset = (step * batch_size) % (data["train_labels"].shape[0] - batch_size)
                # Generate a minibatch.
                batch_data = data["train"][offset:(offset + batch_size), :, :, :]
                batch_labels = data["train_labels"][offset:(offset + batch_size), :]
                
                # Graph evaluation targets:
                targets = [
                    graph_info["optimizer"],
                    graph_info["loss"],
                    graph_info["predictions"]
                ]
                
                # Graph inputs:
                feed_dict = {
                    graph_info["train"] : batch_data,
                    graph_info["labels"] : batch_labels
                }                
                _, loss, predictions = session.run(targets, feed_dict=feed_dict)
                
                reporting = step % report_every == 0
                if reporting or tracker:
                    batch_score = (loss, accuracy(predictions, batch_labels))
                    if tracker:
                        tracker.record_score(batch_score)
                    
                if np.isnan(loss):
                    print("Error computing loss")
                    return valid_accuracy
                
                if reporting:
                    if verbose:
                        print("Minibatch loss at step", step, ":", loss)
                        print("Minibatch accuracy: %.1f%%" % batch_score[1])
                    valid_accuracy = batch_accuracy(
                        session, graph_info, data["valid"], data["valid_labels"],batch_size
                    )
                    print("Validation accuracy: %.1f%%" % valid_accuracy)
                    if accuracy_minimum and step > 0 and valid_accuracy < accuracy_minimum:
                        print("Early out.")
                        break
            if eval_test:
                test_accuracy = batch_accuracy(
                    session, graph_info, data["test"], data["test_labels"], batch_size
                )
                print("Test accuracy: %.1f%%" % test_accuracy)
            return valid_accuracy
        finally:
            # Optionally save out graph parameters to disk.
            convnet.save_model(graph_info, session)

Set up an evaluation function for use with Darwin


In [9]:
results_path = outputer.setup_directory("temp", "notMNIST_results")

In [10]:
def make_eval(
    batch_size=16,
    eval_steps=100000,
    valid_steps=5000,
    eval_test=False
):
    progress_tracker = outputer.ProgressTracker(
        ["Loss", "Accuracy"], eval_steps, results_path, convevo.serialize
    )
    
    def evaluate(stack, entropy):   
        data = setup_validate(full_data, eval_steps, valid_steps, entropy)
        progress_tracker.setup_eval(stack)

        # Set up the graph.
        try:
            graph_info = setup_graph(batch_size, data, stack)
        except KeyboardInterrupt:
            raise
        except:
            progress_tracker.error(sys.exc_info())
            return -10

        progress_tracker.start_eval(graph_info)
       
        # Run the graph
        try:
            return run_graph(
                graph_info,
                data,
                eval_steps,
                report_every=eval_steps/4,
                verbose=False,
                eval_test=eval_test,
                accuracy_minimum=50,
                tracker=progress_tracker
            )
        except KeyboardInterrupt:
            raise
        except:
            progress_tracker.error(sys.exc_info())
            return -1
        finally:
            progress_tracker.output()
    return evaluate

Simplify stack construction for testing


In [11]:
def create_stack(
    patch_size, stride, depth, hidden_size, label_count, init_scale, optimizer_name=None
):
    if optimizer_name:
        optimizer = convevo.Optimizer(optimizer_name, 0.05)
        optimizer.default_parameters()
    else:
        optimizer = None
        
    conv_layers = [
        ("conv_bias", patch_size, stride, depth, "SAME", True),
        ("conv_bias", patch_size, stride, depth, "SAME", True)
    ]

    return convevo.create_stack(
        conv_layers, [], True, [hidden_size, label_count], 0.0, init_scale, 0.0, optimizer
    )

Test all the pieces (not required to run)


In [12]:
# Test optimizers
def test_optimizers():
    for optimizer in ["GradientDescent","Adadelta","Adagrad","Momentum","Adam","RMSProp"]:
        # As of this writing "Ftrl" is not supported on the GPU
        batch_size = 16
        eval_steps = 10000
        test_stack = create_stack(5, 2, 64, 128, 10, 0.1, optimizer)
        test_data = setup_validate(full_data, eval_steps * batch_size, 500)
        test_graph = setup_graph(batch_size, test_data, test_stack)
        result = run_graph(test_graph, test_data,
                           eval_steps, report_every=eval_steps//4, verbose=False)
        print(result)
test_optimizers()


Initialized
Validation accuracy: 11.9%
Validation accuracy: 83.5%
Validation accuracy: 86.1%
Validation accuracy: 86.5%
Validation accuracy: 86.9%
86.8951612903
Initialized
Validation accuracy: 12.7%
Validation accuracy: 88.9%
Validation accuracy: 88.9%
Validation accuracy: 88.3%
Validation accuracy: 90.1%
90.1209677419
Initialized
Validation accuracy: 14.9%
Validation accuracy: 39.1%
Validation accuracy: 76.6%
Validation accuracy: 88.3%
Validation accuracy: 90.3%
90.3225806452
Initialized
Validation accuracy: 15.7%
Validation accuracy: 8.7%
Validation accuracy: 8.7%
Validation accuracy: 8.7%
Validation accuracy: 8.7%
8.66935483871
Initialized
Validation accuracy: 8.9%
Validation accuracy: 10.1%
Validation accuracy: 10.1%
Validation accuracy: 10.1%
Validation accuracy: 10.1%
10.0806451613
Initialized
Validation accuracy: 12.9%
Validation accuracy: 11.1%
Validation accuracy: 11.1%
Validation accuracy: 11.1%
Validation accuracy: 11.1%
11.0887096774

In [13]:
# Test make_eval
with outputer.TeeOutput(os.path.join(results_path, outputer.timestamp("Eval", "txt"))):
    test_stack = create_stack(5, 2, 64, 128, 10, 0.1)
    print(convevo.serialize(test_stack))
    make_eval()(test_stack, random.Random(42))


<evostack flatten="True">
  <optimizer name="GradientDescent" learning_rate="0.05" alpha="0.999" beta="1000"/>
  <layers type="image">
    <layer dropout_rate="0" relu="True">
      <image operation="conv_bias" patch_size="5" stride="2" padding="SAME" output_channels="64" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.1"/>
      </image>
    </layer>
    <layer dropout_rate="0" relu="True">
      <image operation="conv_bias" patch_size="5" stride="2" padding="SAME" output_channels="64" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.1"/>
      </image>
    </layer>
  </layers>
  <layers type="hidden">
    <layer dropout_rate="0" relu="True">
      <hidden output_size="128" bias="True" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.1"/>
      </hidden>
    </layer>
    <layer dropout_rate="0" relu="True">
      <hidden output_size="10" bias="True" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.1"/>
      </hidden>
    </layer>
  </layers>
</evostack>

Initialized
Validation accuracy: 13.5%
Validation accuracy: 89.2%
Validation accuracy: 89.6%
Validation accuracy: 89.8%
Validation accuracy: 89.8%
Saved model to temp/notMNIST_results/2016-07-07~15_51_37_050.ckpt
Saved results: 2016-07-07~15_51_37_050

In [14]:
# Test darwin setup
mutate_entropy = random.Random(42)
scored_mutants = []
breed_options = {
    "input_shape": graph_input_shape(16, full_data),
    "output_shape": graph_output_shape(16, full_data)
}
mutator = darwin.Darwin(convevo.serialize, lambda s,e: 0, convevo.breed)
prototypes = [create_stack(5, 2, 64, 64, 10, 0.1)]
for mutant in mutator.init_population(prototypes, 20, False, breed_options,mutate_entropy):
    scored_mutants.append((mutant, 0.0))
    
convevo.output_results(scored_mutants, "temp", "mutants.xml", 0, 0)

In [15]:
# Test mutation
mutate_entropy = random.Random(42)
mutant_children = []
for _ in range(20):
    mutant_a = mutate_entropy.choice(scored_mutants)[0]
    mutant_b = mutate_entropy.choice(scored_mutants)[0]
    mutant_children.append(
        (convevo.breed([mutant_a, mutant_b], breed_options, mutate_entropy), 0.0)
    )
    
convevo.output_results(mutant_children, "temp", "mutant_offspring.xml", 42, 0)

Evolve notMNIST


In [16]:
# Prototypes to seed the population
prototypes = [
    create_stack(5, 2, 64, 128, 10, 0.10, "GradientDescent"),
    create_stack(6, 2, 128, 64, 10, 0.05, "Adadelta"),
    create_stack(4, 2, 64, 128, 10, 0.10, "Adagrad"),
    create_stack(5, 1, 32,  64, 10, 0.02, "Adam"),
    create_stack(2, 2, 64, 128, 10, 0.20, "RMSProp")
]

In [17]:
prototypes.append(convevo.load_stack("testing/notMNIST_optimized.xml"))

In [ ]:
# Evolve!
BATCH_SIZE = 128
with outputer.TeeOutput(os.path.join("temp", outputer.timestamp("notMNIST_evo_", "txt"))):
    # Setup seeds and entropy
    mutate_seed = random.randint(1, 100000)
    print("Mutate Seed:", mutate_seed)
    mutate_entropy = random.Random(mutate_seed)
    eval_seed = random.randint(1, 100000)
    print("Eval Seed:", eval_seed)
    eval_entropy = random.Random(eval_seed)

    # Number of stacks to test each generation
    population_size = 20
    # Number of generations to evaluate
    generations = 10
    
    breed_options = {
        "input_shape": graph_input_shape(BATCH_SIZE, full_data),
        "output_shape": graph_output_shape(BATCH_SIZE, full_data)
    }

    # Ensure the prototypes have the correct structure (eg, output layer size)
    for stack in prototypes:
        stack.make_safe(breed_options["input_shape"], breed_options["output_shape"])

    # Construct an evolver
    charles = darwin.Darwin(
        convevo.serialize,
        make_eval(batch_size=BATCH_SIZE, eval_steps=100000),
        convevo.breed
    )
    # Initialize the population (True to include the protototypes as population members)
    charles.init_population(prototypes,population_size,True,breed_options,mutate_entropy)

    # Evaluate, output, select and breed/mutate
    for g in range(generations):
        print("Generation", g)
        results = charles.evaluate(eval_entropy)
        convevo.output_results(results, "temp", outputer.timestamp() + ".xml")
        charles.repopulate(population_size, 0.25, 4, results, breed_options,mutate_entropy)


Mutate Seed: 14197
Eval Seed: 97815
Generation 0
Evaluating 0
Initialized
Validation accuracy: 16.6%
Validation accuracy: 89.0%
Validation accuracy: 89.3%
Validation accuracy: 89.2%
Validation accuracy: 89.5%
Saved model to temp/notMNIST_results/2016-07-07~16_08_56_456.ckpt
Saved results: 2016-07-07~16_08_56_456
Score: 89.5032051282
Evaluating 1
Initialized
Validation accuracy: 9.3%
Validation accuracy: 90.4%
Validation accuracy: 90.3%
Validation accuracy: 90.3%
Validation accuracy: 89.9%
Saved model to temp/notMNIST_results/2016-07-07~16_26_06_122.ckpt
Saved results: 2016-07-07~16_26_06_122
Score: 89.8637820513
Evaluating 2
Initialized
Validation accuracy: 14.0%
Validation accuracy: 89.3%
Validation accuracy: 89.4%
Validation accuracy: 89.4%
Validation accuracy: 89.3%
Saved model to temp/notMNIST_results/2016-07-07~17_07_28_742.ckpt
Saved results: 2016-07-07~17_07_28_742
Score: 89.2628205128
Evaluating 3
Initialized
Validation accuracy: 10.4%
Validation accuracy: 9.4%
Early out.
Saved model to temp/notMNIST_results/2016-07-07~17_20_55_792.ckpt
Saved results: 2016-07-07~17_20_55_792
Score: 9.43509615385
Evaluating 4
Initialized
Validation accuracy: 11.0%
Validation accuracy: 9.4%
Early out.
Saved model to temp/notMNIST_results/2016-07-07~17_26_20_350.ckpt
Saved results: 2016-07-07~17_26_20_350
Score: 9.39503205128
Evaluating 5
Initialized
Validation accuracy: 14.6%
Validation accuracy: 89.8%
Validation accuracy: 89.8%
Validation accuracy: 90.1%
Validation accuracy: 90.1%
Saved model to temp/notMNIST_results/2016-07-07~17_28_33_806.ckpt
Saved results: 2016-07-07~17_28_33_806
Score: 90.0641025641
Evaluating 6
Initialized
Validation accuracy: 10.4%
Validation accuracy: 10.2%
Early out.
Saved model to temp/notMNIST_results/2016-07-07~17_35_45_700.ckpt
Saved results: 2016-07-07~17_35_45_700
Score: 10.2163461538
Evaluating 7
Initialized
Validation accuracy: 11.2%
Validation accuracy: 62.8%
Validation accuracy: 63.0%
Validation accuracy: 54.5%
Validation accuracy: 54.3%
Saved model to temp/notMNIST_results/2016-07-07~17_38_26_809.ckpt
Saved results: 2016-07-07~17_38_26_809
Score: 54.3068910256
Evaluating 8
Initialized
Validation accuracy: 10.4%
Validation accuracy: 64.7%
Validation accuracy: 65.8%
Validation accuracy: 66.8%
Validation accuracy: 66.9%
Saved model to temp/notMNIST_results/2016-07-07~17_55_41_036.ckpt
Saved results: 2016-07-07~17_55_41_036
Score: 66.9270833333
Evaluating 9
Initialized
Validation accuracy: 11.0%
Validation accuracy: 79.9%
Validation accuracy: 80.3%
Validation accuracy: 88.6%
Validation accuracy: 88.9%
Saved model to temp/notMNIST_results/2016-07-07~18_01_14_472.ckpt
Saved results: 2016-07-07~18_01_14_472
Score: 88.9423076923
Evaluating 10
Initialized
Validation accuracy: 14.8%
Validation accuracy: 90.2%
Validation accuracy: 90.5%
Validation accuracy: 90.3%
Validation accuracy: 90.5%
Saved model to temp/notMNIST_results/2016-07-07~18_44_09_572.ckpt
Saved results: 2016-07-07~18_44_09_572
Score: 90.5048076923
Evaluating 11
Initialized
Validation accuracy: 9.3%
Validation accuracy: 87.9%
Validation accuracy: 87.5%
Validation accuracy: 87.2%
Validation accuracy: 86.9%
Saved model to temp/notMNIST_results/2016-07-07~18_53_01_490.ckpt
Saved results: 2016-07-07~18_53_01_490
Score: 86.9190705128
Evaluating 12
Initialized
Validation accuracy: 7.9%
Validation accuracy: 80.2%
Validation accuracy: 80.8%
Validation accuracy: 80.9%
Validation accuracy: 80.6%
Saved model to temp/notMNIST_results/2016-07-07~19_05_29_637.ckpt
Saved results: 2016-07-07~19_05_29_637
Score: 80.6490384615
Evaluating 13
Initialized
Validation accuracy: 10.5%
Validation accuracy: 10.5%
Early out.
Saved model to temp/notMNIST_results/2016-07-07~19_12_13_348.ckpt
Saved results: 2016-07-07~19_12_13_348
Score: 10.4967948718
Evaluating 14
Initialized
Validation accuracy: 12.3%
Validation accuracy: 10.1%
Early out.
Saved model to temp/notMNIST_results/2016-07-07~19_17_28_525.ckpt
Saved results: 2016-07-07~19_17_28_525
Score: 10.0560897436
Evaluating 15
Initialized
Validation accuracy: 9.9%
Validation accuracy: 75.8%
Validation accuracy: 76.2%
Validation accuracy: 74.2%
Validation accuracy: 71.7%
Saved model to temp/notMNIST_results/2016-07-07~19_20_22_461.ckpt
Saved results: 2016-07-07~19_20_22_461
Score: 71.6546474359
Evaluating 16
Initialized
Validation accuracy: 9.8%
Validation accuracy: 10.4%
Early out.
Saved model to temp/notMNIST_results/2016-07-07~19_26_30_505.ckpt
Saved results: 2016-07-07~19_26_30_505
Score: 10.4166666667
Evaluating 17
Initialized
Validation accuracy: 13.1%
Validation accuracy: 91.9%
Validation accuracy: 92.1%
Validation accuracy: 92.2%
Validation accuracy: 92.3%
Saved model to temp/notMNIST_results/2016-07-07~19_28_48_525.ckpt
Saved results: 2016-07-07~19_28_48_525
Score: 92.2876602564
Evaluating 18
Initialized
Validation accuracy: 12.8%
Validation accuracy: 89.4%
Validation accuracy: 90.0%
Validation accuracy: 90.1%
Validation accuracy: 90.0%
Saved model to temp/notMNIST_results/2016-07-07~20_11_49_401.ckpt
Saved results: 2016-07-07~20_11_49_401
Score: 90.0440705128
Evaluating 19
Initialized
Validation accuracy: 9.8%
Validation accuracy: 9.8%
Early out.
Saved model to temp/notMNIST_results/2016-07-07~20_22_17_484.ckpt
Saved results: 2016-07-07~20_22_17_484
Score: 9.79567307692
Generation 1
Evaluating 0
Initialized
Validation accuracy: 11.2%
Validation accuracy: 90.0%
Validation accuracy: 90.2%
Validation accuracy: 90.5%
Validation accuracy: 90.2%
Saved model to temp/notMNIST_results/2016-07-07~20_25_09_186.ckpt
Saved results: 2016-07-07~20_25_09_186
Score: 90.2243589744
Evaluating 1
Initialized
Validation accuracy: 5.3%
Validation accuracy: 89.6%
Validation accuracy: 90.1%
Validation accuracy: 90.5%
Validation accuracy: 90.3%
Saved model to temp/notMNIST_results/2016-07-07~21_30_01_660.ckpt
Saved results: 2016-07-07~21_30_01_660
Score: 90.3044871795
Evaluating 2
Initialized
Validation accuracy: 21.9%
Validation accuracy: 90.8%
Validation accuracy: 90.8%
Validation accuracy: 90.9%
Validation accuracy: 90.7%
Saved model to temp/notMNIST_results/2016-07-07~21_41_47_251.ckpt
Saved results: 2016-07-07~21_41_47_251
Score: 90.6850961538
Evaluating 3
Initialized
Validation accuracy: 11.5%
Validation accuracy: 89.9%
Validation accuracy: 90.2%
Validation accuracy: 90.4%
Validation accuracy: 90.5%
Saved model to temp/notMNIST_results/2016-07-07~22_09_53_367.ckpt
Saved results: 2016-07-07~22_09_53_367
Score: 90.5048076923
Evaluating 4
Initialized
Validation accuracy: 10.6%
Validation accuracy: 91.3%
Validation accuracy: 92.0%
Validation accuracy: 92.3%
Validation accuracy: 92.3%
Saved model to temp/notMNIST_results/2016-07-07~22_22_07_147.ckpt
Saved results: 2016-07-07~22_22_07_147
Score: 92.2676282051
Evaluating 5
Initialized
Validation accuracy: 14.2%
Validation accuracy: 71.3%
Validation accuracy: 69.7%
Validation accuracy: 68.0%
Validation accuracy: 67.1%
Saved model to temp/notMNIST_results/2016-07-07~23_06_40_594.ckpt
Saved results: 2016-07-07~23_06_40_594
Score: 67.1274038462
Evaluating 6
Initialized
Validation accuracy: 20.9%
Validation accuracy: 10.1%
Early out.
Saved model to temp/notMNIST_results/2016-07-07~23_40_13_200.ckpt
Saved results: 2016-07-07~23_40_13_200
Score: 10.1161858974
Evaluating 7
Initialized
Validation accuracy: 9.7%
Validation accuracy: 91.6%
Validation accuracy: 91.9%
Validation accuracy: 92.2%
Validation accuracy: 92.1%
Saved model to temp/notMNIST_results/2016-07-07~23_42_59_331.ckpt
Saved results: 2016-07-07~23_42_59_331
Score: 92.1274038462
Evaluating 8
Initialized
Validation accuracy: 14.6%
Validation accuracy: 9.9%
Early out.
Saved model to temp/notMNIST_results/2016-07-08~00_25_54_638.ckpt
Saved results: 2016-07-08~00_25_54_638
Score: 9.89583333333
Evaluating 9
Initialized
Validation accuracy: 10.0%
Validation accuracy: 9.9%
Early out.
Saved model to temp/notMNIST_results/2016-07-08~00_34_52_920.ckpt
Saved results: 2016-07-08~00_34_52_920
Score: 9.89583333333
Evaluating 10
Initialized
Validation accuracy: 10.2%
Validation accuracy: 10.4%
Early out.
Saved model to temp/notMNIST_results/2016-07-08~00_56_14_591.ckpt
Saved results: 2016-07-08~00_56_14_591
Score: 10.4366987179
Evaluating 11
Initialized
Validation accuracy: 10.3%
Validation accuracy: 90.1%
Validation accuracy: 90.3%
Validation accuracy: 90.3%
Validation accuracy: 90.3%
Saved model to temp/notMNIST_results/2016-07-08~01_03_16_997.ckpt
Saved results: 2016-07-08~01_03_16_997
Score: 90.2644230769
Evaluating 12
Initialized
Validation accuracy: 13.3%
Validation accuracy: 90.5%
Validation accuracy: 90.7%
Validation accuracy: 90.8%
Validation accuracy: 90.8%
Saved model to temp/notMNIST_results/2016-07-08~01_17_28_817.ckpt
Saved results: 2016-07-08~01_17_28_817
Score: 90.765224359
Evaluating 13
Initialized
Validation accuracy: 9.9%
Validation accuracy: 10.0%
Early out.
Saved model to temp/notMNIST_results/2016-07-08~01_28_21_800.ckpt
Saved results: 2016-07-08~01_28_21_800
Score: 9.97596153846
Evaluating 14
Initialized
Validation accuracy: 25.2%
Validation accuracy: 83.8%
Validation accuracy: 83.8%
Validation accuracy: 84.0%
Validation accuracy: 83.8%
Saved model to temp/notMNIST_results/2016-07-08~01_39_19_182.ckpt
Saved results: 2016-07-08~01_39_19_182
Score: 83.8141025641
Evaluating 15
Initialized
Validation accuracy: 25.8%
Validation accuracy: 86.7%
Validation accuracy: 86.9%
Validation accuracy: 87.0%
Validation accuracy: 87.1%
Saved model to temp/notMNIST_results/2016-07-08~01_48_21_905.ckpt
Saved results: 2016-07-08~01_48_21_905
Score: 87.0993589744
Evaluating 16
Initialized
Validation accuracy: 11.7%
Validation accuracy: 90.4%
Validation accuracy: 90.7%
Validation accuracy: 90.8%
Validation accuracy: 90.8%
Saved model to temp/notMNIST_results/2016-07-08~01_59_59_284.ckpt
Saved results: 2016-07-08~01_59_59_284
Score: 90.8253205128
Evaluating 17
Initialized
Validation accuracy: 23.6%
Validation accuracy: 90.1%
Validation accuracy: 90.5%
Validation accuracy: 90.6%
Validation accuracy: 90.7%
Saved model to temp/notMNIST_results/2016-07-08~02_41_35_875.ckpt
Saved results: 2016-07-08~02_41_35_875
Score: 90.6650641026
Evaluating 18
Initialized
Validation accuracy: 12.6%
Validation accuracy: 82.2%
Validation accuracy: 81.2%
Validation accuracy: 82.1%
Validation accuracy: 81.9%
Saved model to temp/notMNIST_results/2016-07-08~02_52_46_962.ckpt
Saved results: 2016-07-08~02_52_46_962
Score: 81.9310897436
Evaluating 19
Initialized
Validation accuracy: 20.6%
Validation accuracy: 89.9%
Validation accuracy: 90.6%
Validation accuracy: 90.4%
Validation accuracy: 90.3%
Saved model to temp/notMNIST_results/2016-07-08~03_09_44_083.ckpt
Saved results: 2016-07-08~03_09_44_083
Score: 90.3245192308
Generation 2
Evaluating 0
Initialized
Validation accuracy: 10.5%
Validation accuracy: 91.8%
Validation accuracy: 91.9%
Validation accuracy: 91.9%
Validation accuracy: 92.2%
Saved model to temp/notMNIST_results/2016-07-08~03_17_08_911.ckpt
Saved results: 2016-07-08~03_17_08_911
Score: 92.1875
Evaluating 1
Initialized
Validation accuracy: 9.2%
Validation accuracy: 89.2%
Validation accuracy: 90.1%
Validation accuracy: 90.3%
Validation accuracy: 90.4%
Saved model to temp/notMNIST_results/2016-07-08~03_53_32_230.ckpt
Saved results: 2016-07-08~03_53_32_230
Score: 90.4246794872
Evaluating 2
Initialized
Validation accuracy: 9.9%
Validation accuracy: 9.8%
Early out.
Saved model to temp/notMNIST_results/2016-07-08~04_21_21_764.ckpt
Saved results: 2016-07-08~04_21_21_764
Score: 9.83573717949
Evaluating 3
Initialized
Validation accuracy: 9.9%
Validation accuracy: 10.0%
Early out.
Saved model to temp/notMNIST_results/2016-07-08~04_27_53_125.ckpt
Saved results: 2016-07-08~04_27_53_125
Score: 9.99599358974
Evaluating 4
Initialized
Validation accuracy: 15.9%
Validation accuracy: 9.5%
Early out.
Saved model to temp/notMNIST_results/2016-07-08~04_36_07_260.ckpt
Saved results: 2016-07-08~04_36_07_260
Score: 9.47516025641
Evaluating 5
Initialized
Validation accuracy: 12.0%
Validation accuracy: 91.6%
Validation accuracy: 92.1%
Validation accuracy: 92.0%
Validation accuracy: 92.1%
Saved model to temp/notMNIST_results/2016-07-08~04_46_26_355.ckpt
Saved results: 2016-07-08~04_46_26_355
Score: 92.1073717949
Evaluating 6
Initialized
Validation accuracy: 10.5%
Validation accuracy: 78.0%
Validation accuracy: 78.5%
Validation accuracy: 78.7%
Validation accuracy: 78.7%
Saved model to temp/notMNIST_results/2016-07-08~05_23_30_542.ckpt
Saved results: 2016-07-08~05_23_30_542
Score: 78.6858974359
Evaluating 7
Initialized
Validation accuracy: 10.2%
Validation accuracy: 91.2%
Validation accuracy: 91.7%
Validation accuracy: 91.9%
Validation accuracy: 91.8%
Saved model to temp/notMNIST_results/2016-07-08~05_29_15_398.ckpt
Saved results: 2016-07-08~05_29_15_398
Score: 91.7668269231
Evaluating 8
Initialized
Validation accuracy: 30.2%
Validation accuracy: 87.2%
Validation accuracy: 88.6%
Validation accuracy: 89.5%
Validation accuracy: 89.6%
Saved model to temp/notMNIST_results/2016-07-08~06_39_51_051.ckpt
Saved results: 2016-07-08~06_39_51_051
Score: 89.5833333333
Evaluating 9
Initialized
Validation accuracy: 13.5%
Validation accuracy: 90.0%
Validation accuracy: 90.9%
Validation accuracy: 91.3%
Validation accuracy: 91.2%
Saved model to temp/notMNIST_results/2016-07-08~07_09_30_856.ckpt
Saved results: 2016-07-08~07_09_30_856
Score: 91.1658653846
Evaluating 10
Initialized
Validation accuracy: 10.1%
Validation accuracy: 9.9%
Early out.
Saved model to temp/notMNIST_results/2016-07-08~07_22_38_418.ckpt
Saved results: 2016-07-08~07_22_38_418
Score: 9.87580128205
Evaluating 11
Initialized
Validation accuracy: 16.6%
Validation accuracy: 90.7%
Validation accuracy: 88.0%
Validation accuracy: 89.6%
Validation accuracy: 88.8%
Saved model to temp/notMNIST_results/2016-07-08~07_30_11_231.ckpt
Saved results: 2016-07-08~07_30_11_231
Score: 88.8020833333
Evaluating 12
Initialized
Validation accuracy: 9.4%
Validation accuracy: 75.2%
Validation accuracy: 75.4%
Validation accuracy: 75.7%
Validation accuracy: 75.5%
Saved model to temp/notMNIST_results/2016-07-08~08_04_11_403.ckpt
Saved results: 2016-07-08~08_04_11_403
Score: 75.5208333333
Evaluating 13
Initialized
Validation accuracy: 9.6%
Validation accuracy: 91.0%
Validation accuracy: 91.5%
Validation accuracy: 91.9%
Validation accuracy: 91.8%
Saved model to temp/notMNIST_results/2016-07-08~08_10_44_646.ckpt
Saved results: 2016-07-08~08_10_44_646
Score: 91.8068910256
Evaluating 14
Initialized
Validation accuracy: 10.0%
Validation accuracy: 91.4%
Validation accuracy: 92.5%
Validation accuracy: 92.9%
Validation accuracy: 93.1%
Saved model to temp/notMNIST_results/2016-07-08~10_51_38_290.ckpt
Saved results: 2016-07-08~10_51_38_290
Score: 93.0689102564
Evaluating 15
Initialized
Validation accuracy: 8.9%
Validation accuracy: 89.2%
Validation accuracy: 90.2%
Validation accuracy: 89.7%
Validation accuracy: 90.4%
Saved model to temp/notMNIST_results/2016-07-08~11_59_26_152.ckpt
Saved results: 2016-07-08~11_59_26_152
Score: 90.3846153846
Evaluating 16
Initialized
Validation accuracy: 10.0%
Validation accuracy: 84.3%
Validation accuracy: 88.9%
Validation accuracy: 89.4%
Validation accuracy: 89.2%
Saved model to temp/notMNIST_results/2016-07-08~12_06_02_493.ckpt
Saved results: 2016-07-08~12_06_02_493
Score: 89.2427884615
Evaluating 17
Initialized
Validation accuracy: 13.2%
Validation accuracy: 82.4%
Validation accuracy: 82.9%
Validation accuracy: 83.3%
Validation accuracy: 83.5%
Saved model to temp/notMNIST_results/2016-07-08~12_44_36_984.ckpt
Saved results: 2016-07-08~12_44_36_984
Score: 83.4935897436
Evaluating 18
Initialized
Validation accuracy: 9.5%
Error computing loss
Saved model to temp/notMNIST_results/2016-07-08~12_56_12_424.ckpt
Saved results: 2016-07-08~12_56_12_424
Score: 9.49519230769
Evaluating 19
Initialized
Validation accuracy: 9.8%
Validation accuracy: 10.5%
Early out.
Saved model to temp/notMNIST_results/2016-07-08~12_56_14_149.ckpt
Saved results: 2016-07-08~12_56_14_149
Score: 10.5168269231
Generation 3
Evaluating 0
Initialized
Validation accuracy: 10.0%
Validation accuracy: 91.8%
Validation accuracy: 91.8%
Validation accuracy: 92.1%
Validation accuracy: 92.1%
Saved model to temp/notMNIST_results/2016-07-08~13_07_27_824.ckpt
Saved results: 2016-07-08~13_07_27_824
Score: 92.1474358974
Evaluating 1
Initialized
Validation accuracy: 9.8%
Validation accuracy: 10.1%
Early out.
Saved model to temp/notMNIST_results/2016-07-08~13_52_33_035.ckpt
Saved results: 2016-07-08~13_52_33_035
Score: 10.0560897436
Evaluating 2
Initialized
Validation accuracy: 9.8%
Validation accuracy: 91.8%
Validation accuracy: 91.6%
Validation accuracy: 91.6%
Validation accuracy: 91.4%
Saved model to temp/notMNIST_results/2016-07-08~14_19_13_049.ckpt
Saved results: 2016-07-08~14_19_13_049
Score: 91.4463141026
Evaluating 3
Initialized
Validation accuracy: 11.3%
Validation accuracy: 91.6%
Validation accuracy: 92.0%
Validation accuracy: 92.1%
Validation accuracy: 91.7%
Saved model to temp/notMNIST_results/2016-07-08~17_21_50_393.ckpt
Saved results: 2016-07-08~17_21_50_393
Score: 91.7467948718
Evaluating 4
Initialized
Validation accuracy: 10.6%
Validation accuracy: 90.8%
Validation accuracy: 91.4%
Validation accuracy: 91.4%
Validation accuracy: 91.5%
Saved model to temp/notMNIST_results/2016-07-08~19_00_32_837.ckpt
Saved results: 2016-07-08~19_00_32_837
Score: 91.4663461538
Evaluating 5
Initialized
Validation accuracy: 10.6%
Validation accuracy: 82.4%
Validation accuracy: 83.2%
Validation accuracy: 83.5%
Validation accuracy: 83.6%
Saved model to temp/notMNIST_results/2016-07-08~19_30_59_207.ckpt
Saved results: 2016-07-08~19_30_59_207
Score: 83.6137820513
Evaluating 6
Initialized
Validation accuracy: 9.6%
Validation accuracy: 10.0%
Early out.
Saved model to temp/notMNIST_results/2016-07-08~19_44_37_438.ckpt
Saved results: 2016-07-08~19_44_37_438
Score: 10.016025641
Evaluating 7
Initialized
Validation accuracy: 9.5%
Validation accuracy: 10.0%
Early out.
Saved model to temp/notMNIST_results/2016-07-08~20_29_44_750.ckpt
Saved results: 2016-07-08~20_29_44_750
Score: 9.97596153846
Evaluating 8
Initialized
Validation accuracy: 10.5%
Validation accuracy: 88.2%
Validation accuracy: 89.3%
Validation accuracy: 89.8%
Validation accuracy: 90.2%
Saved model to temp/notMNIST_results/2016-07-08~20_49_03_891.ckpt
Saved results: 2016-07-08~20_49_03_891
Score: 90.1842948718
Evaluating 9
Initialized
Validation accuracy: 14.2%
Validation accuracy: 92.3%
Validation accuracy: 92.4%
Validation accuracy: 92.3%
Validation accuracy: 92.1%
Saved model to temp/notMNIST_results/2016-07-08~22_04_01_848.ckpt
Saved results: 2016-07-08~22_04_01_848
Score: 92.0673076923
Evaluating 10
Initialized
Validation accuracy: 12.0%
Validation accuracy: 92.1%
Validation accuracy: 92.1%
Validation accuracy: 92.0%
Validation accuracy: 92.1%
Saved model to temp/notMNIST_results/2016-07-08~23_24_00_098.ckpt
Saved results: 2016-07-08~23_24_00_098
Score: 92.0673076923
Evaluating 11
Initialized
Validation accuracy: 13.4%
Validation accuracy: 10.4%
Early out.
Saved model to temp/notMNIST_results/2016-07-09~00_24_39_735.ckpt
Saved results: 2016-07-09~00_24_39_735
Score: 10.4166666667
Evaluating 12
Initialized
Validation accuracy: 10.2%
Validation accuracy: 10.2%
Early out.
Saved model to temp/notMNIST_results/2016-07-09~00_41_38_039.ckpt
Saved results: 2016-07-09~00_41_38_039
Score: 10.15625
Evaluating 13
Initialized
Validation accuracy: 15.7%
Validation accuracy: 90.8%
Validation accuracy: 91.1%
Validation accuracy: 90.9%
Validation accuracy: 91.2%
Saved model to temp/notMNIST_results/2016-07-09~00_57_11_193.ckpt
Saved results: 2016-07-09~00_57_11_193
Score: 91.2459935897
Evaluating 14
Initialized
Validation accuracy: 9.5%
Validation accuracy: 10.0%
Early out.
Saved model to temp/notMNIST_results/2016-07-09~02_44_08_513.ckpt
Saved results: 2016-07-09~02_44_08_513
Score: 10.016025641
Evaluating 15
Initialized
Validation accuracy: 9.7%
Validation accuracy: 89.9%
Validation accuracy: 91.0%
Validation accuracy: 91.3%

In [ ]:
# Show the best result
best = charles.best()
print("Best score:", best[1])
print(convevo.serialize(best[0]))

In [ ]:
# Store all the results in one place. (note that each generation gets stored above too)
results = darwin.descending_score(charles.history.values())
convevo.output_results(
    results, "testing", "notminist_full_evolve_run_optimized.xml", mutate_seed, eval_seed
)
len(results)

In [ ]:
# If something went wrong, this helps to summarize error reports
errors = []

for root, dirs, files in os.walk('temp'):
    for name in files:
        path = os.path.join(root, name)
        low_name = name.lower()
        if low_name.startswith("err"):
            with open (path, "r") as error_file:
                lines=error_file.readlines()
                errors.append((path, lines[-1]))

for path, error in sorted(errors, key=lambda e: e[0]):
    print(path)
    print(error)

In [ ]:
# Show and re-run a stack (for debugging)
rerun = 0
print (convevo.serialize(charles.population[rerun]))
make_eval()(charles.population[rerun], eval_entropy)

Comparision of evolved results


In [ ]:
BATCH_SIZE = 128
with outputer.TeeOutput(os.path.join("temp", outputer.timestamp("notMNIST_test_", "txt"))):
    for stack, score in results[:5]:
        stack_graph = setup_graph(BATCH_SIZE, full_data, stack)
        checkpoint_path = stack.checkpoint_path()
        if checkpoint_path:
            convnet.setup_restore_model(stack_graph, checkpoint_path)
            run_graph(stack_graph, test_data, 0, verbose=True, eval_test=True)

In [18]:
full_eval = make_eval(batch_size=128, eval_steps=100000, valid_steps=10000, eval_test=True)

results_file = os.path.join("temp", outputer.timestamp("notMNIST_compare_", "txt"))
with outputer.TeeOutput(results_file):
    seeds = [43214]
    reseed = random.Random(seeds[0])
    for _ in range(4):
        seeds.append(reseed.randint(1, 100000))
    print("Seeds:", seeds)
    
    print("Baseline optimized network:")
    # Network from https://discussions.udacity.com/t/assignment-4-problem-2/46525/26
    baseline = convevo.load_stack("testing/notMNIST_optimized.xml")
    print(convevo.serialize(baseline))
    for seed in seeds:
        full_eval(baseline, random.Random(seed))

    print("\n------------------------------------------------")
    print("Evolved from prototypes only:")
    population,_,_ = convevo.load_population(
        "testing/notMNIST_Evolve_2016-06-06~01_16_10_287.xml", False
    )
    best = population[0]
    print(convevo.serialize(best))    
    for seed in seeds:
        full_eval(best, random.Random(seed))
    
    print("\n------------------------------------------------")
    print("Evolved from prototypes plus optimized baseline:")
    population,_,_ = convevo.load_population(
        "testing/notMNIST_full_evolve_run_optimized_2016-07-07~16_08_54_561.xml", False
    )
    best = population[0]
    print(convevo.serialize(best))    
    for seed in seeds:
        full_eval(best, random.Random(seed))


Seeds: [43214, 9126, 26644, 31917, 69460]
Baseline optimized network:
<evostack flatten="True">
  <optimizer name="GradientDescent" learning_rate="0.3" alpha="0.86" beta="3500" gamma="1"/>
  <layers type="hidden">
    <layer dropout_rate="0.75" dropout_seed="58543" relu="True">
      <hidden output_size="1024" bias="True" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.0441" seed="12729"/>
      </hidden>
    </layer>
    <layer dropout_rate="0.75" dropout_seed="34881" relu="True">
      <hidden output_size="305" bias="True" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.0441" seed="75145"/>
      </hidden>
    </layer>
    <layer dropout_rate="0.75" dropout_seed="35784" relu="True">
      <hidden output_size="75" bias="True" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.0809" seed="57956"/>
      </hidden>
    </layer>
    <layer dropout_rate="0" dropout_seed="40984" relu="False">
      <hidden output_size="10" bias="True" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.1632" seed="47042"/>
      </hidden>
    </layer>
  </layers>
</evostack>


------------------------------------------------
Evolved from prototypes only:
<evostack flatten="True">
  <optimizer name="Adagrad" learning_rate="0.05"/>
  <layers type="image">
    <layer dropout_rate="0.5" dropout_seed="99846" relu="True">
      <image operation="conv_bias" patch_size="4" stride="2" padding="SAME" output_channels="128" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.1" seed="80878"/>
      </image>
    </layer>
    <layer dropout_rate="0.5" dropout_seed="95749" relu="True">
      <image operation="conv_bias" patch_size="4" stride="2" padding="SAME" output_channels="64" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.1" seed="28890"/>
      </image>
    </layer>
  </layers>
  <layers type="hidden">
    <layer dropout_rate="0" dropout_seed="39370" relu="True">
      <hidden output_size="140" bias="True" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.11" seed="97243"/>
      </hidden>
    </layer>
    <layer dropout_rate="0.75" dropout_seed="5199" relu="False">
      <hidden output_size="9" bias="True" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.11" seed="37623"/>
      </hidden>
    </layer>
    <layer dropout_rate="0" dropout_seed="24993" relu="False">
      <hidden output_size="10" bias="True" l2_factor="0.01">
        <initializer distribution="normal" mean="1" scale="0.1" seed="25292"/>
      </hidden>
    </layer>
  </layers>
</evostack>


------------------------------------------------
Evolved from prototypes plus optimized baseline:
<evostack flatten="True" checkpoint="temp/notMNIST_results/2016-07-08~10_51_38_290.ckpt">
  <optimizer name="Adadelta" learning_rate="0.0375"/>
  <layers type="image">
    <layer dropout_rate="0.75" dropout_seed="55204" relu="True">
      <image operation="conv_bias" patch_size="6" stride="2" padding="SAME" output_channels="128" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.05" seed="61187"/>
      </image>
    </layer>
    <layer dropout_rate="0.75" dropout_seed="23140" relu="True">
      <image operation="avg_pool" patch_size="6" stride="2" padding="SAME" output_channels="128" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.05" seed="75002"/>
      </image>
    </layer>
    <layer dropout_rate="0.75" dropout_seed="92392" relu="False">
      <image operation="conv_bias" patch_size="6" stride="2" padding="SAME" output_channels="256" l2_factor="0">
        <initializer distribution="constant" mean="0" scale="0.1" seed="7223"/>
      </image>
    </layer>
  </layers>
  <layers type="hidden">
    <layer dropout_rate="0.75" dropout_seed="91352" relu="True">
      <hidden output_size="305" bias="True" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.0441" seed="52383"/>
      </hidden>
    </layer>
    <layer dropout_rate="0.75" dropout_seed="68928" relu="True">
      <hidden output_size="75" bias="True" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.1618" seed="62165"/>
      </hidden>
    </layer>
    <layer dropout_rate="0" dropout_seed="18342" relu="False">
      <hidden output_size="10" bias="True" l2_factor="0">
        <initializer distribution="normal" mean="0" scale="0.1632" seed="22784"/>
      </hidden>
    </layer>
  </layers>
</evostack>

Initialized
Validation accuracy: 10.1%
Validation accuracy: 90.5%
Validation accuracy: 91.4%
Validation accuracy: 91.7%
Validation accuracy: 92.0%
Test accuracy: 96.7%
Saved model to temp/notMNIST_results/2016-07-09~09_48_48_013.ckpt
Saved results: 2016-07-09~09_48_48_013
Initialized
Validation accuracy: 10.8%
Validation accuracy: 91.0%
Validation accuracy: 91.6%
Validation accuracy: 92.0%
Validation accuracy: 92.1%
Test accuracy: 96.8%
Saved model to temp/notMNIST_results/2016-07-09~10_56_41_941.ckpt
Saved results: 2016-07-09~10_56_41_941
Initialized
Validation accuracy: 9.7%
Validation accuracy: 91.2%
Validation accuracy: 91.8%
Validation accuracy: 92.1%
Validation accuracy: 92.3%
Test accuracy: 96.8%
Saved model to temp/notMNIST_results/2016-07-09~12_05_37_934.ckpt
Saved results: 2016-07-09~12_05_37_934
Initialized
Validation accuracy: 10.0%
Validation accuracy: 90.9%
Validation accuracy: 91.8%
Validation accuracy: 92.0%
Validation accuracy: 92.2%
Test accuracy: 97.0%
Saved model to temp/notMNIST_results/2016-07-09~13_14_35_715.ckpt
Saved results: 2016-07-09~13_14_35_715
Initialized
Validation accuracy: 10.0%
Validation accuracy: 91.2%
Validation accuracy: 91.9%
Validation accuracy: 92.1%
Validation accuracy: 92.4%
Test accuracy: 96.9%
Saved model to temp/notMNIST_results/2016-07-09~14_23_19_639.ckpt
Saved results: 2016-07-09~14_23_19_639

In [ ]: