From fc8d599a5c174683fc691e5ac3606d1e60cd827c Mon Sep 17 00:00:00 2001 From: YeongDeok Seo Date: Thu, 14 Oct 2021 01:04:25 +0900 Subject: [PATCH 1/8] Add rate and eff macro (#26) --- README.md | 10 +++ rate_test.py | 195 +++++++++++++++++++++++++++------------------------ 2 files changed, 114 insertions(+), 91 deletions(-) diff --git a/README.md b/README.md index 0889d13c6..3fe0a4307 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,13 @@ For example, ```bash python train.py --workflowType dataGenerator --input ./path/to/files/ --output ./path/to/result/ --mode 1 --epochs --quantized 8 2 --units 12 36 ``` + +### Test +You need output results with input TTbar and SingleNeutrino. +When you use SingleNeutrino sample as input please change 'TTbar' to 'SingleNeutrino' in test function in train.py. #L66-67 + +SingleNeutrino sample is located in : https://cernbox.cern.ch/index.php/s/5inLVZpXreq1vOx + +```bash +python rate_test.py --input [path to input files (output path of train.py)] --plot [ROC, rate, rate_com] +``` diff --git a/rate_test.py b/rate_test.py index be8e76d24..eafe7afe0 100644 --- a/rate_test.py +++ b/rate_test.py @@ -3,12 +3,13 @@ import h5py import os import numpy as np +import numpy.ma +import time import argparse import collections as co import matplotlib.pyplot as plt - -# local import -from utils import * +import tensorflow.keras.backend as K +import tensorflow as tf # Will test how much difference between PUPPI MET and Predicted MET in ID. @@ -18,89 +19,94 @@ def main(args): print("\n*****************************************\n") # load Predicted MET (TTbar-1, SingleNeutrino-0) - Tarray_ML = np.load("{}TTbar_feature_array_MLMET.npy".format(args.TT)) - print("reading", args.TT, "TTbar_feature_array_MLMET.npy") - Sarray_ML = np.load("{}SingleNeutrino_feature_array_MLMET.npy".format(args.SN)) - print("reading", args.SN, "SingleNeutrino_feature_array_MLMET.npy") - Tarray_ML = np.concatenate((Tarray_ML[:, 0:1], 1+np.zeros((Tarray_ML.shape[0], 1))), axis=1) - Sarray_ML = np.concatenate((Sarray_ML[:, 0:1], np.zeros((Sarray_ML.shape[0], 1))), axis=1) + Tarray_ML = np.load(os.path.join(args.input, "TTbar_feature_array_MLMET.npy")) + Tarray_ML_target = np.load(os.path.join(args.input, "TTbar_target_array_MLMET.npy")) + print("reading", args.input, "TTbar_feature_array_MLMET.npy") + Sarray_ML = np.load(os.path.join(args.input, "SingleNeutrino_feature_array_MLMET.npy")) + Sarray_ML_target = np.load(os.path.join(args.input, "SingleNeutrino_target_array_MLMET.npy")) + print("reading", args.input, "SingleNeutrino_feature_array_MLMET.npy") + Tarray_ML = np.concatenate((Tarray_ML[:, 0:1], Tarray_ML_target[:, 0:1], 1+np.zeros((Tarray_ML.shape[0], 1))), axis=1) + Sarray_ML = np.concatenate((Sarray_ML[:, 0:1], Sarray_ML_target[:, 0:1], np.zeros((Sarray_ML.shape[0], 1))), axis=1) print("finish reading ML MET files") print("\n*****************************************\n") # load PUPPI MET (TTbar-1, SingleNeutrino-0) - Tarray_PU = np.load("{}TTbar_feature_array_PUMET.npy".format(args.TT)) - print("reading", args.TT, "TTbar_feature_array_PUMET.npy") - Sarray_PU = np.load("{}SingleNeutrino_feature_array_PUMET.npy".format(args.SN)) - print("reading", args.SN, "SingleNeutrino_feature_array_PUMET.npy") - Tarray_PU = np.concatenate((Tarray_PU[:, 0:1], 1+np.zeros((Tarray_PU.shape[0], 1))), axis=1) - Sarray_PU = np.concatenate((Sarray_PU[:, 0:1], np.zeros((Sarray_PU.shape[0], 1))), axis=1) + Tarray_PU = np.load(os.path.join(args.input, "TTbar_feature_array_PUMET.npy")) + Tarray_PU_target = np.load(os.path.join(args.input, "TTbar_target_array_PUMET.npy")) + print("reading", args.input, "TTbar_feature_array_PUMET.npy") + Sarray_PU = np.load(os.path.join(args.input, "SingleNeutrino_feature_array_PUMET.npy")) + Sarray_PU_target = np.load(os.path.join(args.input, "SingleNeutrino_target_array_PUMET.npy")) + print("reading", args.input, "SingleNeutrino_feature_array_PUMET.npy") + Tarray_PU = np.concatenate((Tarray_PU[:, 0:1], Tarray_PU_target[:, 0:1], 1+np.zeros((Tarray_PU.shape[0], 1))), axis=1) + Sarray_PU = np.concatenate((Sarray_PU[:, 0:1], Sarray_PU_target[:, 0:1], np.zeros((Sarray_PU.shape[0], 1))), axis=1) print("finish reading PUPPI MET files") print("\n*****************************************\n") # concatenate TTbar and SingleNeutrino and shuffle - array_ML = np.concatenate((Tarray_ML, Sarray_ML), axis=0) - np.random.shuffle(array_ML) - array_PU = np.concatenate((Tarray_PU, Sarray_PU), axis=0) - np.random.shuffle(array_PU) - - # - ML_array = np.zeros((300, 3)) - ML_Rate = np.zeros((300, 2)) - PU_array = np.zeros((300, 3)) - PU_Rate = np.zeros((300, 2)) - - for i in range(300): + ML1 = Tarray_ML + ML0 = Sarray_ML + + PU1 = Tarray_PU + PU0 = Sarray_PU + + bin_number = 300. + step = 2. + + ML_array = np.zeros((int(bin_number), 3)) + PU_array = np.zeros((int(bin_number), 3)) + + ML_rate = np.zeros(int(bin_number)) + PU_rate = np.zeros(int(bin_number)) + ML_rate_SN = np.zeros(int(bin_number)) + PU_rate_SN = np.zeros(int(bin_number)) + target_rate = np.zeros(int(bin_number)) + target_rate_SN = np.zeros(int(bin_number)) + + All1_count = ML1.shape[0] + All0_count = ML0.shape[0] + + for i in range(int(bin_number)): # ML - mask_ML = array_ML[:, 0] > 2*i - ML_TTbar = array_ML[mask_ML] - ML_SingleNeutrino = array_ML[~mask_ML] - unique_TP, counts_TP = np.unique(ML_TTbar[:, 1], return_counts=True) - unique_FN, counts_FN = np.unique(ML_SingleNeutrino[:, 1], return_counts=True) - ML_TP_dict = dict(zip(unique_TP, counts_TP)) - ML_FN_dict = dict(zip(unique_FN, counts_FN)) - - if 1.0 not in ML_TP_dict: - ML_TP_dict[1.0] = 0 - if 0.0 not in ML_TP_dict: - ML_TP_dict[0.0] = 0 - if 1.0 not in ML_FN_dict: - ML_FN_dict[1.0] = 0 - if 0.0 not in ML_FN_dict: - ML_FN_dict[0.0] = 0 - - # save plot data. -> TPR, FPR, trigger rate... - ML_array[i, 0] = ML_TP_dict[1.0] / (ML_TP_dict[1.0] + ML_FN_dict[1.0]) - ML_array[i, 1] = ML_TP_dict[0.0] / (ML_TP_dict[0.0] + ML_FN_dict[0.0]) - ML_array[i, 2] = 2*i - ML_Rate[i, 0] = 2*i - ML_Rate[i, 1] = (ML_TP_dict[0.0] + ML_TP_dict[1.0])/(ML_TP_dict[0.0] + ML_TP_dict[1.0] + ML_FN_dict[0.0] + ML_FN_dict[1.0]) + + ML1_count = np.sum(ML1[:, 0] > i*step) + ML0_count = np.sum(ML0[:, 0] > i*step) + Ta1_count = np.sum(PU1[:, 1] > i*step) + Ta0_count = np.sum(PU0[:, 1] > i*step) + + TP = ML1_count + FP = ML0_count + FN = All1_count - ML1_count + TN = All0_count - ML0_count + + # save plot data. -> TPR, FPR + ML_array[i, 0] = TP / (TP + FN + 1) # TPR + ML_array[i, 1] = FP / (FP + TN) # FPR + ML_array[i, 2] = step*i + + ML_rate[i] = ML1_count/All1_count + ML_rate_SN[i] = ML0_count/All0_count + target_rate[i] = Ta1_count/All1_count + target_rate_SN[i] = Ta0_count/All0_count # PU - mask_PU = array_PU[:, 0] > 2*i - PU_TTbar = array_PU[mask_PU] - PU_SingleNeutrino = array_PU[~mask_PU] - unique_TP, counts_TP = np.unique(PU_TTbar[:, 1], return_counts=True) - unique_FN, counts_FN = np.unique(PU_SingleNeutrino[:, 1], return_counts=True) - PU_TP_dict = dict(zip(unique_TP, counts_TP)) - PU_FN_dict = dict(zip(unique_FN, counts_FN)) - - if 1.0 not in PU_TP_dict: - PU_TP_dict[1.0] = 0 - if 0.0 not in PU_TP_dict: - PU_TP_dict[0.0] = 0 - if 1.0 not in PU_FN_dict: - PU_FN_dict[1.0] = 0 - if 0.0 not in PU_FN_dict: - PU_FN_dict[0.0] = 0 - - # save plot data. -> TPR, FPR, trigger rate... - PU_array[i, 0] = PU_TP_dict[1.0] / (PU_TP_dict[1.0] + PU_FN_dict[1.0]) - PU_array[i, 1] = PU_TP_dict[0.0] / (PU_TP_dict[0.0] + PU_FN_dict[0.0]) - PU_array[i, 2] = 2*i - PU_Rate[i, 0] = 2*i - PU_Rate[i, 1] = (PU_TP_dict[0.0] + PU_TP_dict[1.0])/(PU_TP_dict[0.0] + PU_TP_dict[1.0] + PU_FN_dict[0.0] + PU_FN_dict[1.0]) + + PU1_count = np.sum(PU1[:, 0] > i*step) + PU0_count = np.sum(PU0[:, 0] > i*step) + + TP = PU1_count + FP = PU0_count + FN = All1_count - PU1_count + TN = All0_count - PU0_count + + # save plot data. -> TPR, FPR + PU_array[i, 0] = TP / (TP + FN + 1) # TPR + PU_array[i, 1] = FP / (FP + TN) # FPR + PU_array[i, 2] = step*i + + PU_rate[i] = PU1_count/All1_count + PU_rate_SN[i] = PU0_count/All0_count which_plot = args.plot @@ -111,42 +117,49 @@ def main(args): print("ML AUC : {}".format(ML_AUC)) print("PU AUC : {}".format(PU_AUC)) - plt.plot(ML_array[:.1], ML_array[:, 0], label='ML ROC, AUC = {}'.format(round(ML_AUC, 3))) + plt.plot(ML_array[:, 1], ML_array[:, 0], label='ML ROC, AUC = {}'.format(round(ML_AUC, 3))) plt.plot(PU_array[:, 1], PU_array[:, 0], '-r', label='PUPPI ROC, AUC = {}'.format(round(PU_AUC, 3))) plt.grid(True, axis='x', color='gray', alpha=0.5, linestyle='--') plt.xlabel('FPR') - plt.xscale('log') - plt.xlim(0.00001, 0.1) + plt.xlim(0., 1.) plt.grid(True, axis='y', color='gray', alpha=0.5, linestyle='--') plt.ylabel('TPR') plt.title('ROC') plt.legend() - # plt.show() plt.savefig('ROC_curve.png') - elif which_plot == "trigger": - plt.plot(ML_Rate[:, 0], ML_Rate[:, 1], label='ML Trigger Rate') - plt.plot(ML_Rate[:, 0], ML_array[:, 0], label='ML Efficiency') - plt.plot(PU_Rate[:, 0], PU_Rate[:, 1], label='PU Trigger Rate') - plt.plot(PU_Rate[:, 0], PU_array[:, 0], label='PU Efficiency') + elif which_plot == "rate": + x_ = range(0, int(step*bin_number), int(step)) + plt.plot(x_, ML_rate, 'bo', label='ML') + plt.plot(x_, PU_rate, 'ro', label='PUPPI') plt.grid(True, axis='x', color='gray', alpha=0.5, linestyle='--') - plt.xlabel('MET Threshold') - plt.xlim(0.0, 300.0) plt.grid(True, axis='y', color='gray', alpha=0.5, linestyle='--') - plt.ylabel('Trigger rate (event passed trigger/all event)') - plt.title('Trigger rate') + plt.xlim(0, 200) plt.legend() - # plt.show() - plt.savefig('trigger_rate.png') + plt.xlabel('MET threshold (ML, PU MET) [GeV]') + plt.ylabel('TTbar efficiency') + plt.savefig('triggerrate_SN_nolog_200.png') + plt.show() + + elif which_plot == "rate_com": + x_ = range(0, int(step*bin_number), int(step)) + plt.plot(ML_rate, ML_rate_SN*31000, 'bo', label='ML') + plt.plot(PU_rate, PU_rate_SN*31000, 'ro', label='PUPPI') + plt.grid(True, axis='y', color='gray', alpha=0.5, linestyle='--') + plt.grid(True, axis='x', color='gray', alpha=0.5, linestyle='--') + plt.yscale("log") + plt.legend() + plt.xlabel('TTbar efficiency') + plt.ylabel('SingleNeutrino rate [kHz]') + plt.savefig('combined_True.png') + plt.show() # Configuration - if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument('--TT', action='store', type=str, required=True, help='designate TTbar input file path') - parser.add_argument('--SN', action='store', type=str, required=True, help='designate SingleNeutrino input file path') + parser.add_argument('--input', action='store', type=str, required=True, help='designate input file path (= output path of training)') parser.add_argument('--plot', action='store', type=str, required=True, help='ROC for ROC curve, trigger for trigger rate ') args = parser.parse_args() From f6ba047647ea4db558e74448648097d8ab95ca55 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Wed, 13 Oct 2021 09:56:49 -0700 Subject: [PATCH 2/8] Assert >=3 files for DataGenerator (#27) * small fixes * update --- train.py | 9 +++++---- utils.py | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/train.py b/train.py index a59b88dc1..b94cc6547 100644 --- a/train.py +++ b/train.py @@ -89,11 +89,12 @@ def train_dataGenerator(args): units = list(map(int, args.units)) # separate files into training, validation, and testing - filesList = glob(os.path.join(f'{inputPath}', '*.root')) + filesList = glob(os.path.join(inputPath, '*.root')) filesList.sort(reverse=True) - valid_nfiles = int(.1*len(filesList)) - if valid_nfiles == 0: - valid_nfiles = 1 + + assert len(filesList) >= 3, "Need at least 3 files for DataGenerator: 1 valid, 1 test, 1 train" + + valid_nfiles = max(1, int(.1*len(filesList))) train_nfiles = len(filesList) - 2*valid_nfiles test_nfiles = valid_nfiles train_filesList = filesList[0:train_nfiles] diff --git a/utils.py b/utils.py index 8519ab89e..31d167f3d 100644 --- a/utils.py +++ b/utils.py @@ -22,7 +22,7 @@ def convertXY2PtPhi(arrayXY): nevents = arrayXY.shape[0] arrayPtPhi = np.zeros((nevents, 2)) arrayPtPhi[:, 0] = np.sqrt((arrayXY[:, 0]**2 + arrayXY[:, 1]**2)) - arrayPtPhi[:, 1] = np.sign(arrayXY[:, 1])*np.arccos(arrayXY[:, 0]/arrayPtPhi[:, 0]) + arrayPtPhi[:, 1] = np.arctan2(arrayXY[:, 1], arrayXY[:, 0]) return arrayPtPhi From d68d3bf98f777a6d6c03b2b83fba0472955844dc Mon Sep 17 00:00:00 2001 From: YeongDeok Seo Date: Tue, 19 Oct 2021 11:14:13 +0900 Subject: [PATCH 3/8] minor fix for phi resolution plot (#28) --- utils.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/utils.py b/utils.py index 31d167f3d..82be03c01 100644 --- a/utils.py +++ b/utils.py @@ -1,3 +1,4 @@ +import math import awkward as ak import numpy as np @@ -108,6 +109,15 @@ def resolqt(y): responseCorrection_ml = np.take(truth_means/ml_means, np.digitize(true_ptPhi[:, 0], binnings)-1, mode='clip') responseCorrection_puppi = np.take(truth_means/puppi_means, np.digitize(true_ptPhi[:, 0], binnings)-1, mode='clip') + # Phi calculation + Phi_diff_ml = true_ptPhi[:, 1] - ml_ptPhi[:, 1] + Phi_diff_ml = np.where(Phi_diff_ml < -math.pi, Phi_diff_ml + 2*math.pi, Phi_diff_ml) + Phi_diff_ml = np.where(Phi_diff_ml > math.pi, Phi_diff_ml - 2*math.pi, Phi_diff_ml) + + Phi_diff_puppi = true_ptPhi[:, 1] - puppi_ptPhi[:, 1] + Phi_diff_puppi = np.where(Phi_diff_puppi < -math.pi, Phi_diff_puppi + 2*math.pi, Phi_diff_puppi) + Phi_diff_puppi = np.where(Phi_diff_puppi > math.pi, Phi_diff_puppi - 2*math.pi, Phi_diff_puppi) + # compute resolutions inside all 20 bins # the dirstribution true_pt - respCor*ml/puppi_pt should be centered at 0 bin_resolX_ml, bin_edges, binnumber = binned_statistic(true_ptPhi[:, 0], trueXY[:, 0] - mlXY[:, 0] * responseCorrection_ml, @@ -116,7 +126,7 @@ def resolqt(y): statistic=resolqt, bins=binnings, range=(0, 400)) bin_resolPt_ml, _, _ = binned_statistic(true_ptPhi[:, 0], true_ptPhi[:, 0] - ml_ptPhi[:, 0] * responseCorrection_ml, statistic=resolqt, bins=binnings, range=(0, 400)) - bin_resolPhi_ml, bin_edgesPhi, binnumberPhi = binned_statistic(true_ptPhi[:, 1], true_ptPhi[:, 1] - ml_ptPhi[:, 1], + bin_resolPhi_ml, bin_edgesPhi, binnumberPhi = binned_statistic(true_ptPhi[:, 1], Phi_diff_ml, statistic=resolqt, bins=phiBinnings, range=(-3.15, 3.15)) bin_resolX_puppi, _, _ = binned_statistic(true_ptPhi[:, 0], trueXY[:, 0] - puppiXY[:, 0] * responseCorrection_puppi, @@ -125,7 +135,7 @@ def resolqt(y): statistic=resolqt, bins=binnings, range=(0, 400)) bin_resolPt_puppi, _, _ = binned_statistic(true_ptPhi[:, 0], true_ptPhi[:, 0] - puppi_ptPhi[:, 0] * responseCorrection_puppi, statistic=resolqt, bins=binnings, range=(0, 400)) - bin_resolPhi_puppi, _, _ = binned_statistic(true_ptPhi[:, 1], true_ptPhi[:, 1] - puppi_ptPhi[:, 1], + bin_resolPhi_puppi, _, _ = binned_statistic(true_ptPhi[:, 1], Phi_diff_puppi, statistic=resolqt, bins=phiBinnings, range=(-3.15, 3.15)) # calclate the resolution "magnitude" inside all 20 bins @@ -157,6 +167,8 @@ def resolqt(y): # the square root of the number of events in each bin nEvents_inBin, _ = np.histogram(binnumber, bins=nbins, range=(1, nbins)) rootN = np.sqrt(nEvents_inBin) + nEvents_inBin_phi, _ = np.histogram(binnumberPhi, bins=nbins, range=(1, nbins)) + rootN_phi = np.sqrt(nEvents_inBin_phi) # is used to calculate the error bars for each bin = res/rootN # locations of error bars @@ -232,6 +244,7 @@ def resolqt(y): yerr=bin_resolPt_ml/rootN, fmt='none', color='r') ax21.errorbar(bin_edges[:-1]+leftOfBinCenter, bin_resolPt_puppi, yerr=bin_resolPt_puppi/rootN, fmt='none', color='g') + ax21.set_xlabel('truth met [gev]', fontsize=19) ax21.set_ylabel(r'$\sigma(MET)$ [GeV]', fontsize=20) ax21.grid() ax21.set_title('MET-pt Resolution', fontsize=22) @@ -243,9 +256,11 @@ def resolqt(y): ax22.hlines(bin_resolPhi_puppi, bin_edgesPhi[:-1], bin_edgesPhi[1:], colors='g', lw=3, label='$\\sigma_{PUPPI}$', linestyles='solid') ax22.errorbar(bin_edgesPhi[:-1]+.13, bin_resolPhi_ml, - yerr=bin_resolPhi_ml/rootN, fmt='none', color='r') + yerr=bin_resolPhi_ml/rootN_phi, fmt='none', color='r') ax22.errorbar(bin_edgesPhi[:-1]+.17, bin_resolPhi_puppi, - yerr=bin_resolPhi_puppi/rootN, fmt='none', color='g') + yerr=bin_resolPhi_puppi/rootN_phi, fmt='none', color='g') + ax22.set_ylabel('radian', fontsize=20) + ax22.set_ylim(0., 1.) ax22.grid() ax22.set_xlabel(r'$\phi$ angle', fontsize=19) ax22.legend(loc='upper center', prop={'size': 19}) From ee952c8586b28e927d8cf5e4339c663b9431ac67 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Mon, 20 Dec 2021 12:24:04 -0800 Subject: [PATCH 4/8] Minor updates to make model more hls4ml-compatible (#29) * minor updates to make more hls4ml-compatible * update * update * update --- convert_partial_models.py | 123 +++++++++++++++++++++----------------- models.py | 25 ++++---- utils.py | 4 +- 3 files changed, 81 insertions(+), 71 deletions(-) diff --git a/convert_partial_models.py b/convert_partial_models.py index dbdbaed3d..b9804191d 100644 --- a/convert_partial_models.py +++ b/convert_partial_models.py @@ -1,3 +1,4 @@ +import setGPU import tensorflow from models import dense_embedding from tensorflow.keras.layers import Input, Concatenate @@ -6,6 +7,7 @@ import hls4ml import pandas as pd from qkeras.utils import _add_supported_quantized_objects +from models import dense_embedding, dense_embedding_quantized co = {} _add_supported_quantized_objects(co) @@ -21,53 +23,64 @@ def print_dict(d, indent=0): print(':' + ' ' * (20 - len(key) - 2 * indent) + str(value)) -model = tensorflow.keras.models.load_model('output/model.h5', compile=False, custom_objects=co) +# load full model: +# model = tensorflow.keras.models.load_model('output/model.h5', compile=False, custom_objects=co) +# prepare new model: +n_puppi_cands = 16 +reuse_factor = 1 +precision = 'ap_fixed<8,3>' +io_type = 'io_parallel' +strategy = 'Resource' +output_dir = 'hls_output_{}_{}_rf{}_puppi{}'.format(io_type, strategy, reuse_factor, n_puppi_cands) +batch_size = 1 +model = dense_embedding_quantized(n_features=6, + n_features_cat=2, + number_of_pupcandis=n_puppi_cands, + embedding_input_dim={0: 13, 1: 3}, + emb_out_dim=8, + with_bias=False, + t_mode=1, + units=[12, 36], + logit_total_bits=8, + logit_int_bits=2, + activation_total_bits=8, + activation_int_bits=2) +# load just weights: +# model.load_weights('output/model.h5') # check everthing works model.summary() +model.save('{}/model.h5'.format(output_dir)) # now let's break up the model # save a dictionary of the model model_dict = {layer.name: layer for layer in model.layers} # first part of the model -partial_model_1 = Model(inputs=model.inputs, - outputs=model_dict['dense'].input, name='partial_model_1') +partial_model_1 = Model(inputs=[model_dict['input_cont'].input, model_dict['input_cat0'].input, model_dict['input_cat1'].input], + outputs=model_dict['met_weight_minus_one'].output, name='partial_model_1') partial_model_1.summary() -# second part of the model (to implement in hls4ml) -input_layer = Input(model_dict['dense'].input.shape[1:]) -x = model_dict['dense'](input_layer) -x = model_dict['batch_normalization'](x) -x = model_dict['activation'](x) -x = model_dict['dense_1'](x) -x = model_dict['batch_normalization_1'](x) -x = model_dict['activation_1'](x) -x = model_dict['dense_2'](x) -x = model_dict['batch_normalization_2'](x) -x = model_dict['activation_2'](x) -x = model_dict['met_weight'](x) -output_layer = model_dict['met_weight_minus_one'](x) -partial_model_2 = Model(inputs=input_layer, outputs=output_layer, name='partial_model_2') -partial_model_2.summary() - -# third part of the model +# second part of the model input_layer_1 = Input(model_dict['input_pxpy'].input.shape[1:]) input_layer_2 = Input(model_dict['met_weight_minus_one'].output.shape[1:]) x = model_dict['multiply']([input_layer_2, input_layer_1]) output_layer = model_dict['output'](x) -partial_model_3 = Model(inputs=[input_layer_1, input_layer_2], outputs=output_layer, name='partial_model_3') -partial_model_3.summary() +partial_model_2 = Model(inputs=[input_layer_1, input_layer_2], outputs=output_layer, name='partial_model_2') +partial_model_2.summary() +partial_model_1.save('{}/partial_model_1.h5'.format(output_dir)) +partial_model_2.save('{}/partial_model_2.h5'.format(output_dir)) # let's check the partial models give the same answer as the original model # random inputs -X = np.random.rand(2, 100, 4) -Xp = np.random.rand(2, 100, 2) -X_cat0 = np.random.randint(0, 13, size=(2, 100, 1)) -X_cat1 = np.random.randint(0, 3, size=(2, 100, 1)) +X = np.random.rand(batch_size, n_puppi_cands, 4) +Xp = np.random.rand(batch_size, n_puppi_cands, 2) +X_cat0 = np.random.randint(13, size=(batch_size, n_puppi_cands)) +X_cat1 = np.random.randint(3, size=(batch_size, n_puppi_cands)) print('input shapes') print(X.shape) +print(Xp.shape) print(X_cat0.shape) print(X_cat1.shape) @@ -77,44 +90,42 @@ def print_dict(d, indent=0): print(y) # partial ouputs -y_1 = partial_model_1.predict([X, Xp, X_cat0, X_cat1]) -y_2 = partial_model_2.predict(y_1) -y_3 = partial_model_3.predict([Xp, y_2]) +y_1 = partial_model_1.predict([X, X_cat0, X_cat1]) +y_2 = partial_model_2.predict([Xp, y_1]) print('partial outputs') -print(y_3) +print(y_2) # check if they're equal (error if they're not!) -np.testing.assert_array_equal(y, y_3) - -model_to_convert = partial_model_2 -config = hls4ml.utils.config_from_keras_model(model_to_convert, granularity='name') - -config['Model'] = {} -config['Model']['ReuseFactor'] = 1 -config['Model']['Strategy'] = 'Latency' -config['Model']['Precision'] = 'ap_fixed<16,6>' -#config['SkipOptimizers'] = ['optimize_pointwise_conv'] -for layer in config['LayerName'].keys(): - config['LayerName'][layer]['Trace'] = True - -cfg = hls4ml.converters.create_vivado_config(fpga_part='xc7z020clg400-1') -cfg['HLSConfig'] = config -cfg['IOType'] = 'io_parallel' -cfg['Backend'] = 'Vivado' -cfg['ClockPeriod'] = 10 -cfg['KerasModel'] = model_to_convert -cfg['OutputDir'] = 'hls_output' +np.testing.assert_array_equal(y, y_2) + +model_to_convert = partial_model_1 +config = hls4ml.utils.config_from_keras_model(model_to_convert, granularity='name', + default_reuse_factor=reuse_factor, default_precision=precision) +config['Model']['Strategy'] = strategy +config['LayerName']['input_cat0']['Precision']['result'] = 'ap_uint<4>' +config['LayerName']['input_cat1']['Precision']['result'] = 'ap_uint<4>' +# skip optimize_pointwise_conv +# config['SkipOptimizers'] = ['optimize_pointwise_conv'] +# for layer in config['LayerName'].keys(): +# config['LayerName'][layer]['Trace'] = True print("-----------------------------------") -print_dict(cfg) +print_dict(config) print("-----------------------------------") - -hls_model = hls4ml.converters.keras_to_hls(cfg) +hls_model = hls4ml.converters.convert_from_keras_model(model_to_convert, + hls_config=config, + io_type=io_type, + output_dir=output_dir, + part='xcvu9p-flgb2104-2-i', + clock_period=5) hls_model.compile() -y_2_hls = hls_model.predict(y_1) -df = pd.DataFrame({'keras': y_2.flatten(), 'hls4ml': y_2_hls.flatten()}) +hls4ml.utils.plot_model(hls_model, show_shapes=True, show_precision=True, to_file='{}/model_hls4ml.png'.format(output_dir)) + +y_1_hls = hls_model.predict([X.astype(np.float32), X_cat0.astype(np.float32), X_cat1.astype(np.float32)]) +df = pd.DataFrame({'keras': y_1.flatten(), 'hls4ml': y_1_hls.flatten()}) print(df) -hls4ml.utils.plot_model(hls_model, show_shapes=True, show_precision=True, to_file='model_hls4ml.png') +hls_model.build(synth=True) +hls4ml.report.read_vivado_report(output_dir) diff --git a/models.py b/models.py index c8cbfdf6c..30e9630c6 100644 --- a/models.py +++ b/models.py @@ -20,13 +20,13 @@ def dense_embedding(n_features=6, units=[64, 32, 16]): n_dense_layers = len(units) - inputs_cont = Input(shape=(number_of_pupcandis, n_features-2), name='input') + inputs_cont = Input(shape=(number_of_pupcandis, n_features-2), name='input_cont') pxpy = Input(shape=(number_of_pupcandis, 2), name='input_pxpy') embeddings = [] inputs = [inputs_cont, pxpy] for i_emb in range(n_features_cat): - input_cat = Input(shape=(number_of_pupcandis, 1), name='input_cat{}'.format(i_emb)) + input_cat = Input(shape=(number_of_pupcandis, ), name='input_cat{}'.format(i_emb)) inputs.append(input_cat) embedding = Embedding( input_dim=embedding_input_dim[i_emb], @@ -35,10 +35,12 @@ def dense_embedding(n_features=6, mean=0, stddev=0.4/emb_out_dim), name='embedding{}'.format(i_emb))(input_cat) - embedding = Reshape((number_of_pupcandis, emb_out_dim))(embedding) embeddings.append(embedding) - x = Concatenate()([inputs_cont] + [emb for emb in embeddings]) + # can concatenate all 3 if updated in hls4ml, for now; do it pairwise + # x = Concatenate()([inputs_cont] + embeddings) + emb_concat = Concatenate()(embeddings) + x = Concatenate()([inputs_cont, emb_concat]) for i_dense in range(n_dense_layers): x = Dense(units[i_dense], activation='linear', kernel_initializer='lecun_uniform')(x) @@ -88,13 +90,13 @@ def dense_embedding_quantized(n_features=6, logit_quantizer = getattr(qkeras.quantizers, logit_quantizer)(logit_total_bits, logit_int_bits, alpha=alpha, use_stochastic_rounding=use_stochastic_rounding) activation_quantizer = getattr(qkeras.quantizers, activation_quantizer)(activation_total_bits, activation_int_bits) - inputs_cont = Input(shape=(number_of_pupcandis, n_features-2), name='input') + inputs_cont = Input(shape=(number_of_pupcandis, n_features-2), name='input_cont') pxpy = Input(shape=(number_of_pupcandis, 2), name='input_pxpy') embeddings = [] inputs = [inputs_cont, pxpy] for i_emb in range(n_features_cat): - input_cat = Input(shape=(number_of_pupcandis, 1), name='input_cat{}'.format(i_emb)) + input_cat = Input(shape=(number_of_pupcandis, ), name='input_cat{}'.format(i_emb)) inputs.append(input_cat) embedding = Embedding( input_dim=embedding_input_dim[i_emb], @@ -103,10 +105,12 @@ def dense_embedding_quantized(n_features=6, mean=0, stddev=0.4/emb_out_dim), name='embedding{}'.format(i_emb))(input_cat) - embedding = Reshape((number_of_pupcandis, emb_out_dim))(embedding) embeddings.append(embedding) - x = Concatenate()([inputs_cont] + [emb for emb in embeddings]) + # can concatenate all 3 if updated in hls4ml, for now; do it pairwise + # x = Concatenate()([inputs_cont] + embeddings) + emb_concat = Concatenate()(embeddings) + x = Concatenate()([inputs_cont, emb_concat]) for i_dense in range(n_dense_layers): x = QDense(units[i_dense], kernel_quantizer=logit_quantizer, bias_quantizer=logit_quantizer, kernel_initializer='lecun_uniform')(x) @@ -121,10 +125,8 @@ def dense_embedding_quantized(n_features=6, if t_mode == 1: if with_bias: b = QDense(2, name='met_bias', kernel_quantizer=logit_quantizer, bias_quantizer=logit_quantizer, kernel_initializer=initializers.VarianceScaling(scale=0.02))(x) - b = QActivation(activation='linear')(b) pxpy = Add()([pxpy, b]) w = QDense(1, name='met_weight', kernel_quantizer=logit_quantizer, bias_quantizer=logit_quantizer, kernel_initializer=initializers.VarianceScaling(scale=0.02))(x) - w = QActivation(activation='linear')(w) w = BatchNormalization(trainable=False, name='met_weight_minus_one', epsilon=False)(w) x = Multiply()([w, pxpy]) @@ -136,6 +138,3 @@ def dense_embedding_quantized(n_features=6, keras_model.get_layer('met_weight_minus_one').set_weights([np.array([1.]), np.array([-1.]), np.array([0.]), np.array([1.])]) return keras_model - -# multiple values assigned to 'use_stochastic_rounding' in line 57 (activation quantizer), so i removed this argument -# QGlobalAveragePooling1D doesn't exist (line 80); only affects when mode 0 seleceted diff --git a/utils.py b/utils.py index 82be03c01..b9e8eaa2d 100644 --- a/utils.py +++ b/utils.py @@ -47,8 +47,8 @@ def preProcessing(A, normFac, EVT=None): inputs = np.concatenate((pt, eta, phi, puppi), axis=2) pxpy = np.concatenate((px, py), axis=2) - inputs_cat0 = A[:, :, 6:7] # encoded PF pdgId - inputs_cat1 = A[:, :, 7:8] # encoded PF charge + inputs_cat0 = A[:, :, 6] # encoded PF pdgId + inputs_cat1 = A[:, :, 7] # encoded PF charge return inputs, pxpy, inputs_cat0, inputs_cat1 From 38fd86249c5d0bccea583d7ac566e4c60fc33f93 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Thu, 4 Aug 2022 11:27:02 -0700 Subject: [PATCH 5/8] Add GNN (#31) * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update models.py * Update models.py * Update train.py * Update DataGenerator.py * Update models.py * Update train.py * Update DataGenerator.py * Update DataGenerator.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update DataGenerator.py * Update models.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update DataGenerator.py * Update models.py * Update train.py * Update DataGenerator.py * Update train.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update train.py * Update DataGenerator.py * Update models.py * Update train.py * Update train.py * Update train.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update train.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update train.py * Update DataGenerator.py * Update models.py * Update train.py * Update models.py * Update models.py * Update models.py * Update models.py * Update models.py * Update models.py * Update models.py * Update models.py * Update models.py * Update models.py * Update models.py * Update models.py * Update models.py * Update models.py * Update models.py * Update models.py * Update models.py * Update train.py * Update models.py * Update train.py * Update train.py * Update train.py * Update train.py * Update models.py * Update models.py * Update models.py * Update train.py * Update train.py * Update train.py * Update train.py * Update models.py * Update models.py * Update models.py * Update train.py * Update DataGenerator.py * Update models.py * Update models.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update models.py * Update train.py * Update models.py * Update models.py * Update train.py * Update models.py * Update train.py * Update models.py * Update DataGenerator.py * Update models.py * Update DataGenerator.py * Update DataGenerator.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update DataGenerator.py * Update DataGenerator.py * Update models.py * Update DataGenerator.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update DataGenerator.py * Update models.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update train.py * Update DataGenerator.py * Update train.py * Update DataGenerator.py * Update models.py * Update train.py * Update DataGenerator.py * Update models.py * Update train.py * Update train.py * Update models.py * Update DataGenerator.py * Update DataGenerator.py * Update train.py * Update train.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update train.py * Update train.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update models.py * Update train.py * Update train.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update utils.py * Update train.py * Update utils.py * Update utils.py * Update train.py * Update utils.py * Update train.py * Update DataGenerator.py * Update DataGenerator.py * Update train.py * Update models.py * Update train.py * Update DataGenerator.py * Update models.py * Update train.py * Update DataGenerator.py * Update models.py * Update DataGenerator.py * Update models.py * Update train.py * Update train.py * Update train.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update DataGenerator.py * Update train.py * Update train.py * Update train.py * Update DataGenerator.py * Update models.py * Update train.py * Update utils.py Co-authored-by: simon-poon <93788837+simon-poon@users.noreply.github.com> --- DataGenerator.py | 104 ++++++++++++++++++++--- models.py | 116 ++++++++++++++++++++++++- train.py | 214 +++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 387 insertions(+), 47 deletions(-) diff --git a/DataGenerator.py b/DataGenerator.py index 61991de3b..fb155d54e 100644 --- a/DataGenerator.py +++ b/DataGenerator.py @@ -7,13 +7,14 @@ from utils import convertXY2PtPhi, preProcessing, to_np_array import h5py import os +import itertools class DataGenerator(tensorflow.keras.utils.Sequence): 'Generates data for Keras' - def __init__(self, list_files, batch_size=1024, n_dim=100, - max_entry=100000000): + def __init__(self, list_files, batch_size=1024, n_dim=100, maxNPF=100, compute_ef=0, + max_entry=100000000, edge_list=[]): 'Initialization' self.n_features_pf = 6 self.n_features_pf_cat = 2 @@ -26,6 +27,9 @@ def __init__(self, list_files, batch_size=1024, n_dim=100, self.file_mapping = [] self.max_entry = max_entry self.open_files = [None]*len(list_files) + self.maxNPF = maxNPF + self.compute_ef = compute_ef + self.edge_list = edge_list running_total = 0 self.h5files = [] @@ -57,7 +61,6 @@ def __getitem__(self, index): # Generate indexes of the batch indexes = self.indexes[index*self.batch_size:(index+1)*self.batch_size] files = self.file_mapping[index*self.batch_size:(index+1)*self.batch_size] - unique_files = np.unique(files) starts = np.array([min(indexes[files == i]) for i in unique_files]) stops = np.array([max(indexes[files == i]) for i in unique_files]) @@ -80,6 +83,32 @@ def on_epoch_end(self): 'Updates indexes after each epoch' self.indexes = self.local_IDs + def deltaR_calc(self, eta1, phi1, eta2, phi2): + """ calculate deltaR """ + dphi = (phi1-phi2) + gt_pi_idx = (dphi > np.pi) + lt_pi_idx = (dphi < -np.pi) + dphi[gt_pi_idx] -= 2*np.pi + dphi[lt_pi_idx] += 2*np.pi + deta = eta1-eta2 + return np.hypot(deta, dphi) + + def kT_calc(self, pti, ptj, dR): + min_pt = np.minimum(pti, ptj) + kT = min_pt * dR + return kT + + def z_calc(self, pti, ptj): + epsilon = 1.0e-12 + min_pt = np.minimum(pti, ptj) + z = min_pt/(pti + ptj + epsilon) + return z + + def mass2_calc(self, pi, pj): + pij = pi + pj + m2 = pij[:, :, 0]**2 - pij[:, :, 1]**2 - pij[:, :, 2]**2 - pij[:, :, 3]**2 + return m2 + def __data_generation(self, unique_files, starts, stops): 'Generates data containing batch_size samples' # X : (n_samples, n_dim, n_channels) @@ -102,15 +131,63 @@ def __data_generation(self, unique_files, starts, stops): Y = self.y / (-self.normFac) Xi, Xp, Xc1, Xc2 = preProcessing(self.X, self.normFac) - Xc = [Xc1, Xc2] - # dimension parameter for keras model - self.emb_input_dim = {i: int(np.max(Xc[i][0:1000])) + 1 for i in range(self.n_features_pf_cat)} + N = self.maxNPF + Nr = N*(N-1) + + if self.compute_ef == 1: + eta = Xi[:, :, 1] + phi = Xi[:, :, 2] + pt = Xi[:, :, 0] + if ('m2' in self.edge_list): + px = Xp[:, :, 0] + py = Xp[:, :, 1] + pz = pt*np.sinh(eta) + energy = np.sqrt(px**2 + py**2 + pz**2) + p4 = np.stack((energy, px, py, pz), axis=-1) + receiver_sender_list = [i for i in itertools.product(range(N), range(N)) if i[0] != i[1]] + edge_idx = np.array(receiver_sender_list) + edge_stack = [] + if ('dR' in self.edge_list) or ('kT' in self.edge_list): + eta1 = eta[:, edge_idx[:, 0]] + phi1 = phi[:, edge_idx[:, 0]] + eta2 = eta[:, edge_idx[:, 1]] + phi2 = phi[:, edge_idx[:, 1]] + dR = self.deltaR_calc(eta1, phi1, eta2, phi2) + edge_stack.append(dR) + if ('kT' in self.edge_list) or ('z' in self.edge_list): + pt1 = pt[:, edge_idx[:, 0]] + pt2 = pt[:, edge_idx[:, 1]] + if ('kT' in self.edge_list): + kT = self.kT_calc(pt1, pt2, dR) + edge_stack.append(kT) + if ('z' in self.edge_list): + z = self.z_calc(pt1, pt2) + edge_stack.append(z) + if ('m2' in self.edge_list): + p1 = p4[:, edge_idx[:, 0], :] + p2 = p4[:, edge_idx[:, 1], :] + m2 = self.mass2_calc(p1, p2) + edge_stack.append(m2) + ef = np.stack(edge_stack, axis=-1) + + Xc = [Xc1, Xc2] + # dimension parameter for keras model + self.emb_input_dim = {i: int(np.max(Xc[i][0:1000])) + 1 for i in range(self.n_features_pf_cat)} + + # Prepare training/val data + Yr = Y + Xr = [Xi, Xp] + Xc + [ef] + return Xr, Yr - # Prepare training/val data - Yr = Y - Xr = [Xi, Xp] + Xc + else: + Xc = [Xc1, Xc2] + # dimension parameter for keras model + self.emb_input_dim = {i: int(np.max(Xc[i][0:1000])) + 1 for i in range(self.n_features_pf_cat)} - return Xr, Yr + # Prepare training/val data + Yr = Y + Xr = [Xi, Xp] + Xc + return Xr, Yr def __get_features_labels(self, ifile, entry_start, entry_stop): 'Loads data from one file' @@ -124,4 +201,11 @@ def __get_features_labels(self, ifile, entry_start, entry_stop): X = h5_file['X'][entry_start:entry_stop+1] y = h5_file['Y'][entry_start:entry_stop+1] + if self.maxNPF < 100: + order = X[:, :, 0].argsort(axis=1)[:, ::-1] + shape = np.shape(X) + for x in range(shape[0]): + X[x, :, :] = X[x, order[x], :] + X = X[:, 0:self.maxNPF, :] + return X, y diff --git a/models.py b/models.py index 30e9630c6..68ed3567d 100644 --- a/models.py +++ b/models.py @@ -1,5 +1,5 @@ from tensorflow.keras.models import Model -from tensorflow.keras.layers import Input, Dense, Embedding, BatchNormalization, Dropout, Lambda, Conv1D, SpatialDropout1D, Concatenate, Flatten, Reshape, Multiply, Add, GlobalAveragePooling1D, Activation +from tensorflow.keras.layers import Input, Dense, Embedding, BatchNormalization, Dropout, Lambda, Conv1D, SpatialDropout1D, Concatenate, Flatten, Reshape, Multiply, Add, GlobalAveragePooling1D, Activation, Permute import tensorflow.keras.backend as K import tensorflow as tf from tensorflow import slice @@ -7,6 +7,7 @@ import qkeras from qkeras.qlayers import QDense, QActivation import numpy as np +import itertools def dense_embedding(n_features=6, @@ -138,3 +139,116 @@ def dense_embedding_quantized(n_features=6, keras_model.get_layer('met_weight_minus_one').set_weights([np.array([1.]), np.array([-1.]), np.array([0.]), np.array([1.])]) return keras_model + + +# Create the sender and receiver relations matrices +def assign_matrices(N, Nr): + Rr = np.zeros([N, Nr], dtype=np.float32) + Rs = np.zeros([N, Nr], dtype=np.float32) + receiver_sender_list = [i for i in itertools.product(range(N), range(N)) if i[0] != i[1]] + for i, (r, s) in enumerate(receiver_sender_list): + Rr[r, i] = 1 + Rs[s, i] = 1 + return Rs, Rr + + +def graph_embedding(compute_ef, n_features=6, + n_features_cat=2, + activation='relu', + number_of_pupcandis=100, + embedding_input_dim={0: 13, 1: 3}, + emb_out_dim=8, + units=[64, 32, 16], + edge_list=[]): + n_dense_layers = len(units) + name = 'met' + + inputs_cont = Input(shape=(number_of_pupcandis, n_features-2), name='input_cont') + pxpy = Input(shape=(number_of_pupcandis, 2), name='input_pxpy') + + embeddings = [] + inputs = [inputs_cont, pxpy] + for i_emb in range(n_features_cat): + input_cat = Input(shape=(number_of_pupcandis, ), name='input_cat{}'.format(i_emb)) + inputs.append(input_cat) + embedding = Embedding( + input_dim=embedding_input_dim[i_emb], + output_dim=emb_out_dim, + embeddings_initializer=initializers.RandomNormal( + mean=0, + stddev=0.4/emb_out_dim), + name='embedding{}'.format(i_emb))(input_cat) + embeddings.append(embedding) + + N = number_of_pupcandis + Nr = N*(N-1) + if compute_ef == 1: + num_of_edge_feat = len(edge_list) + edge_feat = Input(shape=(Nr, num_of_edge_feat), name='edge_feat') + inputs.append(edge_feat) + + # can concatenate all 3 if updated in hls4ml, for now; do it pairwise + # x = Concatenate()([inputs_cont] + embeddings) + emb_concat = Concatenate()(embeddings) + x = Concatenate()([inputs_cont, emb_concat]) + + N = number_of_pupcandis + P = n_features+n_features_cat + Nr = N*(N-1) # number of relations (edges) + + x = BatchNormalization()(x) + + # Swap axes of input data (batch,nodes,features) -> (batch,features,nodes) + x = Permute((2, 1), input_shape=x.shape[1:])(x) + + # Marshaling function + ORr = Dense(Nr, use_bias=False, trainable=False, name='tmul_{}_1'.format(name))(x) # Receiving adjacency matrix + ORs = Dense(Nr, use_bias=False, trainable=False, name='tmul_{}_2'.format(name))(x) # Sending adjacency matrix + node_feat = Concatenate(axis=1)([ORr, ORs]) # Concatenates Or and Os ( no relations features Ra matrix ) + # Outputis new array = [batch, 2x features, edges] + + # Edges MLP + h = Permute((2, 1), input_shape=node_feat.shape[1:])(node_feat) + edge_units = [64, 32, 16] + n_edge_dense_layers = len(edge_units) + if compute_ef == 1: + h = Concatenate(axis=2, name='concatenate_edge')([h, edge_feat]) + for i_dense in range(n_edge_dense_layers): + h = Dense(edge_units[i_dense], activation='linear', kernel_initializer='lecun_uniform')(h) + h = BatchNormalization(momentum=0.95)(h) + h = Activation(activation=activation)(h) + out_e = h + + # Transpose output and permutes columns 1&2 + out_e = Permute((2, 1))(out_e) + + # Multiply edges MLP output by receiver nodes matrix Rr + out_e = Dense(N, use_bias=False, trainable=False, name='tmul_{}_3'.format(name))(out_e) + + # Nodes MLP (takes as inputs node features and embeding from edges MLP) + inp_n = Concatenate(axis=1)([x, out_e]) + + # Transpose input and permutes columns 1&2 + h = Permute((2, 1), input_shape=inp_n.shape[1:])(inp_n) + + # Nodes MLP + for i_dense in range(n_dense_layers): + h = Dense(units[i_dense], activation='linear', kernel_initializer='lecun_uniform')(h) + h = BatchNormalization(momentum=0.95)(h) + h = Activation(activation=activation)(h) + w = Dense(1, name='met_weight', activation='linear', kernel_initializer=initializers.VarianceScaling(scale=0.02))(h) + w = BatchNormalization(trainable=False, name='met_weight_minus_one', epsilon=False)(w) + x = Multiply()([w, pxpy]) + outputs = GlobalAveragePooling1D(name='output')(x) + + keras_model = Model(inputs=inputs, outputs=outputs) + + keras_model.get_layer('met_weight_minus_one').set_weights([np.array([1.]), np.array([-1.]), np.array([0.]), np.array([1.])]) + + # Create a fully connected adjacency matrix + Rs, Rr = assign_matrices(N, Nr) + keras_model.get_layer('tmul_{}_1'.format(name)).set_weights([Rr]) + keras_model.get_layer('tmul_{}_2'.format(name)).set_weights([Rs]) + keras_model.get_layer('tmul_{}_3'.format(name)).set_weights([np.transpose(Rr)]) + + return keras_model diff --git a/train.py b/train.py index b94cc6547..9ef68a540 100644 --- a/train.py +++ b/train.py @@ -19,6 +19,7 @@ import tqdm import h5py from glob import glob +import itertools # Import custom modules @@ -29,10 +30,53 @@ from loss import custom_loss from DataGenerator import DataGenerator +import matplotlib.pyplot as plt +import mplhep as hep + + +def MakeEdgeHist(edge_feat, xname, outputname, nbins=1000, density=False, yname="# of edges"): + plt.style.use(hep.style.CMS) + plt.figure(figsize=(10, 8)) + plt.hist(edge_feat, bins=nbins, density=density, histtype='step', facecolor='k', label='Truth') + plt.xlabel(xname) + plt.ylabel(yname) + plt.savefig(outputname) + plt.close() + + +def deltaR_calc(eta1, phi1, eta2, phi2): + """ calculate deltaR """ + dphi = (phi1-phi2) + gt_pi_idx = (dphi > np.pi) + lt_pi_idx = (dphi < -np.pi) + dphi[gt_pi_idx] -= 2*np.pi + dphi[lt_pi_idx] += 2*np.pi + deta = eta1-eta2 + return np.hypot(deta, dphi) + + +def kT_calc(pti, ptj, dR): + min_pt = np.minimum(pti, ptj) + kT = min_pt * dR + return kT + + +def z_calc(pti, ptj): + epsilon = 1.0e-12 + min_pt = np.minimum(pti, ptj) + z = min_pt/(pti + ptj + epsilon) + return z + + +def mass2_calc(pi, pj): + pij = pi + pj + m2 = pij[:, :, 0]**2 - pij[:, :, 1]**2 - pij[:, :, 2]**2 - pij[:, :, 3]**2 + return m2 + def get_callbacks(path_out, sample_size, batch_size): # early stopping callback - early_stopping = EarlyStopping(monitor='val_loss', patience=20, verbose=1, restore_best_weights=False) + early_stopping = EarlyStopping(monitor='val_loss', patience=40, verbose=1, restore_best_weights=False) csv_logger = CSVLogger(f'{path_out}loss_history.log') @@ -75,18 +119,21 @@ def test(Yr_test, predict_test, PUPPI_pt, path_out): def train_dataGenerator(args): # general setup - maxNPF = 100 + maxNPF = args.maxNPF n_features_pf = 6 n_features_pf_cat = 2 normFac = 1. epochs = args.epochs - batch_size = 1024 + batch_size = args.batch_size preprocessed = True t_mode = args.mode inputPath = args.input path_out = args.output quantized = args.quantized + model = args.model units = list(map(int, args.units)) + compute_ef = args.compute_edge_feat + edge_list = args.edge_features # separate files into training, validation, and testing filesList = glob(os.path.join(inputPath, '*.root')) @@ -101,23 +148,41 @@ def train_dataGenerator(args): valid_filesList = filesList[train_nfiles: train_nfiles+valid_nfiles] test_filesList = filesList[train_nfiles+valid_nfiles:test_nfiles+train_nfiles+valid_nfiles] - # set up data generators; they perform h5 conversion if necessary and load in data batch by batch - trainGenerator = DataGenerator(list_files=train_filesList, batch_size=batch_size) - validGenerator = DataGenerator(list_files=valid_filesList, batch_size=batch_size) - testGenerator = DataGenerator(list_files=test_filesList, batch_size=batch_size) - Xr_train, Yr_train = trainGenerator[0] # this apparenly calls all the attributes, so that we can get the correct input dimensions (train_generator.emb_input_dim) + if compute_ef == 1: + + # set up data generators; they perform h5 conversion if necessary and load in data batch by batch + trainGenerator = DataGenerator(list_files=train_filesList, batch_size=batch_size, maxNPF=maxNPF, compute_ef=1, edge_list=edge_list) + validGenerator = DataGenerator(list_files=valid_filesList, batch_size=batch_size, maxNPF=maxNPF, compute_ef=1, edge_list=edge_list) + testGenerator = DataGenerator(list_files=test_filesList, batch_size=batch_size, maxNPF=maxNPF, compute_ef=1, edge_list=edge_list) + Xr_train, Yr_train = trainGenerator[0] # this apparenly calls all the attributes, so that we can get the correct input dimensions (train_generator.emb_input_dim) + + else: + trainGenerator = DataGenerator(list_files=train_filesList, batch_size=batch_size) + validGenerator = DataGenerator(list_files=valid_filesList, batch_size=batch_size) + testGenerator = DataGenerator(list_files=test_filesList, batch_size=batch_size) + Xr_train, Yr_train = trainGenerator[0] # this apparenly calls all the attributes, so that we can get the correct input dimensions (train_generator.emb_input_dim) # Load training model if quantized is None: - keras_model = dense_embedding(n_features=n_features_pf, - emb_out_dim=2, - n_features_cat=n_features_pf_cat, - activation='tanh', - embedding_input_dim=trainGenerator.emb_input_dim, - number_of_pupcandis=maxNPF, - t_mode=t_mode, - with_bias=False, - units=units) + if model == 'dense_embedding': + keras_model = dense_embedding(n_features=n_features_pf, + emb_out_dim=2, + n_features_cat=n_features_pf_cat, + activation='tanh', + embedding_input_dim=trainGenerator.emb_input_dim, + number_of_pupcandis=maxNPF, + t_mode=t_mode, + with_bias=False, + units=units) + elif model == 'graph_embedding': + keras_model = graph_embedding(n_features=n_features_pf, + emb_out_dim=2, + n_features_cat=n_features_pf_cat, + activation='tanh', + embedding_input_dim=trainGenerator.emb_input_dim, + number_of_pupcandis=maxNPF, + units=units, compute_ef=compute_ef, edge_list=edge_list) + else: logit_total_bits = int(quantized[0]) logit_int_bits = int(quantized[1]) @@ -185,18 +250,21 @@ def train_dataGenerator(args): def train_loadAllData(args): # general setup - maxNPF = 100 + maxNPF = args.maxNPF n_features_pf = 6 n_features_pf_cat = 2 normFac = 1. epochs = args.epochs - batch_size = 1024 + batch_size = args.batch_size preprocessed = True t_mode = args.mode inputPath = args.input path_out = args.output quantized = args.quantized units = list(map(int, args.units)) + compute_ef = args.compute_edge_feat + model = args.model + edge_list = args.edge_features # Read inputs # convert root files to h5 and store in same location @@ -211,18 +279,74 @@ def train_loadAllData(args): # For now I keep train.py used: selection from a list of indicies Xorg, Y = read_input(h5files) + if maxNPF < 100: + order = Xorg[:, :, 0].argsort(axis=1)[:, ::-1] + shape = np.shape(Xorg) + for x in range(shape[0]): + Xorg[x, :, :] = Xorg[x, order[x], :] + Xorg = Xorg[:, 0:maxNPF, :] Y = Y / -normFac + N = maxNPF + Nr = N*(N-1) + + receiver_sender_list = [i for i in itertools.product(range(N), range(N)) if i[0] != i[1]] Xi, Xp, Xc1, Xc2 = preProcessing(Xorg, normFac) - Xc = [Xc1, Xc2] - emb_input_dim = { - i: int(np.max(Xc[i][0:1000])) + 1 for i in range(n_features_pf_cat) - } + if compute_ef == 1: + eta = Xi[:, :, 1] + phi = Xi[:, :, 2] + pt = Xi[:, :, 0] + if ('m2' in edge_list): + px = Xp[:, :, 0] + py = Xp[:, :, 1] + pz = pt*np.sinh(eta) + energy = np.sqrt(px**2 + py**2 + pz**2) + p4 = np.stack((energy, px, py, pz), axis=-1) + receiver_sender_list = [i for i in itertools.product(range(N), range(N)) if i[0] != i[1]] + edge_idx = np.array(receiver_sender_list) + edge_stack = [] + if ('dR' in edge_list) or ('kT' in edge_list): + eta1 = eta[:, edge_idx[:, 0]] + phi1 = phi[:, edge_idx[:, 0]] + eta2 = eta[:, edge_idx[:, 1]] + phi2 = phi[:, edge_idx[:, 1]] + dR = deltaR_calc(eta1, phi1, eta2, phi2) + edge_stack.append(dR) + if ('kT' in edge_list) or ('z' in edge_list): + pt1 = pt[:, edge_idx[:, 0]] + pt2 = pt[:, edge_idx[:, 1]] + if ('kT' in edge_list): + kT = kT_calc(pt1, pt2, dR) + edge_stack.append(kT) + if ('z' in edge_list): + z = z_calc(pt1, pt2) + edge_stack.append(z) + if ('m2' in edge_list): + p1 = p4[:, edge_idx[:, 0], :] + p2 = p4[:, edge_idx[:, 1], :] + m2 = mass2_calc(p1, p2) + edge_stack.append(m2) + ef = np.stack(edge_stack, axis=-1) + Xc = [Xc1, Xc2] + # dimension parameter for keras model + emb_input_dim = {i: int(np.max(Xc[i][0:1000])) + 1 for i in range(n_features_pf_cat)} + # Prepare training/val data + Xc = [Xc1, Xc2] + Yr = Y + Xr = [Xi, Xp] + Xc + [ef] + + else: + Xi, Xp, Xc1, Xc2 = preProcessing(Xorg, normFac) + Xc = [Xc1, Xc2] - # Prepare training/val data - Yr = Y - Xr = [Xi, Xp] + Xc + emb_input_dim = { + i: int(np.max(Xc[i][0:1000])) + 1 for i in range(n_features_pf_cat) + } + + # Prepare training/val data + Yr = Y + Xr = [Xi, Xp] + Xc indices = np.array([i for i in range(len(Yr))]) indices_train, indices_test = train_test_split(indices, test_size=1./7., random_state=7) @@ -238,15 +362,28 @@ def train_loadAllData(args): # Load training model if quantized is None: - keras_model = dense_embedding(n_features=n_features_pf, - emb_out_dim=2, - n_features_cat=n_features_pf_cat, - activation='tanh', - embedding_input_dim=emb_input_dim, - number_of_pupcandis=maxNPF, - t_mode=t_mode, - with_bias=False, - units=units) + if model == 'dense_embedding': + keras_model = dense_embedding(n_features=n_features_pf, + emb_out_dim=2, + n_features_cat=n_features_pf_cat, + activation='tanh', + embedding_input_dim=emb_input_dim, + number_of_pupcandis=maxNPF, + t_mode=t_mode, + with_bias=False, + units=units) + + elif model == 'graph_embedding': + keras_model = graph_embedding(n_features=n_features_pf, + emb_out_dim=2, + n_features_cat=n_features_pf_cat, + activation='tanh', + embedding_input_dim=emb_input_dim, + number_of_pupcandis=maxNPF, + units=units, + compute_ef=compute_ef, + edge_list=edge_list) + else: logit_total_bits = int(quantized[0]) logit_int_bits = int(quantized[1]) @@ -325,9 +462,14 @@ def main(): parser.add_argument('--input', action='store', type=str, required=True, help='designate input file path') parser.add_argument('--output', action='store', type=str, required=True, help='designate output file path') parser.add_argument('--mode', action='store', type=int, required=True, choices=[0, 1], help='0 for L1MET, 1 for DeepMET') - parser.add_argument('--epochs', action='store', type=int, required=False, default=100) + parser.add_argument('--epochs', action='store', type=int, required=False, default=100, help='number of epochs to train for') + parser.add_argument('--batch-size', action='store', type=int, required=False, default=1024, help='batch size') parser.add_argument('--quantized', action='store', required=False, nargs='+', help='optional argument: flag for quantized model and specify [total bits] [int bits]; empty for normal model') parser.add_argument('--units', action='store', required=False, nargs='+', help='optional argument: specify number of units in each layer (also sets the number of layers)') + parser.add_argument('--model', action='store', required=False, choices=['dense_embedding', 'graph_embedding', 'node_select'], default='dense_embedding', help='optional argument: model') + parser.add_argument('--compute-edge-feat', action='store', type=int, required=False, choices=[0, 1], default=0, help='0 for no edge features, 1 to include edge features') + parser.add_argument('--maxNPF', action='store', type=int, required=False, default=100, help='maximum number of PUPPI candidates') + parser.add_argument('--edge-features', action='store', required=False, nargs='+', help='which edge features to use (i.e. dR, kT, z, m2)') args = parser.parse_args() workflowType = args.workflowType From eb347a4c83d023e65b50d4d7888960082c7e2a78 Mon Sep 17 00:00:00 2001 From: Jonathan Choi Date: Tue, 1 Mar 2022 08:40:56 -0800 Subject: [PATCH 6/8] Update Dockerfile with coffea on pip install list --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 44650f559..e9f2a2181 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,6 +12,7 @@ USER ${NB_UID} # Install Tensorflow RUN pip install --quiet --no-cache-dir \ + coffea \ uproot \ awkward \ uproot \ From 73ac9da04fd0a00760f2cef18c75c9f5b5daaa38 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Wed, 31 Aug 2022 17:00:54 -0700 Subject: [PATCH 7/8] update docker file --- Dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index e9f2a2181..942b2a797 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,9 @@ LABEL maintainer="Javier Duarte " USER root -RUN apt-get update && apt-get -y install openssh-client +RUN apt-get update \ + && apt-get -yq --no-install-recommends install openssh-client vim emacs \ + && sudo apt-get clean && sudo rm -rf /var/lib/apt/lists/* USER ${NB_UID} @@ -21,5 +23,5 @@ RUN pip install --quiet --no-cache-dir \ mplhep \ autopep8 \ git+https://github.com/google/qkeras#egg=qkeras \ - git+https://github.com/jmduarte/hls4ml@l1metml#egg=hls4ml[profiling] + git+https://github.com/jmduarte/hls4ml@split_pointwise_conv_by_rf#egg=hls4ml[profiling] From 32c9d701c8a2bf67def20121d71c8e66b053ef37 Mon Sep 17 00:00:00 2001 From: simon-poon <93788837+simon-poon@users.noreply.github.com> Date: Wed, 1 May 2024 07:22:07 -0700 Subject: [PATCH 8/8] Trained baseline models and hls4ml conversion script (#33) * Add files via upload * convert script * Delete models/baseline_DeepMET directory * Add files via upload * update * Update test.yml * Update environment.yml * update * Add files via upload * update * update custom loss with normFac * use custom loss wrapper * just mv a model * mv file * update convert script * Update environment.yml * Delete models/baseline_DeepMET_quantized directory * Add files via upload --------- Co-authored-by: Javier Duarte --- .github/workflows/test.yml | 9 +- convert_full_model.py | 165 ++++++++++++++++++ environment.yml | 4 +- loss.py | 115 ++++++------ models/baseline_DeepMET/trained_DeepMET.h5 | Bin 0 -> 53256 bytes .../trained_DeepMET_KerasV3/keras_metadata.pb | 24 +++ .../trained_DeepMET_KerasV3/saved_model.pb | Bin 0 -> 333224 bytes .../variables/variables.data-00000-of-00001 | Bin 0 -> 24943 bytes .../variables/variables.index | Bin 0 -> 3518 bytes .../trained_quantized_DeepMET_normfac100.h5 | Bin 0 -> 97776 bytes .../trained_quantized_DeepMET_normfac1000.h5 | Bin 0 -> 97776 bytes .../keras_metadata.pb | 24 +++ .../saved_model.pb | Bin 0 -> 459808 bytes .../variables/variables.data-00000-of-00001 | Bin 0 -> 25456 bytes .../variables/variables.index | Bin 0 -> 3518 bytes .../keras_metadata.pb | 24 +++ .../saved_model.pb | Bin 0 -> 459808 bytes .../variables/variables.data-00000-of-00001 | Bin 0 -> 25456 bytes .../variables/variables.index | Bin 0 -> 3518 bytes train.py | 4 +- utils.py | 6 +- 21 files changed, 311 insertions(+), 64 deletions(-) create mode 100644 convert_full_model.py create mode 100644 models/baseline_DeepMET/trained_DeepMET.h5 create mode 100644 models/baseline_DeepMET/trained_DeepMET_KerasV3/keras_metadata.pb create mode 100644 models/baseline_DeepMET/trained_DeepMET_KerasV3/saved_model.pb create mode 100644 models/baseline_DeepMET/trained_DeepMET_KerasV3/variables/variables.data-00000-of-00001 create mode 100644 models/baseline_DeepMET/trained_DeepMET_KerasV3/variables/variables.index create mode 100644 models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac100.h5 create mode 100644 models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac1000.h5 create mode 100644 models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac1000_KerasV3/keras_metadata.pb create mode 100644 models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac1000_KerasV3/saved_model.pb create mode 100644 models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac1000_KerasV3/variables/variables.data-00000-of-00001 create mode 100644 models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac1000_KerasV3/variables/variables.index create mode 100644 models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac100_KerasV3/keras_metadata.pb create mode 100644 models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac100_KerasV3/saved_model.pb create mode 100644 models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac100_KerasV3/variables/variables.data-00000-of-00001 create mode 100644 models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac100_KerasV3/variables/variables.index diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8567af931..a1b556cb5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,11 +5,14 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 # Install dependencies - name: Setup Miniconda - uses: conda-incubator/setup-miniconda@v2 + uses: conda-incubator/setup-miniconda@v3 with: + miniforge-version: latest + use-mamba: true + channels: conda-forge activate-environment: l1metml environment-file: environment.yml python-version: 3.9 @@ -29,4 +32,4 @@ jobs: - name: Run autopep8 shell: bash -l {0} run: | - autopep8 --in-place --aggressive --aggressive --recursive . --exit-code \ No newline at end of file + autopep8 --in-place --aggressive --aggressive --recursive . --exit-code diff --git a/convert_full_model.py b/convert_full_model.py new file mode 100644 index 000000000..f54971a20 --- /dev/null +++ b/convert_full_model.py @@ -0,0 +1,165 @@ +import tensorflow +from models import dense_embedding +from tensorflow.keras.layers import Input, Concatenate +from tensorflow.keras.models import Model +import numpy as np +import hls4ml +import pandas as pd +from qkeras.utils import _add_supported_quantized_objects +from models import dense_embedding, dense_embedding_quantized +from utils import preProcessing +import h5py +import scipy + +co = {} +_add_supported_quantized_objects(co) + + +def print_dict(d, indent=0): + align = 20 + for key, value in d.items(): + print(' ' * indent + str(key), end='') + if isinstance(value, dict): + print() + print_dict(value, indent+1) + else: + print(':' + ' ' * (20 - len(key) - 2 * indent) + str(value)) + + +# load full model: +model_name = 'trained_DeepMET' +# model_name = 'trained_quantized_DeepMET' +# model_name = 'trained_quantized_DeepMET_normfac1000' +model = tensorflow.keras.models.load_model(f'models/baseline_DeepMET{"_quantized" if "quantized" in model_name else ""}/{model_name}.h5', compile=False, custom_objects=co) + +reuse_factor = 1 +precision = 'ap_fixed<32,16>' +io_type = 'io_parallel' +strategy = 'Latency' +output_dir = 'hls_output_{}_{}_{}_rf{}_{}'.format(model_name ,io_type, strategy, reuse_factor, precision) +batch_size = 1 +synth = False +trace = True +normFac = 1 + +# check everthing works +model.summary() +model.save('{}/model.h5'.format(output_dir)) + +config = hls4ml.utils.config_from_keras_model(model, + granularity='name', + default_reuse_factor=reuse_factor, + default_precision=precision) +config['Model']['Strategy'] = strategy +for name in config['LayerName'].keys(): + config['LayerName'][name]['Trace'] = trace +config['LayerName']['input_cat0']['Precision']['result'] = 'ap_uint<4>' +config['LayerName']['input_cat1']['Precision']['result'] = 'ap_uint<4>' +# config['LayerName']['input_cont']['Precision']['result'] = 'ap_fixed<20,10>' +#if 'q_dense' in config['LayerName']: +# config['LayerName']['q_dense']['Precision']['accum'] = 'ap_fixed<32,16>' +# config['LayerName']['q_dense']['Precision']['weight'] = 'ap_fixed<32,16>' +# config['LayerName']['q_dense']['Precision']['bias'] = 'ap_fixed<32,16>' +# config['LayerName']['q_dense_1']['Precision']['accum'] = 'ap_fixed<32,16>' +# config['LayerName']['q_dense_1']['Precision']['weight'] = 'ap_fixed<32,16>' +# config['LayerName']['q_dense_1']['Precision']['bias'] = 'ap_fixed<32,16>' +config['LayerName']['multiply']['n_elem'] = 100 +config['LayerName']['output']['n_filt'] = 2 +# skip optimize_pointwise_conv +# config['SkipOptimizers'] = ['optimize_pointwise_conv'] +# for layer in config['LayerName'].keys(): +# config['LayerName'][layer]['Trace'] = True + +print("-----------------------------------") +print_dict(config) +print("-----------------------------------") +hls_model = hls4ml.converters.convert_from_keras_model(model, + hls_config=config, + io_type=io_type, + output_dir=output_dir, + part='xcvu13p-flga2577-2-e', + clock_period=5, + project_name='L1METML_v1', +) +hls_model.compile() + +hls4ml.utils.plot_model(hls_model, show_shapes=True, show_precision=True, to_file='{}/model_hls4ml.png'.format(output_dir)) + +if synth: + hls_model.build(synth=synth) + hls4ml.report.read_vivado_report(output_dir) + +f = h5py.File('data/test_data.h5') +# 1000 test events is good enough +X = f['X'][:1000] +y = -f['Y'][:1000] + +# preprocessing +X_pre = list(preProcessing(X, normFac=normFac)) +X_pre = [np.ascontiguousarray(x) for x in X_pre] + +y_pred = model.predict(X_pre) +y_hls = hls_model.predict(X_pre) + +met = np.hypot(y[:, 0], y[:, 1]) +met_pred = np.hypot(y_pred[:, 0], y_pred[:, 1]) * normFac +met_hls = np.hypot(y_hls[:, 0], y_hls[:, 1]) * normFac +met_pup_x = np.sum(X[:, :, 1], axis=-1) +met_pup_y = np.sum(X[:, :, 2], axis=-1) +met_pup = np.hypot(met_pup_x, met_pup_y) + +import seaborn +import pandas as pd +import matplotlib.pyplot as plt + +df = pd.DataFrame.from_dict({'Gen MET': met, 'PUPPI MET': met_pup, 'QKeras MET': met_pred, 'hls4ml MET': met_hls}) +plt.figure() +seaborn.pairplot(df, corner=True) +plt.savefig(f'{output_dir}/profiling_MET.png', dpi=300) + +df = pd.DataFrame.from_dict({'Gen MET x': y[:, 0], 'PUPPI MET x': met_pup_x, 'QKeras MET x': y_pred[:, 0], 'hls4ml MET x': y_hls[:, 0]}) +plt.figure() +seaborn.pairplot(df, corner=True) +plt.savefig(f'{output_dir}/profiling_MET_x.png', dpi=300) + +df = pd.DataFrame.from_dict({'Gen MET y': y[:, 1], 'PUPPI MET y': met_pup_y, 'QKeras MET y': y_pred[:, 1], 'hls4ml MET y': y_hls[:, 1]}) +plt.figure() +seaborn.pairplot(df, corner=True) +plt.savefig(f'{output_dir}/profiling_MET_y.png', dpi=300) + +response_pup = met_pup / met +response_pred = met_pred / met +response_hls = met_hls / met +bins = np.linspace(0, 2, 25) +plt.figure(figsize=(12, 5)) +plt.subplot(1, 3, 1) +plt.hist(response_pup, bins=bins, label=f'PUPPI, median={np.median(response_pup):0.2f}, IQR={scipy.stats.iqr(response_pup):0.2f}') +plt.legend() +plt.xlabel("MET response $\hat{y}/y$") +plt.ylabel("Events") +plt.subplot(1, 3, 2) +plt.hist(response_pred, bins=bins, label=f'QKeras, median={np.median(response_pred):0.2f}, IQR={scipy.stats.iqr(response_pred):0.2f}') +plt.legend() +plt.xlabel("MET response $\hat{y}/y$") +plt.ylabel("Events") +plt.subplot(1, 3, 3) +plt.hist(response_hls, bins=bins, label=f'hls4ml, median={np.median(response_hls):0.2f}, IQR={scipy.stats.iqr(response_hls):0.2f}') +plt.legend() +plt.xlabel("MET response $\hat{y}/y$") +plt.ylabel("Events") +plt.tight_layout() +plt.savefig(f"{output_dir}/response_MET.png", dpi=300) + +y_hls, hls4ml_trace = hls_model.trace(X_pre) +keras_trace = hls4ml.model.profiling.get_ymodel_keras(model, X_pre) + +for layer in hls4ml_trace.keys(): + plt.figure() + if layer not in keras_trace: continue + plt.scatter(hls4ml_trace[layer].flatten(), keras_trace[layer].flatten(), s=0.2) + min_x = min(np.amin(hls4ml_trace[layer]), np.amin(keras_trace[layer])) + max_x = max(np.amax(hls4ml_trace[layer]), np.amax(keras_trace[layer])) + plt.plot([min_x, max_x], [min_x, max_x], c='gray') + plt.xlabel(f'hls4ml {layer}') + plt.ylabel(f'QKeras {layer}') + plt.savefig(f'{output_dir}/profiling_{layer}.png', dpi=300) diff --git a/environment.yml b/environment.yml index 60e7a38be..2cf31ca74 100644 --- a/environment.yml +++ b/environment.yml @@ -7,7 +7,7 @@ dependencies: - python=3.9 - pytables - uproot - - tensorflow=2.5.0 + - tensorflow=2.11.1 - pandas - h5py - tqdm @@ -18,4 +18,4 @@ dependencies: - setGPU - mplhep - git+https://github.com/google/qkeras#egg=qkeras - - git+https://github.com/jmduarte/hls4ml@l1metml#egg=hls4ml[profiling] + - git+https://github.com/jmduarte/hls4ml@l1metml_v1#egg=hls4ml[profiling] diff --git a/loss.py b/loss.py index 46f7f4b4f..581a96ae8 100644 --- a/loss.py +++ b/loss.py @@ -1,58 +1,63 @@ -def custom_loss(y_true, y_pred): +def custom_loss_wrapper(normFac=1): ''' - cutmoized loss function to improve the recoil response, + customized loss function to improve the recoil response, by balancing the response above one and below one ''' - import tensorflow.keras.backend as K - import tensorflow as tf - - px_truth = K.flatten(y_true[:, 0]) - py_truth = K.flatten(y_true[:, 1]) - px_pred = K.flatten(y_pred[:, 0]) - py_pred = K.flatten(y_pred[:, 1]) - - pt_truth = K.sqrt(px_truth*px_truth + py_truth*py_truth) - - #px_truth1 = px_truth / pt_truth - #py_truth1 = py_truth / pt_truth - - # using absolute response - # upar_pred = (px_truth1 * px_pred + py_truth1 * py_pred)/pt_truth - upar_pred = K.sqrt(px_pred * px_pred + py_pred * py_pred) - pt_truth - pt_cut = pt_truth > 0. - upar_pred = tf.boolean_mask(upar_pred, pt_cut) - pt_truth_filtered = tf.boolean_mask(pt_truth, pt_cut) - - #filter_bin0 = pt_truth_filtered < 50. - filter_bin0 = tf.logical_and(pt_truth_filtered > 50., pt_truth_filtered < 100.) - filter_bin1 = tf.logical_and(pt_truth_filtered > 100., pt_truth_filtered < 200.) - filter_bin2 = tf.logical_and(pt_truth_filtered > 200., pt_truth_filtered < 300.) - filter_bin3 = tf.logical_and(pt_truth_filtered > 300., pt_truth_filtered < 400.) - filter_bin4 = pt_truth_filtered > 400. - - upar_pred_pos_bin0 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin0, upar_pred > 0.)) - upar_pred_neg_bin0 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin0, upar_pred < 0.)) - upar_pred_pos_bin1 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin1, upar_pred > 0.)) - upar_pred_neg_bin1 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin1, upar_pred < 0.)) - upar_pred_pos_bin2 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin2, upar_pred > 0.)) - upar_pred_neg_bin2 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin2, upar_pred < 0.)) - upar_pred_pos_bin3 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin3, upar_pred > 0.)) - upar_pred_neg_bin3 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin3, upar_pred < 0.)) - upar_pred_pos_bin4 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin4, upar_pred > 0.)) - upar_pred_neg_bin4 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin4, upar_pred < 0.)) - #upar_pred_pos_bin5 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin5, upar_pred > 0.)) - #upar_pred_neg_bin5 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin5, upar_pred < 0.)) - norm = tf.reduce_sum(pt_truth_filtered) - dev = tf.abs(tf.reduce_sum(upar_pred_pos_bin0) + tf.reduce_sum(upar_pred_neg_bin0)) - dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin1) + tf.reduce_sum(upar_pred_neg_bin1)) - dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin2) + tf.reduce_sum(upar_pred_neg_bin2)) - dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin3) + tf.reduce_sum(upar_pred_neg_bin3)) - dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin4) + tf.reduce_sum(upar_pred_neg_bin4)) - #dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin5) + tf.reduce_sum(upar_pred_neg_bin5)) - dev /= norm - - loss = 0.5*K.mean((px_pred - px_truth)**2 + (py_pred - py_truth)**2) - - #loss += 200.*dev - loss += 5000.*dev - return loss + + + def custom_loss(y_true, y_pred): + import tensorflow.keras.backend as K + import tensorflow as tf + + px_truth = K.flatten(y_true[:, 0]) + py_truth = K.flatten(y_true[:, 1]) + px_pred = K.flatten(y_pred[:, 0]) + py_pred = K.flatten(y_pred[:, 1]) + + pt_truth = K.sqrt(px_truth*px_truth + py_truth*py_truth) + + #px_truth1 = px_truth / pt_truth + #py_truth1 = py_truth / pt_truth + + # using absolute response + # upar_pred = (px_truth1 * px_pred + py_truth1 * py_pred)/pt_truth + upar_pred = K.sqrt(px_pred * px_pred + py_pred * py_pred) - pt_truth + pt_cut = pt_truth > 0. + upar_pred = tf.boolean_mask(upar_pred, pt_cut) + pt_truth_filtered = tf.boolean_mask(pt_truth, pt_cut) + + #filter_bin0 = pt_truth_filtered < 50./normFac + filter_bin0 = tf.logical_and(pt_truth_filtered > 50./normFac, pt_truth_filtered < 100./normFac) + filter_bin1 = tf.logical_and(pt_truth_filtered > 100./normFac, pt_truth_filtered < 200./normFac) + filter_bin2 = tf.logical_and(pt_truth_filtered > 200./normFac, pt_truth_filtered < 300./normFac) + filter_bin3 = tf.logical_and(pt_truth_filtered > 300./normFac, pt_truth_filtered < 400./normFac) + filter_bin4 = pt_truth_filtered > 400./normFac + + upar_pred_pos_bin0 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin0, upar_pred > 0.)) + upar_pred_neg_bin0 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin0, upar_pred < 0.)) + upar_pred_pos_bin1 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin1, upar_pred > 0.)) + upar_pred_neg_bin1 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin1, upar_pred < 0.)) + upar_pred_pos_bin2 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin2, upar_pred > 0.)) + upar_pred_neg_bin2 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin2, upar_pred < 0.)) + upar_pred_pos_bin3 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin3, upar_pred > 0.)) + upar_pred_neg_bin3 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin3, upar_pred < 0.)) + upar_pred_pos_bin4 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin4, upar_pred > 0.)) + upar_pred_neg_bin4 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin4, upar_pred < 0.)) + #upar_pred_pos_bin5 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin5, upar_pred > 0.)) + #upar_pred_neg_bin5 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin5, upar_pred < 0.)) + norm = tf.reduce_sum(pt_truth_filtered) + dev = tf.abs(tf.reduce_sum(upar_pred_pos_bin0) + tf.reduce_sum(upar_pred_neg_bin0)) + dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin1) + tf.reduce_sum(upar_pred_neg_bin1)) + dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin2) + tf.reduce_sum(upar_pred_neg_bin2)) + dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin3) + tf.reduce_sum(upar_pred_neg_bin3)) + dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin4) + tf.reduce_sum(upar_pred_neg_bin4)) + #dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin5) + tf.reduce_sum(upar_pred_neg_bin5)) + dev /= norm + + loss = 0.5*normFac**2*K.mean((px_pred - px_truth)**2 + (py_pred - py_truth)**2) + + #loss += 200.*dev + loss += 5000.*dev + return loss + + return custom_loss diff --git a/models/baseline_DeepMET/trained_DeepMET.h5 b/models/baseline_DeepMET/trained_DeepMET.h5 new file mode 100644 index 0000000000000000000000000000000000000000..c1a4c65132e35cd55d8c9f5e59d9f453c5d36a16 GIT binary patch literal 53256 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 literal 0 HcmV?d00001 diff --git a/models/baseline_DeepMET/trained_DeepMET_KerasV3/variables/variables.data-00000-of-00001 b/models/baseline_DeepMET/trained_DeepMET_KerasV3/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000000000000000000000000000000000000..82828f084f40709d51fd7a62c89e9ddce9bbabc3 GIT binary patch literal 24943 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

)B-E21?Z4kh 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 literal 0 HcmV?d00001 diff --git a/models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac1000_KerasV3/variables/variables.data-00000-of-00001 b/models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac1000_KerasV3/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000000000000000000000000000000000000..77bee57a33f4328e9a0679c99c514d969c2b7245 GIT binary patch literal 25456 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 literal 0 HcmV?d00001 diff --git a/models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac100_KerasV3/keras_metadata.pb b/models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac100_KerasV3/keras_metadata.pb new file mode 100644 index 000000000..381134e6a --- /dev/null +++ b/models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac100_KerasV3/keras_metadata.pb @@ -0,0 +1,24 @@ + +‹Êroot"_tf_keras_network*èÉ{"name": "model", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "Functional", "config": {"name": "model", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 100]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_cat0"}, "name": "input_cat0", "inbound_nodes": []}, {"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 100]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_cat1"}, "name": "input_cat1", "inbound_nodes": []}, {"class_name": "Embedding", "config": {"name": "embedding0", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, null]}, "dtype": "float32", "input_dim": 6, "output_dim": 2, "embeddings_initializer": {"class_name": "RandomNormal", "config": {"mean": 0, "stddev": 0.2, "seed": null}}, "embeddings_regularizer": null, "activity_regularizer": null, "embeddings_constraint": null, "mask_zero": false, "input_length": null}, "name": "embedding0", "inbound_nodes": [[["input_cat0", 0, 0, {}]]]}, {"class_name": "Embedding", "config": {"name": "embedding1", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, null]}, "dtype": "float32", "input_dim": 4, "output_dim": 2, "embeddings_initializer": {"class_name": "RandomNormal", "config": {"mean": 0, "stddev": 0.2, "seed": null}}, "embeddings_regularizer": null, "activity_regularizer": null, "embeddings_constraint": null, "mask_zero": false, "input_length": null}, "name": "embedding1", "inbound_nodes": [[["input_cat1", 0, 0, {}]]]}, {"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 100, 4]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_cont"}, "name": "input_cont", "inbound_nodes": []}, {"class_name": "Concatenate", "config": {"name": "concatenate", "trainable": true, "dtype": "float32", "axis": -1}, "name": "concatenate", "inbound_nodes": [[["embedding0", 0, 0, {}], ["embedding1", 0, 0, {}]]]}, {"class_name": "Concatenate", "config": {"name": "concatenate_1", "trainable": true, "dtype": "float32", "axis": -1}, "name": "concatenate_1", "inbound_nodes": [[["input_cont", 0, 0, {}], ["concatenate", 0, 0, {}]]]}, {"class_name": "QDense", "config": {"name": "q_dense", "trainable": true, "dtype": "float32", "units": 12, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "QInitializer", "config": {"initializer": {"class_name": "LecunUniform", "config": {"seed": null}, "__passive_serialization__": true, "shared_object_id": 10}, "use_scale": true, "quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}}, "shared_object_id": 11}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 12}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 13}, "bias_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 14}, "kernel_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "bias_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "kernel_range": null, "bias_range": null}, "name": "q_dense", "inbound_nodes": [[["concatenate_1", 0, 0, {}]]]}, {"class_name": "BatchNormalization", "config": {"name": "batch_normalization", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.95, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "name": "batch_normalization", "inbound_nodes": [[["q_dense", 0, 0, {}]]]}, {"class_name": "QActivation", "config": {"name": "q_activation", "trainable": true, "dtype": "float32", "activation": {"class_name": "quantized_relu", "config": {"bits": 8, "integer": 2, "use_sigmoid": 0, "negative_slope": 0.0, "use_stochastic_rounding": false, "relu_upper_bound": null, "qnoise_factor": 1.0}, "__passive_serialization__": true, "shared_object_id": 21}}, "name": "q_activation", "inbound_nodes": [[["batch_normalization", 0, 0, {}]]]}, {"class_name": "QDense", "config": {"name": "q_dense_1", "trainable": true, "dtype": "float32", "units": 36, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "QInitializer", "config": {"initializer": {"class_name": "LecunUniform", "config": {"seed": null}, "__passive_serialization__": true, "shared_object_id": 23}, "use_scale": true, "quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}}, "shared_object_id": 24}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 25}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 26}, "bias_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 27}, "kernel_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "bias_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "kernel_range": null, "bias_range": null}, "name": "q_dense_1", "inbound_nodes": [[["q_activation", 0, 0, {}]]]}, {"class_name": "BatchNormalization", "config": {"name": "batch_normalization_1", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.95, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "name": "batch_normalization_1", "inbound_nodes": [[["q_dense_1", 0, 0, {}]]]}, {"class_name": "QActivation", "config": {"name": "q_activation_1", "trainable": true, "dtype": "float32", "activation": {"class_name": "quantized_relu", "config": {"bits": 8, "integer": 2, "use_sigmoid": 0, "negative_slope": 0.0, "use_stochastic_rounding": false, "relu_upper_bound": null, "qnoise_factor": 1.0}, "__passive_serialization__": true, "shared_object_id": 21}}, "name": "q_activation_1", "inbound_nodes": [[["batch_normalization_1", 0, 0, {}]]]}, {"class_name": "QDense", "config": {"name": "met_weight", "trainable": true, "dtype": "float32", "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "QInitializer", "config": {"initializer": {"class_name": "VarianceScaling", "config": {"scale": 0.02, "mode": "fan_in", "distribution": "truncated_normal", "seed": null}, "__passive_serialization__": true, "shared_object_id": 35}, "use_scale": true, "quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}}, "shared_object_id": 36}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 37}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 38}, "bias_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 39}, "kernel_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "bias_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "kernel_range": null, "bias_range": null}, "name": "met_weight", "inbound_nodes": [[["q_activation_1", 0, 0, {}]]]}, {"class_name": "BatchNormalization", "config": {"name": "met_weight_minus_one", "trainable": false, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": false, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "name": "met_weight_minus_one", "inbound_nodes": [[["met_weight", 0, 0, {}]]]}, {"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 100, 2]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_pxpy"}, "name": "input_pxpy", "inbound_nodes": []}, {"class_name": "Multiply", "config": {"name": "multiply", "trainable": true, "dtype": "float32"}, "name": "multiply", "inbound_nodes": [[["met_weight_minus_one", 0, 0, {}], ["input_pxpy", 0, 0, {}]]]}, {"class_name": "GlobalAveragePooling1D", "config": {"name": "output", "trainable": true, "dtype": "float32", "data_format": "channels_last", "keepdims": false}, "name": "output", "inbound_nodes": [[["multiply", 0, 0, {}]]]}], "input_layers": [["input_cont", 0, 0], ["input_pxpy", 0, 0], ["input_cat0", 0, 0], ["input_cat1", 0, 0]], "output_layers": [["output", 0, 0]]}, "shared_object_id": 49, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 100, 4]}, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}}, {"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 100, 2]}, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}}, {"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 100]}, "ndim": 2, "max_ndim": null, "min_ndim": null, "axes": {}}}, {"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 100]}, "ndim": 2, "max_ndim": null, "min_ndim": null, "axes": {}}}], "build_input_shape": [{"class_name": "TensorShape", "items": [null, 100, 4]}, {"class_name": "TensorShape", "items": [null, 100, 2]}, {"class_name": "TensorShape", "items": [null, 100]}, {"class_name": "TensorShape", "items": [null, 100]}], "is_graph_network": true, "full_save_spec": {"class_name": "__tuple__", "items": [[[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 100, 4]}, "float32", "input_cont"]}, {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 100, 2]}, "float32", "input_pxpy"]}, {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 100]}, "float32", "input_cat0"]}, {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 100]}, "float32", "input_cat1"]}]], {}]}, "save_spec": [{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 100, 4]}, "float32", "input_cont"]}, {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 100, 2]}, "float32", "input_pxpy"]}, {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 100]}, "float32", "input_cat0"]}, {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 100]}, "float32", "input_cat1"]}], "keras_version": "2.8.0", "backend": "tensorflow", "model_config": {"class_name": "Functional", "config": {"name": "model", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 100]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_cat0"}, "name": "input_cat0", "inbound_nodes": [], "shared_object_id": 0}, {"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 100]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_cat1"}, "name": "input_cat1", "inbound_nodes": [], "shared_object_id": 1}, {"class_name": "Embedding", "config": {"name": "embedding0", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, null]}, "dtype": "float32", "input_dim": 6, "output_dim": 2, "embeddings_initializer": {"class_name": "RandomNormal", "config": {"mean": 0, "stddev": 0.2, "seed": null}, "shared_object_id": 2}, "embeddings_regularizer": null, "activity_regularizer": null, "embeddings_constraint": null, "mask_zero": false, "input_length": null}, "name": "embedding0", "inbound_nodes": [[["input_cat0", 0, 0, {}]]], "shared_object_id": 3}, {"class_name": "Embedding", "config": {"name": "embedding1", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, null]}, "dtype": "float32", "input_dim": 4, "output_dim": 2, "embeddings_initializer": {"class_name": "RandomNormal", "config": {"mean": 0, "stddev": 0.2, "seed": null}, "shared_object_id": 4}, "embeddings_regularizer": null, "activity_regularizer": null, "embeddings_constraint": null, "mask_zero": false, "input_length": null}, "name": "embedding1", "inbound_nodes": [[["input_cat1", 0, 0, {}]]], "shared_object_id": 5}, {"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 100, 4]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_cont"}, "name": "input_cont", "inbound_nodes": [], "shared_object_id": 6}, {"class_name": "Concatenate", "config": {"name": "concatenate", "trainable": true, "dtype": "float32", "axis": -1}, "name": "concatenate", "inbound_nodes": [[["embedding0", 0, 0, {}], ["embedding1", 0, 0, {}]]], "shared_object_id": 7}, {"class_name": "Concatenate", "config": {"name": "concatenate_1", "trainable": true, "dtype": "float32", "axis": -1}, "name": "concatenate_1", "inbound_nodes": [[["input_cont", 0, 0, {}], ["concatenate", 0, 0, {}]]], "shared_object_id": 8}, {"class_name": "QDense", "config": {"name": "q_dense", "trainable": true, "dtype": "float32", "units": 12, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "QInitializer", "config": {"initializer": {"class_name": "LecunUniform", "config": {"seed": null}, "__passive_serialization__": true, "shared_object_id": 10}, "use_scale": true, "quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}}, "shared_object_id": 11}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 12}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 13}, "bias_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 14}, "kernel_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "bias_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "kernel_range": null, "bias_range": null}, "name": "q_dense", "inbound_nodes": [[["concatenate_1", 0, 0, {}]]], "shared_object_id": 15}, {"class_name": "BatchNormalization", "config": {"name": "batch_normalization", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.95, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 16}, "gamma_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 17}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 18}, "moving_variance_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 19}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "name": "batch_normalization", "inbound_nodes": [[["q_dense", 0, 0, {}]]], "shared_object_id": 20}, {"class_name": "QActivation", "config": {"name": "q_activation", "trainable": true, "dtype": "float32", "activation": {"class_name": "quantized_relu", "config": {"bits": 8, "integer": 2, "use_sigmoid": 0, "negative_slope": 0.0, "use_stochastic_rounding": false, "relu_upper_bound": null, "qnoise_factor": 1.0}, "__passive_serialization__": true, "shared_object_id": 21}}, "name": "q_activation", "inbound_nodes": [[["batch_normalization", 0, 0, {}]]], "shared_object_id": 22}, {"class_name": "QDense", "config": {"name": "q_dense_1", "trainable": true, "dtype": "float32", "units": 36, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "QInitializer", "config": {"initializer": {"class_name": "LecunUniform", "config": {"seed": null}, "__passive_serialization__": true, "shared_object_id": 23}, "use_scale": true, "quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}}, "shared_object_id": 24}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 25}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 26}, "bias_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 27}, "kernel_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "bias_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "kernel_range": null, "bias_range": null}, "name": "q_dense_1", "inbound_nodes": [[["q_activation", 0, 0, {}]]], "shared_object_id": 28}, {"class_name": "BatchNormalization", "config": {"name": "batch_normalization_1", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.95, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 29}, "gamma_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 30}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 31}, "moving_variance_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 32}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "name": "batch_normalization_1", "inbound_nodes": [[["q_dense_1", 0, 0, {}]]], "shared_object_id": 33}, {"class_name": "QActivation", "config": {"name": "q_activation_1", "trainable": true, "dtype": "float32", "activation": {"class_name": "quantized_relu", "config": {"bits": 8, "integer": 2, "use_sigmoid": 0, "negative_slope": 0.0, "use_stochastic_rounding": false, "relu_upper_bound": null, "qnoise_factor": 1.0}, "__passive_serialization__": true, "shared_object_id": 21}}, "name": "q_activation_1", "inbound_nodes": [[["batch_normalization_1", 0, 0, {}]]], "shared_object_id": 34}, {"class_name": "QDense", "config": {"name": "met_weight", "trainable": true, "dtype": "float32", "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "QInitializer", "config": {"initializer": {"class_name": "VarianceScaling", "config": {"scale": 0.02, "mode": "fan_in", "distribution": "truncated_normal", "seed": null}, "__passive_serialization__": true, "shared_object_id": 35}, "use_scale": true, "quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}}, "shared_object_id": 36}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 37}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 38}, "bias_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 39}, "kernel_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "bias_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "kernel_range": null, "bias_range": null}, "name": "met_weight", "inbound_nodes": [[["q_activation_1", 0, 0, {}]]], "shared_object_id": 40}, {"class_name": "BatchNormalization", "config": {"name": "met_weight_minus_one", "trainable": false, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": false, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 41}, "gamma_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 42}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 43}, "moving_variance_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 44}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "name": "met_weight_minus_one", "inbound_nodes": [[["met_weight", 0, 0, {}]]], "shared_object_id": 45}, {"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 100, 2]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_pxpy"}, "name": "input_pxpy", "inbound_nodes": [], "shared_object_id": 46}, {"class_name": "Multiply", "config": {"name": "multiply", "trainable": true, "dtype": "float32"}, "name": "multiply", "inbound_nodes": [[["met_weight_minus_one", 0, 0, {}], ["input_pxpy", 0, 0, {}]]], "shared_object_id": 47}, {"class_name": "GlobalAveragePooling1D", "config": {"name": "output", "trainable": true, "dtype": "float32", "data_format": "channels_last", "keepdims": false}, "name": "output", "inbound_nodes": [[["multiply", 0, 0, {}]]], "shared_object_id": 48}], "input_layers": [["input_cont", 0, 0], ["input_pxpy", 0, 0], ["input_cat0", 0, 0], ["input_cat1", 0, 0]], "output_layers": [["output", 0, 0]]}}, "training_config": {"loss": "custom_loss", "metrics": [[{"class_name": "MeanMetricWrapper", "config": {"name": "mean_absolute_error", "dtype": "float32", "fn": "mean_absolute_error"}, "shared_object_id": 54}, {"class_name": "MeanMetricWrapper", "config": {"name": "mean_squared_error", "dtype": "float32", "fn": "mean_squared_error"}, "shared_object_id": 55}]], "weighted_metrics": null, "loss_weights": null, "optimizer_config": {"class_name": "Adam", "config": {"name": "Adam", "clipnorm": 1.0, "learning_rate": 0.0003000000142492354, "decay": 0.0, "beta_1": 0.8999999761581421, "beta_2": 0.9990000128746033, "epsilon": 1e-07, "amsgrad": false}}}}2 +€ root.layer-0"_tf_keras_input_layer*Ð{"class_name": "InputLayer", "name": "input_cat0", "dtype": "float32", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 100]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 100]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_cat0"}}2 +€ root.layer-1"_tf_keras_input_layer*Ð{"class_name": "InputLayer", "name": "input_cat1", "dtype": "float32", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 100]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 100]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_cat1"}}2 +üroot.layer_with_weights-0"_tf_keras_layer*Å{"name": "embedding0", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, null]}, "stateful": false, "must_restore_from_config": false, "class_name": "Embedding", "config": {"name": "embedding0", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, null]}, "dtype": "float32", "input_dim": 6, "output_dim": 2, "embeddings_initializer": {"class_name": "RandomNormal", "config": {"mean": 0, "stddev": 0.2, "seed": null}, "shared_object_id": 2}, "embeddings_regularizer": null, "activity_regularizer": null, "embeddings_constraint": null, "mask_zero": false, "input_length": null}, "inbound_nodes": [[["input_cat0", 0, 0, {}]]], "shared_object_id": 3, "build_input_shape": {"class_name": "TensorShape", "items": [null, 100]}}2 +üroot.layer_with_weights-1"_tf_keras_layer*Å{"name": "embedding1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, null]}, "stateful": false, "must_restore_from_config": false, "class_name": "Embedding", "config": {"name": "embedding1", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, null]}, "dtype": "float32", "input_dim": 4, "output_dim": 2, "embeddings_initializer": {"class_name": "RandomNormal", "config": {"mean": 0, "stddev": 0.2, "seed": null}, "shared_object_id": 4}, "embeddings_regularizer": null, "activity_regularizer": null, "embeddings_constraint": null, "mask_zero": false, "input_length": null}, "inbound_nodes": [[["input_cat1", 0, 0, {}]]], "shared_object_id": 5, "build_input_shape": {"class_name": "TensorShape", "items": [null, 100]}}2 +† root.layer-4"_tf_keras_input_layer*Ö{"class_name": "InputLayer", "name": "input_cont", "dtype": "float32", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 100, 4]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 100, 4]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_cont"}}2 +² root.layer-5"_tf_keras_layer*ˆ{"name": "concatenate", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Concatenate", "config": {"name": "concatenate", "trainable": true, "dtype": "float32", "axis": -1}, "inbound_nodes": [[["embedding0", 0, 0, {}], ["embedding1", 0, 0, {}]]], "shared_object_id": 7, "build_input_shape": [{"class_name": "TensorShape", "items": [null, 100, 2]}, {"class_name": "TensorShape", "items": [null, 100, 2]}]}2 +· root.layer-6"_tf_keras_layer*{"name": "concatenate_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Concatenate", "config": {"name": "concatenate_1", "trainable": true, "dtype": "float32", "axis": -1}, "inbound_nodes": [[["input_cont", 0, 0, {}], ["concatenate", 0, 0, {}]]], "shared_object_id": 8, "build_input_shape": [{"class_name": "TensorShape", "items": [null, 100, 4]}, {"class_name": "TensorShape", "items": [null, 100, 4]}]}2 +ßroot.layer_with_weights-2"_tf_keras_layer*¨{"name": "q_dense", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "QDense", "config": {"name": "q_dense", "trainable": true, "dtype": "float32", "units": 12, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "QInitializer", "config": {"initializer": {"class_name": "LecunUniform", "config": {"seed": null}, "__passive_serialization__": true, "shared_object_id": 10}, "use_scale": true, "quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}}, "shared_object_id": 11}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 12}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 13}, "bias_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 14}, "kernel_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "bias_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "kernel_range": null, "bias_range": null}, "inbound_nodes": [[["concatenate_1", 0, 0, {}]]], "shared_object_id": 15, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 8}}, "shared_object_id": 56}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 100, 8]}}2 +¸  root.layer_with_weights-3"_tf_keras_layer* {"name": "batch_normalization", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "BatchNormalization", "config": {"name": "batch_normalization", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.95, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 16}, "gamma_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 17}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 18}, "moving_variance_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 19}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["q_dense", 0, 0, {}]]], "shared_object_id": 20, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {"2": 12}}, "shared_object_id": 57}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 100, 12]}}2 +œ + root.layer-9"_tf_keras_layer*ò{"name": "q_activation", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "QActivation", "config": {"name": "q_activation", "trainable": true, "dtype": "float32", "activation": {"class_name": "quantized_relu", "config": {"bits": 8, "integer": 2, "use_sigmoid": 0, "negative_slope": 0.0, "use_stochastic_rounding": false, "relu_upper_bound": null, "qnoise_factor": 1.0}, "__passive_serialization__": true, "shared_object_id": 21}}, "inbound_nodes": [[["batch_normalization", 0, 0, {}]]], "shared_object_id": 22}2 +ä root.layer_with_weights-4"_tf_keras_layer*­{"name": "q_dense_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "QDense", "config": {"name": "q_dense_1", "trainable": true, "dtype": "float32", "units": 36, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "QInitializer", "config": {"initializer": {"class_name": "LecunUniform", "config": {"seed": null}, "__passive_serialization__": true, "shared_object_id": 23}, "use_scale": true, "quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}}, "shared_object_id": 24}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 25}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 26}, "bias_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 27}, "kernel_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "bias_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "kernel_range": null, "bias_range": null}, "inbound_nodes": [[["q_activation", 0, 0, {}]]], "shared_object_id": 28, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 12}}, "shared_object_id": 58}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 100, 12]}}2 +¾  root.layer_with_weights-5"_tf_keras_layer*‡ {"name": "batch_normalization_1", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "BatchNormalization", "config": {"name": "batch_normalization_1", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.95, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 29}, "gamma_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 30}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 31}, "moving_variance_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 32}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["q_dense_1", 0, 0, {}]]], "shared_object_id": 33, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {"2": 36}}, "shared_object_id": 59}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 100, 36]}}2 +£  root.layer-12"_tf_keras_layer*ø{"name": "q_activation_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "QActivation", "config": {"name": "q_activation_1", "trainable": true, "dtype": "float32", "activation": {"class_name": "quantized_relu", "config": {"bits": 8, "integer": 2, "use_sigmoid": 0, "negative_slope": 0.0, "use_stochastic_rounding": false, "relu_upper_bound": null, "qnoise_factor": 1.0}, "__passive_serialization__": true, "shared_object_id": 21}}, "inbound_nodes": [[["batch_normalization_1", 0, 0, {}]]], "shared_object_id": 34}2 +¯root.layer_with_weights-6"_tf_keras_layer*ø{"name": "met_weight", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "QDense", "config": {"name": "met_weight", "trainable": true, "dtype": "float32", "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "QInitializer", "config": {"initializer": {"class_name": "VarianceScaling", "config": {"scale": 0.02, "mode": "fan_in", "distribution": "truncated_normal", "seed": null}, "__passive_serialization__": true, "shared_object_id": 35}, "use_scale": true, "quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}}, "shared_object_id": 36}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 37}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 38}, "bias_constraint": {"class_name": "Clip", "config": {"min_value": -4.0, "max_value": 4.0}, "shared_object_id": 39}, "kernel_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "bias_quantizer": {"class_name": "quantized_bits", "config": {"bits": 8, "integer": 2, "symmetric": 0, "alpha": 1, "keep_negative": true, "use_stochastic_rounding": false, "qnoise_factor": 1.0}, "shared_object_id": 9, "__passive_serialization__": true}, "kernel_range": null, "bias_range": null}, "inbound_nodes": [[["q_activation_1", 0, 0, {}]]], "shared_object_id": 40, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 36}}, "shared_object_id": 60}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 100, 36]}}2 +½ root.layer_with_weights-7"_tf_keras_layer*† {"name": "met_weight_minus_one", "trainable": false, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "BatchNormalization", "config": {"name": "met_weight_minus_one", "trainable": false, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": false, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 41}, "gamma_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 42}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 43}, "moving_variance_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 44}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["met_weight", 0, 0, {}]]], "shared_object_id": 45, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {"2": 1}}, "shared_object_id": 61}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 100, 1]}}2 +‡ root.layer-15"_tf_keras_input_layer*Ö{"class_name": "InputLayer", "name": "input_pxpy", "dtype": "float32", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 100, 2]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 100, 2]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_pxpy"}}2 +© root.layer-16"_tf_keras_layer*þ{"name": "multiply", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Multiply", "config": {"name": "multiply", "trainable": true, "dtype": "float32"}, "inbound_nodes": [[["met_weight_minus_one", 0, 0, {}], ["input_pxpy", 0, 0, {}]]], "shared_object_id": 47, "build_input_shape": [{"class_name": "TensorShape", "items": [null, 100, 1]}, {"class_name": "TensorShape", "items": [null, 100, 2]}]}2 +á root.layer-17"_tf_keras_layer*¶{"name": "output", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "GlobalAveragePooling1D", "config": {"name": "output", "trainable": true, "dtype": "float32", "data_format": "channels_last", "keepdims": false}, "inbound_nodes": [[["multiply", 0, 0, {}]]], "shared_object_id": 48, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}, "shared_object_id": 62}}2 +ºÝroot.keras_api.metrics.0"_tf_keras_metric*‚{"class_name": "Mean", "name": "loss", "dtype": "float32", "config": {"name": "loss", "dtype": "float32"}, "shared_object_id": 63}2 +‚Þroot.keras_api.metrics.1"_tf_keras_metric*Ê{"class_name": "MeanMetricWrapper", "name": "mean_absolute_error", "dtype": "float32", "config": {"name": "mean_absolute_error", "dtype": "float32", "fn": "mean_absolute_error"}, "shared_object_id": 54}2 +ÿßroot.keras_api.metrics.2"_tf_keras_metric*Ç{"class_name": "MeanMetricWrapper", "name": "mean_squared_error", "dtype": "float32", "config": {"name": "mean_squared_error", "dtype": "float32", "fn": "mean_squared_error"}, "shared_object_id": 55}2 \ No newline at end of file diff --git a/models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac100_KerasV3/saved_model.pb b/models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac100_KerasV3/saved_model.pb new file mode 100644 index 0000000000000000000000000000000000000000..9062a9d2ae41a3431a0506d05b9f54eab9ea55cd GIT binary patch literal 459808 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 literal 0 HcmV?d00001 diff --git a/models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac100_KerasV3/variables/variables.data-00000-of-00001 b/models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac100_KerasV3/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000000000000000000000000000000000000..cd9707fed486a07fd93cb6a0eb30c51a20d97519 GIT binary patch literal 25456 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 literal 0 HcmV?d00001 diff --git a/models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac100_KerasV3/variables/variables.index b/models/baseline_DeepMET_quantized/trained_quantized_DeepMET_normfac100_KerasV3/variables/variables.index new file mode 100644 index 0000000000000000000000000000000000000000..8d5beb4ad1ac3dabba288b95c79adaceb0a05d27 GIT binary patch literal 3518 zcmbtXZ)_7~7=Ldotj^Je9$nqh!CQ90!ws&Ty_rn?u+2I)#=4clf)LJIciArN+Sztn zzz|O7-q(zF*A{===-dhd>QN8^^)r) zm;Qdw?|Gl+_df3-wAjdSSw;rg^5yFF?&=MVp4tXqWmUaf_Egomt9^2fx3Y1)F~^MX z-5R0q6^T0^A3!eCPBo;2Wu;RSbu|*w{9(}{`h#78h`6rO=kwN9ZT7i0iCZeYwKHT} zD(g49jSOLla)Lp+UN1kh44Wdsh|-Y?a1a3Z@11j-SDBo2F^;7h<0t?c%3~Wyj54|y z$J34R9sou@`u25H!FDLS)R5exMcU;aRcmXHgx5MmRc}#STeU!2c>X0ZnzM|H$(Y4p`@tbM`ll{eLUd}6ROqUqXhH6-ekRQM!E*y0|n3eRL7MOEX|mW0 zh;IXG3eQ16BFXwt4HP|=WSioEZZPr3xpJE|h4Kd)MxB5X{HLEL zHF{EPQ6tLy{h3TUW*|wA7y94NxJHQ;geko9jUkuKoI-Un^sqz#XU1gBg3WD;u2bpl z1-&1y*&VcH+EXV%Z-v&-E>Y^;4|);*&SlGLvmWdwJCLlaN`PjSZ-MH4{fByN#pZ4$ zq$vTvN`s3oBDke*-k4zRtc%ijJnm(MC?icW&LhhucA@~(gRPjQ_ZpAm zRsdeOgTEvjXgQ_X7<{XcoL9PILvn^2D1-Z)gh{`=_Zzwml)>XQ1aL8D`l~dY#*^-6 z@TJEfS4UmqUWOAZNjD_|ow7vgr!!L$HTpcD26D&tA=g|}{V7U+k%fR76rEmkf_{=P z_%?uEJvCO6?sm@Ly8s=0d1*yj+c|@On+=IdOb-s9Fsfze{Nn)ODZu_S@x{%28##NY z_oaXZ3)%;iUU%dzTu9~a=0TE!Yq5uE@ literal 0 HcmV?d00001 diff --git a/train.py b/train.py index 9ef68a540..9b1d2ecd9 100644 --- a/train.py +++ b/train.py @@ -27,7 +27,7 @@ from cyclical_learning_rate import CyclicLR from models import * from utils import * -from loss import custom_loss +from loss import custom_loss_wrapper from DataGenerator import DataGenerator import matplotlib.pyplot as plt @@ -123,6 +123,7 @@ def train_dataGenerator(args): n_features_pf = 6 n_features_pf_cat = 2 normFac = 1. + custom_loss = custom_loss_wrapper(normFac) epochs = args.epochs batch_size = args.batch_size preprocessed = True @@ -254,6 +255,7 @@ def train_loadAllData(args): n_features_pf = 6 n_features_pf_cat = 2 normFac = 1. + custom_loss = custom_loss_wrapper(normFac) epochs = args.epochs batch_size = args.batch_size preprocessed = True diff --git a/utils.py b/utils.py index b9e8eaa2d..6fc43146a 100644 --- a/utils.py +++ b/utils.py @@ -40,9 +40,9 @@ def preProcessing(A, normFac, EVT=None): puppi = A[:, :, 5:6] # remove outliers - pt[np.where(np.abs(pt > 500))] = 0. - px[np.where(np.abs(px > 500))] = 0. - py[np.where(np.abs(py > 500))] = 0. + pt[np.where(np.abs(pt > 500/norm))] = 0. + px[np.where(np.abs(px > 500/norm))] = 0. + py[np.where(np.abs(py > 500/norm))] = 0. inputs = np.concatenate((pt, eta, phi, puppi), axis=2) pxpy = np.concatenate((px, py), axis=2)