15 import tensorflow
as tf
21 """ Using class to stop training early if it's not getting better"""
32 Check if validation result is better than the best validation result.
33 Decide if training should be continued.
48 def get_model(number_of_features, number_of_spectators, number_of_events, training_fraction, parameters):
49 """Building Graph inside tensorflow"""
50 tf.reset_default_graph()
51 x = tf.placeholder(tf.float32, [
None, number_of_features])
52 y = tf.placeholder(tf.float32, [
None, 1])
54 z = tf.placeholder(tf.float32, [
None, number_of_spectators])
56 def layer(x, shape, name, unit=tf.sigmoid):
57 """Build one hidden layer in feed forward net"""
58 with tf.name_scope(name):
59 weights = tf.Variable(tf.truncated_normal(shape, stddev=1.0 / np.sqrt(float(shape[0]))), name=
'weights')
60 biases = tf.Variable(tf.constant(0.0, shape=[shape[1]]), name=
'biases')
61 layer = unit(tf.matmul(x, weights) + biases)
64 def build_relation_net_variables(shape, name):
65 """Build the variables(not the net itself), who will be shared between multiple relations"""
67 with tf.name_scope(name), tf.variable_scope(name):
68 for i
in range(len(shape) - 1):
69 weights = tf.get_variable(
'weights_{}'.format(i),
70 initializer=tf.truncated_normal(shape[i:i + 2],
71 stddev=1.0 / np.sqrt(float(shape[0]))))
72 biases = tf.get_variable(
'biases_{}'.format(i), initializer=tf.constant(0.0, shape=[shape[i + 1]]))
73 variables.append([weights, biases])
76 def relation_net(x, variables):
77 """Build one relation net between 2 object using pre-build variables"""
79 for layer
in variables:
80 if len(variables) != len(net):
81 net.append(tf.nn.tanh(tf.matmul(net[-1], layer[0]) + layer[1]))
83 return tf.nn.sigmoid(tf.matmul(net[-1], layer[0]) + layer[1])
85 if parameters[
'use_relations']:
88 [tracks.append(tf.slice(x, [0, i * 6], [-1, 6]))
for i
in range(int(number_of_features / 6))]
92 number_of_features_per_relation = 1
94 pre_training_relations = []
95 for feature_number
in range(number_of_features_per_relation):
97 relational_variables = build_relation_net_variables([12, 50, 50, 1],
98 'tracks_relational_{}'.format(feature_number))
100 for counter, track1
in enumerate(tracks):
101 for track2
in tracks[counter + 1:]:
103 relations.append(relation_net(tf.concat([track1, track2], 1), relational_variables))
105 if parameters[
'pre_training_epochs'] > 0:
107 pre_training_relations.append(relation_net(z, relational_variables))
109 new_x = tf.concat(relations, 1)
114 if parameters[
'use_feed_forward']:
115 print(
'Number of variables going into feed_forward:', int(new_x.get_shape()[1]))
116 inference_hidden1 = layer(new_x, [int(new_x.get_shape()[1]), 50],
'inference_hidden1')
117 inference_hidden2 = layer(inference_hidden1, [50, 50],
'inference_hidden2')
118 inference_activation = layer(inference_hidden2, [50, 1],
'inference_sigmoid', unit=tf.sigmoid)
120 print(
'Number of variables going into reduce_max:', int(new_x.get_shape()[1]))
121 inference_activation = layer(new_x, [int(new_x.get_shape()[1]), 1],
'inference_sigmoid', unit=tf.sigmoid)
122 print(inference_activation.get_shape())
125 inference_loss = -tf.reduce_sum(y * tf.log(inference_activation + epsilon) +
126 (1.0 - y) * tf.log(1 - inference_activation + epsilon))
128 inference_optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
129 inference_minimize = inference_optimizer.minimize(inference_loss)
131 config = tf.ConfigProto()
132 config.gpu_options.allow_growth =
True
133 session = tf.Session(config=config)
135 state =
State(x, y, inference_activation, inference_loss, inference_minimize, session)
137 if parameters[
'pre_training_epochs'] > 0:
139 new_z = tf.concat(pre_training_relations, 1)
140 pre_activation = layer(new_z, [int(new_z.get_shape()[1]), 1],
'pre_output')
141 state.pre_loss = -tf.reduce_sum(y * tf.log(pre_activation + epsilon) +
142 (1.0 - y) * tf.log(1 - pre_activation + epsilon))
143 pre_optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
144 state.pre_minimize = pre_optimizer.minimize(state.pre_loss)
146 state.pre_training_epochs = parameters[
'pre_training_epochs']
148 init = tf.global_variables_initializer()
154 def begin_fit(state, Xtest, Stest, ytest, wtest):
155 """Saves the training validation set for monitoring."""
163 def partial_fit(state, X, S, y, w, epoch):
164 """Pass received data to tensorflow session"""
165 feed_dict = {state.x: X, state.y: y, state.z: S}
169 if state.pre_training_epochs > epoch:
170 state.session.run(state.pre_minimize, feed_dict=feed_dict)
171 if epoch % 1000 == 0:
172 avg_cost = state.session.run(state.pre_loss, feed_dict={state.y: state.val_y, state.z: state.val_z})
173 print(
"Pre-Training: Epoch:",
'%04d' % (epoch),
"cost=",
"{:.9f}".format(avg_cost))
178 state.session.run(state.optimizer, feed_dict=feed_dict)
179 if epoch % 1000 == 0:
180 avg_cost = state.session.run(state.cost, feed_dict={state.y: state.val_y, state.x: state.val_x})
181 print(
"Epoch:",
'%04d' % (epoch),
"cost=",
"{:.9f}".format(avg_cost))
182 return EARLY_STOPPER.check(avg_cost)
187 if __name__ ==
"__main__":
190 from root_pandas
import to_root
195 import basf2_mva_util
206 number_total_lines = 5
208 for i
in range(number_total_lines):
209 variables += [
'px_' + str(i),
'py_' + str(i),
'pz_' + str(i),
'dx_' + str(i),
'dy_' + str(i),
213 spectators = [
'Spx1',
'Spy1',
'Spz1',
'Sdx1',
'Sdy1',
'Sdz1',
'Spx2',
'Spy2',
'Spz2',
'Sdx2',
'Sdy2',
'Sdz2']
215 number_of_events = 1000000
217 def build_signal_event():
218 """Building two lines which are hitting each other"""
219 p_vec1, p_vec2 = np.random.normal(size=3), np.random.normal(size=3)
220 v_cross = np.random.normal(size=3)
221 epsilon1, epsilon2 = np.random.rand() * 2 - 1, np.random.rand() * 2 - 1
222 v_vec1 = v_cross + (p_vec1 * epsilon1)
223 v_vec2 = v_cross + (p_vec2 * epsilon2)
224 return np.concatenate([p_vec1, v_vec1]), np.concatenate([p_vec2, v_vec2])
227 with tempfile.TemporaryDirectory()
as path:
228 for filename
in [
'train.root',
'test.root']:
229 print(
'Building ' + filename)
231 data = np.random.normal(size=[number_of_events, number_total_lines * 6 + 12])
232 target = np.zeros([number_of_events], dtype=bool)
236 for index, sample
in enumerate(data):
237 if np.random.rand() > 0.5:
239 i1, i2 = int(np.random.rand() * number_total_lines), int(np.random.rand() * (number_total_lines - 1))
240 i2 = (i1 + i2) % number_total_lines
241 track1, track2 = build_signal_event()
242 data[index, i1 * 6:(i1 + 1) * 6] = track1
243 data[index, i2 * 6:(i2 + 1) * 6] = track2
244 data[index, number_total_lines * 6:] = np.append(track1, track2)
248 for i, name
in enumerate(variables + spectators):
249 dic.update({name: data[:, i]})
250 dic.update({
'isSignal': target})
252 df = pandas.DataFrame(dic, dtype=np.float32)
253 to_root(df, os.path.join(path, filename), key=
'variables')
258 general_options = basf2_mva.GeneralOptions()
259 general_options.m_datafiles = basf2_mva.vector(os.path.join(path,
'train.root'))
260 general_options.m_treename =
"variables"
261 general_options.m_variables = basf2_mva.vector(*variables)
262 general_options.m_target_variable =
"isSignal"
263 general_options.m_spectators = basf2_mva.vector(*spectators)
265 specific_options = basf2_mva.PythonOptions()
266 specific_options.m_framework =
"tensorflow"
267 specific_options.m_steering_file =
'toy_relations.py'
268 specific_options.m_nIterations = 100
269 specific_options.m_mini_batch_size = 100
270 specific_options.m_training_fraction = 0.999
272 print(
'Train relational net with pre-training')
273 general_options.m_identifier = os.path.join(path,
'relation_2.xml')
274 specific_options.m_config = json.dumps({
'use_relations':
True,
'use_feed_forward':
False,
'pre_training_epochs': 30000})
275 basf2_mva.teacher(general_options, specific_options)
278 print(
'Train feed forward net')
279 general_options.m_identifier = os.path.join(path,
'feed_forward.xml')
280 specific_options.m_config = json.dumps({
'use_relations':
False,
'use_feed_forward':
True,
'pre_training_epochs': 0})
281 basf2_mva.teacher(general_options, specific_options)
284 print(
'Train relational net')
285 general_options.m_identifier = os.path.join(path,
'relation.xml')
286 specific_options.m_config = json.dumps({
'use_relations':
True,
'use_feed_forward':
True,
'pre_training_epochs': 0})
287 basf2_mva.teacher(general_options, specific_options)
295 test_data = basf2_mva.vector(os.path.join(path,
'test.root'))
296 print(
'Apply feed forward net')
297 p1, t1 = method1.apply_expert(test_data, general_options.m_treename)
298 print(
'Apply relational net')
299 p2, t2 = method2.apply_expert(test_data, general_options.m_treename)
300 print(
'Apply special relational net')
301 p3, t3 = method3.apply_expert(test_data, general_options.m_treename)
def calculate_roc_auc(p, t)
best_result
saves best training result
counter
counts how many times training is not getting better