Belle II Software  release-05-01-25
keras_to_weightfile.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 # Dennis Weyland 2017
5 
6 # This example shows how to convert a model trained with keras inside a basf2 weightfile.
7 
9 
10 import tensorflow as tf
11 import tensorflow.contrib.keras as keras
12 
13 from keras.models import load_model
14 
15 
16 def get_model(number_of_features, number_of_spectators, number_of_events, training_fraction, parameters):
17  """
18  Just load keras model into state
19  """
20  return State(load_model(parameters['file_path']))
21 
22 
23 def partial_fit(state, X, S, y, w, epoch):
24  """
25  This should be empty, because our model is already fitted.
26  """
27  return False
28 
29 
30 if __name__ == "__main__":
31  import os
32  import pandas
33  from root_pandas import to_root
34  import tempfile
35  import json
36  import numpy as np
37 
38  import basf2
39  import basf2_mva
40  import basf2_mva_util
41 
42  from keras.layers import Input, Dense
43  from keras.models import Model
44  from keras.optimizers import adam
45  from keras.losses import binary_crossentropy
46  from keras.activations import sigmoid, tanh
47  from basf2 import conditions
48  # NOTE: do not use testing payloads in production! Any results obtained like this WILL NOT BE PUBLISHED
49  conditions.testing_payloads = [
50  'localdb/database.txt'
51  ]
52 
53  # ##############Building Data samples ###########################
54  # The training needs the same variables in the same orders as keras received them during training.
55  # For this example we just create some random variables.
56 
57  variables = ['x' + str(i) for i in range(10)]
58 
59  data = np.random.normal(size=[1000, 11])
60  data[:, -1] = np.int32(data[:, -1] > 0.5)
61 
62  # Build some simple model to convert into weightfile
63  input = Input(shape=(10,))
64 
65  net = Dense(units=100, activation=tanh)(input)
66  output = Dense(units=1, activation=sigmoid)(net)
67 
68  model = Model(input, output)
69  model.compile(optimizer=adam(lr=0.01), loss=binary_crossentropy, metrics=['accuracy'])
70 
71  model.fit(data[:, :-1], data[:, -1], batch_size=10, epochs=10)
72 
73  # This path will delete itself with all data in it after end of program.
74  with tempfile.TemporaryDirectory() as path:
75  # Saving all variables in root files
76  dic = {}
77  for i, name in enumerate(variables):
78  dic.update({name: data[:, i]})
79  dic.update({'isSignal': data[:, -1]})
80 
81  df = pandas.DataFrame(dic, dtype=np.float32)
82  to_root(df, os.path.join(path, 'data.root'), tree_key='tree')
83 
84  # Saving keras training model
85  model.save(os.path.join(path, 'weights.h5'))
86 
87  # ##########################Do Conversion#################################
88 
89  general_options = basf2_mva.GeneralOptions()
90  general_options.m_datafiles = basf2_mva.vector(os.path.join(path, 'data.root'))
91  general_options.m_treename = "tree"
92  general_options.m_variables = basf2_mva.vector(*variables)
93  general_options.m_target_variable = "isSignal"
94 
95  specific_options = basf2_mva.PythonOptions()
96  specific_options.m_framework = "contrib_keras"
97  specific_options.m_steering_file = 'mva/examples/keras/keras_to_weightfile.py'
98 
99  general_options.m_identifier = 'converted_keras'
100  specific_options.m_config = json.dumps({'file_path': os.path.join(path, 'weights.h5')})
101  basf2_mva.teacher(general_options, specific_options)
102 
103  # ########################Apply weightfile####################################
104  method = basf2_mva_util.Method(general_options.m_identifier)
105  p, t = method.apply_expert(general_options.m_datafiles, general_options.m_treename)
106  print('Overtraining AUC: ', basf2_mva_util.calculate_roc_auc(p, t))
basf2_mva_util.calculate_roc_auc
def calculate_roc_auc(p, t)
Definition: basf2_mva_util.py:39
basf2_mva_util.Method
Definition: basf2_mva_util.py:81
basf2_mva_python_interface.contrib_keras
Definition: contrib_keras.py:1