20 from keras.layers
import Input, Dense, Dropout
21 from keras.layers.normalization
import BatchNormalization
22 from keras.models
import Model
23 from keras.optimizers
import Adam
24 from keras.losses
import binary_crossentropy
25 from keras.activations
import sigmoid, tanh
26 from keras.callbacks
import Callback
29 from basf2_mva_extensions.preprocessing
import fast_equal_frequency_binning
31 old_time = time.time()
34 def get_model(number_of_features, number_of_spectators, number_of_events, training_fraction, parameters):
36 Build feed forward keras model
38 input = Input(shape=(number_of_features,))
40 net = Dense(units=number_of_features, activation=tanh)(input)
42 net = Dense(units=number_of_features, activation=tanh)(net)
43 net = BatchNormalization()(net)
45 net = Dense(units=number_of_features, activation=tanh)(net)
46 net = Dropout(rate=0.4)(net)
48 output = Dense(units=1, activation=sigmoid)(net)
52 state = State(Model(input, output), preprocessor_state=
None)
54 state.model.compile(optimizer=Adam(lr=0.01), loss=binary_crossentropy, metrics=[
'accuracy'])
61 def begin_fit(state, Xtest, Stest, ytest, wtest):
63 Returns just the state object
72 def partial_fit(state, X, S, y, w, epoch):
74 Pass received data to tensorflow session
77 preprocessor = fast_equal_frequency_binning()
79 X = preprocessor.apply(X)
80 state.Xtest = preprocessor.apply(state.Xtest)
83 state.preprocessor_state = preprocessor.export_state()
85 class TestCallback(Callback):
86 def on_epoch_end(self, epoch, logs=None):
87 loss, acc = state.model.evaluate(state.Xtest, state.ytest, verbose=0, batch_size=1000)
88 loss2, acc2 = state.model.evaluate(X[:10000], y[:10000], verbose=0, batch_size=1000)
89 print(
'\nTesting loss: {}, acc: {}'.format(loss, acc))
90 print(
'Training loss: {}, acc: {}'.format(loss2, acc2))
92 state.model.fit(X, y, batch_size=500, epochs=10, callbacks=[TestCallback()])
98 Apply estimator to passed data.
99 Has to be overwritten, because also the expert has to apply preprocessing.
102 preprocessor = fast_equal_frequency_binning(state.preprocessor_state)
104 X = preprocessor.apply(X)
106 r = state.model.predict(X).flatten()
107 return np.require(r, dtype=np.float32, requirements=[
'A',
'W',
'C',
'O'])
110 if __name__ ==
"__main__":
111 from basf2
import conditions
113 conditions.testing_payloads = [
114 'localdb/database.txt'
117 general_options = basf2_mva.GeneralOptions()
118 general_options.m_datafiles = basf2_mva.vector(
"train.root")
119 general_options.m_identifier =
"deep_keras"
120 general_options.m_treename =
"tree"
121 variables = [
'M',
'p',
'pt',
'pz',
122 'daughter(0, p)',
'daughter(0, pz)',
'daughter(0, pt)',
123 'daughter(1, p)',
'daughter(1, pz)',
'daughter(1, pt)',
124 'daughter(2, p)',
'daughter(2, pz)',
'daughter(2, pt)',
125 'chiProb',
'dr',
'dz',
126 'daughter(0, dr)',
'daughter(1, dr)',
127 'daughter(0, dz)',
'daughter(1, dz)',
128 'daughter(0, chiProb)',
'daughter(1, chiProb)',
'daughter(2, chiProb)',
129 'daughter(0, kaonID)',
'daughter(0, pionID)',
130 'daughterInvariantMass(0, 1)',
'daughterInvariantMass(0, 2)',
'daughterInvariantMass(1, 2)']
131 general_options.m_variables = basf2_mva.vector(*variables)
132 general_options.m_target_variable =
"isSignal"
134 specific_options = basf2_mva.PythonOptions()
135 specific_options.m_framework =
"contrib_keras"
136 specific_options.m_steering_file =
'mva/examples/keras/preprocessing.py'
137 specific_options.m_normalize =
True
138 specific_options.m_training_fraction = 0.9
140 training_start = time.time()
141 basf2_mva.teacher(general_options, specific_options)
142 training_stop = time.time()
143 training_time = training_stop - training_start
145 inference_start = time.time()
146 test_data = [
"test.root"] * 10
147 p, t = method.apply_expert(basf2_mva.vector(*test_data), general_options.m_treename)
148 inference_stop = time.time()
149 inference_time = inference_stop - inference_start
151 print(
"Tensorflow", training_time, inference_time, auc)
def calculate_roc_auc(p, t)