12 import tensorflow
as tf
19 CONTINUE_ENQUEUE =
True
22 def signal_handler(signal, frame):
24 Used to safely stop training. This can only be used in main thread,
25 so depending on the training style, it can take a while before execution.
27 print(
'Stopping Training safely')
29 global CONTINUE_ENQUEUE
31 CONTINUE_ENQUEUE =
False
34 def execute_train_op(state):
36 Do the actual training multithreaded.
41 while (
not COORD.should_stop()):
42 xy_list = state.session.run(state.dequeue)
43 feed_dict = {state.x: xy_list[0], state.y: xy_list[1]}
45 state.session.run(state.optimizer, feed_dict=feed_dict)
47 if (epoch % 100 == 0):
48 train_eva = state.session.run(state.cost, feed_dict=feed_dict)
49 print(
'Step %d: Train cost = %.4f' % (epoch, train_eva))
53 except tf.errors.OutOfRangeError:
54 print(
'No more items in closed queue, end of training.')
58 def get_model(number_of_features, number_of_spectators, number_of_events, training_fraction, parameters):
60 Build tensorflow graph, handles parameter and initialise variables
63 param = {
'capacity': 1e6,
'min_after_dequeue': 800,
'batch_size': 500}
65 if isinstance(parameters, dict):
66 param.update(parameters)
68 x = tf.placeholder(
"float", [
None, number_of_features])
69 y = tf.placeholder(
"float", [
None, 1])
71 def layer(x, shape, name, unit=tf.sigmoid):
72 with tf.name_scope(name):
73 weights = tf.Variable(tf.truncated_normal(shape, stddev=1.0 / np.sqrt(float(shape[0]))), name=
'weights')
74 biases = tf.Variable(tf.constant(0.0, shape=[shape[1]]), name=
'biases')
75 layer = unit(tf.matmul(x, weights) + biases)
78 inference_hidden1 = layer(x, [number_of_features, 20],
'inference_hidden1')
79 inference_hidden2 = layer(inference_hidden1, [20, 20],
'inference_hidden2')
80 inference_hidden3 = layer(inference_hidden2, [20, 20],
'inference_hidden3')
81 inference_hidden4 = layer(inference_hidden3, [20, 20],
'inference_hidden4')
82 inference_activation = layer(inference_hidden4, [20, 1],
'inference_sigmoid', unit=tf.sigmoid)
85 inference_loss = -tf.reduce_sum(y * tf.log(inference_activation + epsilon) +
86 (1.0 - y) * tf.log(1 - inference_activation + epsilon))
88 inference_optimizer = tf.train.AdamOptimizer()
89 inference_global_step = tf.Variable(0, name=
'inference_global_step', trainable=
False)
90 inference_minimize = inference_optimizer.minimize(inference_loss, global_step=inference_global_step)
92 init = tf.global_variables_initializer()
93 config = tf.ConfigProto()
94 config.gpu_options.allow_growth =
True
95 session = tf.Session(config=config)
97 tmp_state = State(x, y, inference_activation, inference_loss, inference_minimize, session)
102 tmp_state.queue = tf.RandomShuffleQueue(int(param[
'capacity']), int(param[
'min_after_dequeue']), [tf.float32, tf.float32],
103 shapes=[[number_of_features], [1]])
104 tmp_state.enqueue = tmp_state.queue.enqueue_many([x, y])
105 tmp_state.dequeue = tmp_state.queue.dequeue_many(int(param[
'batch_size']))
109 COORD = tf.train.Coordinator()
110 tmp_state.thread = threading.Thread(target=execute_train_op, args=(tmp_state,))
115 def begin_fit(state, Xtest, Stest, ytest, wtest):
117 Starting training op async
124 def partial_fit(state, X, S, y, w, epoch):
126 Put data in the queue.
128 signal.signal(signal.SIGINT, signal_handler)
130 state.session.run(state.enqueue, feed_dict={state.x: X, state.y: np.reshape(y, ((len(y), 1)))})
132 print(
"Queue Epoch: %d, Queue Size: %d" % (epoch, state.session.run(state.queue.size())))
134 return CONTINUE_ENQUEUE
137 if __name__ ==
"__main__":
138 from basf2
import conditions
140 conditions.testing_payloads = [
141 'localdb/database.txt'
147 general_options = basf2_mva.GeneralOptions()
148 general_options.m_datafiles = basf2_mva.vector(
"train.root")
149 general_options.m_treename =
"tree"
150 variables = [
'p',
'pt',
'pz',
151 'daughter(0, p)',
'daughter(0, pz)',
'daughter(0, pt)',
152 'daughter(1, p)',
'daughter(1, pz)',
'daughter(1, pt)',
153 'daughter(2, p)',
'daughter(2, pz)',
'daughter(2, pt)',
154 'chiProb',
'dr',
'dz',
155 'daughter(0, dr)',
'daughter(1, dr)',
156 'daughter(0, dz)',
'daughter(1, dz)',
157 'daughter(0, chiProb)',
'daughter(1, chiProb)',
'daughter(2, chiProb)',
158 'daughter(0, kaonID)',
'daughter(0, pionID)',
159 'daughterInvariantMass(0, 1)',
'daughterInvariantMass(0, 2)',
'daughterInvariantMass(1, 2)']
161 general_options.m_variables = basf2_mva.vector(*variables)
162 general_options.m_spectators = basf2_mva.vector(
'M')
163 general_options.m_target_variable =
"isSignal"
165 specific_options = basf2_mva.PythonOptions()
166 specific_options.m_framework =
"tensorflow"
167 specific_options.m_steering_file =
'mva/examples/tensorflow/multithreaded.py'
168 specific_options.m_nIterations = 400
169 specific_options.m_mini_batch_size = 100000
171 general_options.m_identifier =
"tensorflow_multithreaded"
172 specific_options.m_config = json.dumps({
'capacity': 2e3,
'min_after_dequeue': 600,
'batch_size': 500})
173 basf2_mva.teacher(general_options, specific_options)