46 std::string nameX, std::string nameScale, std::string nameB,
49 fNX(UTILITY::Clean_name(nameX)),
fNScale(UTILITY::Clean_name(nameScale)),
50 fNB(UTILITY::Clean_name(nameB)),
fNMean(UTILITY::Clean_name(nameMean)),
51 fNVar(UTILITY::Clean_name(nameVar)),
fNY(UTILITY::Clean_name(nameY)),
fActivation(activation)
57 if(std::is_same<T, float>::value){
62 std::runtime_error(
"TMVA SOFIE Encountered unsupported type parsing a BatchNormalization operator");
68 if (!model.CheckIfTensorAlreadyExist(
fNX)) {
70 std::runtime_error(
"TMVA SOFIE BatchNormalization op Input Tensor " +
fNX +
" fnx is not found in model");
72 if (!model.CheckIfTensorAlreadyExist(
fNScale)) {
74 std::runtime_error(
"TMVA SOFIE BatchNormalization op Input Tensor " +
fNScale +
" fns is not found in model");
76 if (!model.CheckIfTensorAlreadyExist(
fNB)) {
78 std::runtime_error(
"TMVA SOFIE BatchNormalization op Input Tensor " +
fNB +
" fnb is not found in model");
80 if (!model.CheckIfTensorAlreadyExist(
fNMean)) {
82 std::runtime_error(
"TMVA SOFIE BatchNormalization op Input Tensor " +
fNMean +
" fnm is not found in model");
84 if (!model.CheckIfTensorAlreadyExist(
fNVar)) {
86 std::runtime_error(
"TMVA SOFIE BatchNormalization op Input Tensor " +
fNVar +
" fnv is not found in model");
97 model.AddIntermediateTensor(
fNY, model.GetTensorType(
fNX),
fShapeY);
99 auto original_S = model.GetInitializedTensorData(
fNScale);
100 auto original_V = model.GetInitializedTensorData(
fNVar);
102 auto shape_S = model.GetTensorShape(
fNScale);
103 if (shape_S.size() != 1) {
104 throw std::runtime_error(
"TMVA SOFIE BatchNormalization 'scale' tensor must be 1D (per-channel).");
106 size_t channels = shape_S[0];
108 if (
fType ==
"float") {
109 float *original_scale_ptr =
static_cast<float *
>(original_S.get());
110 float *original_var_ptr =
static_cast<float *
>(original_V.get());
111 float *fused_scale_data =
new float[channels];
113 for (
size_t i = 0; i < channels; i++) {
115 fused_scale_data[i] = original_scale_ptr[i] / std::sqrt(original_var_ptr[i] +
fepsilon);
118 std::shared_ptr<void> fused_scale_ptr(fused_scale_data, std::default_delete<
float[]>());
119 model.AddInitializedTensor(
fNFusedScale, model.GetTensorType(
fNScale), {channels}, fused_scale_ptr);