|
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) |