Diff of /test_a6_dsb.py [000000] .. [70b6b3]

Switch to unified view

a b/test_a6_dsb.py
1
import cPickle as pickle
2
import string
3
import sys
4
import time
5
from itertools import izip
6
import lasagne as nn
7
import numpy as np
8
import theano
9
from datetime import datetime, timedelta
10
import utils
11
import logger
12
import theano.tensor as T
13
import buffering
14
from configuration import config, set_configuration
15
import pathfinder
16
import utils_plots
17
18
theano.config.warn_float64 = 'raise'
19
20
if len(sys.argv) < 2:
21
    sys.exit("Usage: train.py <configuration_name>")
22
23
config_name = sys.argv[1]
24
set_configuration('configs_class_dsb', config_name)
25
expid = utils.generate_expid(config_name)
26
print
27
print "Experiment ID: %s" % expid
28
print
29
30
predictions_dir = utils.get_dir_path('analysis', pathfinder.METADATA_PATH)
31
outputs_path = predictions_dir + '/%s' % config_name
32
utils.auto_make_dir(outputs_path)
33
34
# metadata
35
metadata_dir = utils.get_dir_path('models', pathfinder.METADATA_PATH)
36
metadata_path = metadata_dir + '/%s.pkl' % expid
37
38
# logs
39
logs_dir = utils.get_dir_path('logs', pathfinder.METADATA_PATH)
40
sys.stdout = logger.Logger(logs_dir + '/%s.log' % expid)
41
sys.stderr = sys.stdout
42
43
print 'Build model'
44
model = config().build_model()
45
all_layers = nn.layers.get_all_layers(model.l_out)
46
all_params = nn.layers.get_all_params(model.l_out)
47
num_params = nn.layers.count_params(model.l_out)
48
print '  number of parameters: %d' % num_params
49
print string.ljust('  layer output shapes:', 36),
50
print string.ljust('#params:', 10),
51
print 'output shape:'
52
for layer in all_layers:
53
    name = string.ljust(layer.__class__.__name__, 32)
54
    num_param = sum([np.prod(p.get_value().shape) for p in layer.get_params()])
55
    num_param = string.ljust(num_param.__str__(), 10)
56
    print '    %s %s %s' % (name, num_param, layer.output_shape)
57
58
train_loss = config().build_objective(model, deterministic=False)
59
valid_loss = config().build_objective(model, deterministic=True)
60
61
learning_rate_schedule = config().learning_rate_schedule
62
learning_rate = theano.shared(np.float32(learning_rate_schedule[0]))
63
updates = config().build_updates(train_loss, model, learning_rate)
64
65
x_shared = nn.utils.shared_empty(dim=len(model.l_in.shape))
66
y_shared = nn.utils.shared_empty(dim=len(model.l_target.shape))
67
68
givens_train = {}
69
givens_train[model.l_in.input_var] = x_shared
70
givens_train[model.l_target.input_var] = y_shared
71
72
givens_valid = {}
73
givens_valid[model.l_in.input_var] = x_shared
74
givens_valid[model.l_target.input_var] = y_shared
75
76
# theano functions
77
iter_train = theano.function([], train_loss, givens=givens_train, updates=updates)
78
iter_validate = theano.function([], nn.layers.get_output(model.l_out, deterministic=True), givens=givens_valid,
79
                                on_unused_input='ignore')
80
81
if config().restart_from_save:
82
    print 'Load model parameters for resuming'
83
    resume_metadata = utils.load_pkl(config().restart_from_save)
84
    nn.layers.set_all_param_values(model.l_out, resume_metadata['param_values'])
85
    start_chunk_idx = resume_metadata['chunks_since_start'] + 1
86
    chunk_idxs = range(start_chunk_idx, config().max_nchunks)
87
88
    lr = np.float32(utils.current_learning_rate(learning_rate_schedule, start_chunk_idx))
89
    print '  setting learning rate to %.7f' % lr
90
    learning_rate.set_value(lr)
91
    losses_eval_train = resume_metadata['losses_eval_train']
92
    losses_eval_valid = resume_metadata['losses_eval_valid']
93
else:
94
    chunk_idxs = range(config().max_nchunks)
95
    losses_eval_train = []
96
    losses_eval_valid = []
97
    start_chunk_idx = 0
98
99
train_data_iterator = config().train_data_iterator
100
valid_data_iterator = config().valid_data_iterator
101
102
print
103
print 'Data'
104
print 'n train: %d' % train_data_iterator.nsamples
105
print 'n validation: %d' % valid_data_iterator.nsamples
106
print 'n chunks per epoch', config().nchunks_per_epoch
107
108
print
109
print 'Train model'
110
chunk_idx = 0
111
start_time = time.time()
112
prev_time = start_time
113
tmp_losses_train = []
114
losses_train_print = []
115
116
for chunk_idx, (x_chunk_train, y_chunk_train, id_train) in izip(chunk_idxs, buffering.buffered_gen_threaded(
117
        valid_data_iterator.generate())):
118
    if chunk_idx in learning_rate_schedule:
119
        lr = np.float32(learning_rate_schedule[chunk_idx])
120
        print '  setting learning rate to %.7f' % lr
121
        print
122
        learning_rate.set_value(lr)
123
124
    # load chunk to GPU
125
    x_shared.set_value(x_chunk_train)
126
    y_shared.set_value(y_chunk_train)
127
128
    predictions = iter_validate()
129
    print predictions.shape
130
131
    if predictions.shape != x_chunk_train.shape:
132
        pad_width = (np.asarray(x_chunk_train.shape) - np.asarray(predictions.shape)) / 2
133
        pad_width = [(p, p) for p in pad_width]
134
        predictions = np.pad(predictions, pad_width=pad_width, mode='constant')
135
136
    for i in xrange(x_chunk_train.shape[0]):
137
        pid = id_train[i]
138
        for j in xrange(x_chunk_train.shape[1]):
139
            utils_plots.plot_slice_3d_3(input=x_chunk_train[i, j, 0],
140
                                        mask=predictions[i, j, 0],
141
                                        prediction=predictions[i, j, 0],
142
                                        pid='-'.join([str(pid), str(j)]),
143
                                        img_dir=outputs_path,
144
                                        idx=np.array(x_chunk_train[i, j, 0].shape) / 2,
145
                                        axis=0)