Loading...
Searching...
No Matches
batch_norm_operator.h
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (C) 2026 Artificial Intelligence Techniques, S.L. and Roberto López González
3
4#pragma once
5
7
8namespace opennn
9{
10
11// Every path that normalizes - the operator's own forward, the cuDNN graphs, and the
12// fold of batch norm into convolution weights for inference - must use this same value.
13// It lived as a file-local constant in batch_norm_operator.cpp, so the fold in
14// convolutional_layer.cpp could not see it and reached for the generic EPSILON
15// (numeric_limits<float>::epsilon(), ~84x smaller), which made folded inference
16// disagree with every other path.
17inline constexpr float BN_EPSILON = 1e-5f;
18
20{
21 Index features = 0;
22 float momentum = 0.1f;
23 bool fuse_relu = false;
24 bool fuse_add = false;
26
31
34
35 bool active() const { return features > 0; }
36
37 // features carries two facts at once: how many channels to normalize, and
38 // whether to normalize at all. Six call sites spelled the encoding out as
39 // `features = enabled ? count : 0`, so it lives here instead.
40 void set_enabled(bool enabled, Index feature_count) { features = enabled ? feature_count : 0; }
41
44
45 struct BatchNormalizationGraphCache;
46
47 unique_ptr<BatchNormalizationGraphCache> bn_graph_cache;
48
49 void set(Index, float new_momentum = 0.1f);
50
51 vector<TensorSpec> parameter_specs() const override;
52 vector<TensorSpec> state_specs() const override { return parameter_specs(); }
53 vector<ParameterSlot> parameter_slots() override;
54 void link_parameters(span<const TensorView>) override;
55 void link_states (span<const TensorView>) override;
56
57 void set_parameters_random() override { init_defaults(); }
58 void set_parameters_glorot() override { init_defaults(); }
59 void initialize_states() override;
60
62
64 void back_propagate(ForwardPropagation&, BackPropagation&, size_t) const override;
65
66 void to_JSON(JsonWriter&) const override;
67 void from_JSON(const Json*) override;
68 void load_state_from_JSON(const Json*) override;
69
70 void invalidate_inference_cache() { inference_cache_dirty = true; }
71
72private:
73 VectorR inference_scale;
74 VectorR inference_shift;
75 bool inference_cache_dirty = true;
76
77 void update_inference_cache();
78
79 void apply_inference_cpu(const TensorView&, TensorView&);
80 void apply_inference_gpu(const TensorView&, TensorView&,
81 const TensorView&);
82
83 void apply_training_cpu (const TensorView&,
85 TensorView&);
86 void apply_training_gpu (const TensorView&,
89 const TensorView&,
90 TensorView&);
91
92 void apply_delta_cpu(const TensorView&,
93 const TensorView&,
94 const TensorView&,
95 TensorView&) const;
96 void apply_delta_gpu(const TensorView&,
97 const TensorView&,
98 const TensorView&,
99 const TensorView&,
100 const TensorView&,
101 TensorView&,
102 TensorView&) const;
103 void apply_delta_own_kernel_gpu(const TensorView&,
104 const TensorView&,
105 const TensorView&,
106 const TensorView&,
107 const uint8_t*,
108 TensorView&,
109 TensorView&) const;
110
111 bool own_forward_kernel(const TensorView& mask) const noexcept;
112
113 TensorView& relu_mask(ForwardPropagation&, size_t layer) const noexcept;
114};
115
116}
Definition json.h:92
Definition json.h:24
Definition configuration.h:10
constexpr float BN_EPSILON
Definition batch_norm_operator.h:17
ForwardPropagationMode
Definition forward_propagation.h:33
Eigen::Matrix< float, Eigen::Dynamic, 1 > VectorR
Definition opennn_types.h:335
Definition back_propagation.h:19
void link_parameters(span< const TensorView >) override
size_t residual_delta_slot
Definition batch_norm_operator.h:25
bool fuse_add
Definition batch_norm_operator.h:24
void back_propagate(ForwardPropagation &, BackPropagation &, size_t) const override
void set_enabled(bool enabled, Index feature_count)
Definition batch_norm_operator.h:40
Index features
Definition batch_norm_operator.h:21
TensorView beta
Definition batch_norm_operator.h:28
vector< TensorSpec > state_specs() const override
Definition batch_norm_operator.h:52
TensorView gamma_gradient
Definition batch_norm_operator.h:32
TensorView beta_gradient
Definition batch_norm_operator.h:33
float momentum
Definition batch_norm_operator.h:22
bool fuse_relu
Definition batch_norm_operator.h:23
void set(Index, float new_momentum=0.1f)
unique_ptr< BatchNormalizationGraphCache > bn_graph_cache
Definition batch_norm_operator.h:47
void set_parameters_random() override
Definition batch_norm_operator.h:57
void load_state_from_JSON(const Json *) override
TensorView gamma
Definition batch_norm_operator.h:27
void invalidate_inference_cache()
Definition batch_norm_operator.h:70
vector< TensorSpec > parameter_specs() const override
void to_JSON(JsonWriter &) const override
bool active() const
Definition batch_norm_operator.h:35
void from_JSON(const Json *) override
void set_parameters_glorot() override
Definition batch_norm_operator.h:58
vector< ParameterSlot > parameter_slots() override
void link_states(span< const TensorView >) override
TensorView running_mean
Definition batch_norm_operator.h:29
void forward_propagate(ForwardPropagation &, size_t, ForwardPropagationMode) override
TensorView running_variance
Definition batch_norm_operator.h:30
Definition forward_propagation.h:52
Definition operator.h:28
Definition tensor_types.h:540