--- a
+++ b/test_fpred_patch.py
@@ -0,0 +1,108 @@
+import string
+import sys
+import lasagne as nn
+import numpy as np
+import theano
+import buffering
+import pathfinder
+import utils
+from configuration import config, set_configuration
+from utils_plots import plot_slice_3d_3
+import utils_lung
+import logger
+
+theano.config.warn_float64 = 'raise'
+
+if len(sys.argv) < 2:
+    sys.exit("Usage: train.py <configuration_name>")
+
+config_name = sys.argv[1]
+set_configuration('configs_fpred_patch', config_name)
+
+# metadata
+metadata_dir = utils.get_dir_path('models', pathfinder.METADATA_PATH)
+metadata_path = utils.find_model_metadata(metadata_dir, config_name)
+
+metadata = utils.load_pkl(metadata_path)
+expid = metadata['experiment_id']
+
+# logs
+logs_dir = utils.get_dir_path('logs', pathfinder.METADATA_PATH)
+sys.stdout = logger.Logger(logs_dir + '/%s-test.log' % expid)
+sys.stderr = sys.stdout
+
+# predictions path
+predictions_dir = utils.get_dir_path('model-predictions', pathfinder.METADATA_PATH)
+outputs_path = predictions_dir + '/' + expid
+utils.auto_make_dir(outputs_path)
+
+print 'Build model'
+model = config().build_model()
+all_layers = nn.layers.get_all_layers(model.l_out)
+all_params = nn.layers.get_all_params(model.l_out)
+num_params = nn.layers.count_params(model.l_out)
+print '  number of parameters: %d' % num_params
+print string.ljust('  layer output shapes:', 36),
+print string.ljust('#params:', 10),
+print 'output shape:'
+for layer in all_layers:
+    name = string.ljust(layer.__class__.__name__, 32)
+    num_param = sum([np.prod(p.get_value().shape) for p in layer.get_params()])
+    num_param = string.ljust(num_param.__str__(), 10)
+    print '    %s %s %s' % (name, num_param, layer.output_shape)
+
+nn.layers.set_all_param_values(model.l_out, metadata['param_values'])
+
+valid_loss = config().build_objective(model, deterministic=True)
+
+x_shared = nn.utils.shared_empty(dim=len(model.l_in.shape))
+y_shared = nn.utils.shared_empty(dim=len(model.l_target.shape))
+
+givens_valid = {}
+givens_valid[model.l_in.input_var] = x_shared
+givens_valid[model.l_target.input_var] = y_shared
+
+# theano functions
+iter_get_predictions = theano.function([], [valid_loss, nn.layers.get_output(model.l_out, deterministic=True)],
+                                       givens=givens_valid)
+valid_data_iterator = config().valid_data_iterator
+
+print
+print 'Data'
+print 'n validation: %d' % valid_data_iterator.nsamples
+threshold = 0.2
+n_tp, n_tn, n_fp, n_fn = 0, 0, 0, 0
+n_pos = 0
+n_neg = 0
+
+validation_losses = []
+for n, (x_chunk, y_chunk, id_chunk) in enumerate(buffering.buffered_gen_threaded(valid_data_iterator.generate())):
+    # load chunk to GPU
+    x_shared.set_value(x_chunk)
+    y_shared.set_value(y_chunk)
+    loss, predictions = iter_get_predictions()
+    validation_losses.append(loss)
+    targets = y_chunk[0, 0]
+    p1 = predictions[0][1]
+    if targets == 1 and p1 >= threshold:
+        n_tp += 1
+    if targets == 1 and p1 < threshold:
+        n_fn += 1
+    if targets == 0 and p1 >= threshold:
+        n_fp += 1
+    if targets == 0 and p1 < threshold:
+        n_tn += 1
+    if targets == 1:
+        n_pos += 1
+    else:
+        n_neg += 1
+
+    print id_chunk, targets, p1, loss
+
+print 'Validation loss', np.mean(validation_losses)
+print 'TP', n_tp
+print 'TN', n_tn
+print 'FP', n_fp
+print 'FN', n_fn
+print 'n neg', n_neg
+print 'n pos', n_pos