11from os.path
import exists
15from keras
import layers, models
16from sklearn.model_selection
import train_test_split
19def CreateModel(nlayers = 4, nunits = 64):
20 input = layers.Input(shape=(7,))
22 for i
in range(1,nlayers) :
23 y = layers.Dense(nunits, activation=
'relu')(x)
26 output = layers.Dense(1, activation=
'sigmoid')(x)
27 model = models.Model(input, output)
28 model.compile(loss =
'binary_crossentropy', optimizer =
'adam', weighted_metrics = [
'accuracy'])
34 inputFile = str(ROOT.gROOT.GetTutorialDir()) +
"/machine_learning/data/Higgs_data.root"
37 sigData = df1.AsNumpy(columns=[
'm_jj',
'm_jjj',
'm_lv',
'm_jlv',
'm_bb',
'm_wbb',
'm_wwbb'])
41 xsig = np.column_stack(list(sigData.values()))
42 data_sig_size = xsig.shape[0]
43 print(
"size of data", data_sig_size)
47 bkgData = df2.AsNumpy(columns=[
'm_jj',
'm_jjj',
'm_lv',
'm_jlv',
'm_bb',
'm_wbb',
'm_wwbb'])
48 xbkg = np.column_stack(list(bkgData.values()))
49 data_bkg_size = xbkg.shape[0]
51 ysig = np.ones(data_sig_size)
52 ybkg = np.zeros(data_bkg_size)
53 inputs_data = np.concatenate((xsig,xbkg),axis=0)
54 inputs_targets = np.concatenate((ysig,ybkg),axis=0)
58 x_train, x_test, y_train, y_test = train_test_split(
59 inputs_data, inputs_targets, test_size=0.50, random_state=1234)
61 return x_train, y_train, x_test, y_test
63def TrainModel(model, x, y, name) :
64 model.fit(x,y,epochs=5,batch_size=50)
65 modelFile = name +
'.keras'
67 return model, modelFile
70def GenerateCode(modelFile = "model.keras") :
73 if not exists(modelFile):
74 raise FileNotFoundError(
"INput model file not existing. You need to run TMVA_Higgs_Classification.C to generate the Keras trained model")
78 model = ROOT.TMVA.Experimental.SOFIE.PyKeras.Parse(modelFile)
82 model.OutputGenerated()
84 modelName = modelFile.replace(
".keras",
"")
91x_train, y_train, x_test, y_test = PrepareData()
93model = CreateModel(3,64)
94model, modelFile = TrainModel(model,x_train, y_train,
'HiggsModel')
100modelName = GenerateCode(modelFile)
101modelHeaderFile = modelName +
".hxx"
107ROOT.gInterpreter.Declare(
'#include "' + modelHeaderFile +
'"')
114sofie = getattr(ROOT,
'TMVA_SOFIE_' + modelName)
115session = sofie.Session()
117x = np.random.normal(0,1,7).astype(np.float32)
119ykeras = model(x.reshape(1,7)).numpy()
121print(
"input to model is ",x,
"\n\t -> output using SOFIE = ", y[0],
" using Keras = ", ykeras[0])
123if (abs(y[0]-ykeras[0]) > 0.01) :
124 raise RuntimeError(
'ERROR: Result is different between SOFIE and Keras')
ROOT's RDataFrame offers a modern, high-level interface for analysis of data stored in TTree ,...