Loading...
Searching...
No Matches
loss.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
9
10namespace opennn
11{
12
13class Dataset;
14
15struct Batch;
17
18class Loss
19{
20
21public:
22
31
33
35 {
36 static const EnumMap<Regularization> map{
38 {Regularization::L1, "L1"},
39 {Regularization::L2, "L2"}
40 };
41 return map;
42 }
43
44 static const string& regularization_to_string(Regularization regularization)
45 {
46 return regularization_map().to_string(regularization);
47 }
48
50 {
51 if (name == "NoRegularization") return Regularization::NoRegularization;
52 return regularization_map().from_string(name);
53 }
54
55 explicit Loss(Network* = nullptr, Dataset* = nullptr);
56
57 virtual ~Loss() = default;
58
59 const Network* get_network() const noexcept
60 {
61 return network;
62 }
63
65 {
66 return network;
67 }
68
69 const Dataset* get_dataset() const noexcept
70 {
71 return dataset;
72 }
73
75 {
76 return dataset;
77 }
78
79 void set(Network* = nullptr, Dataset* = nullptr);
80
81 void set_network(Network* new_network) { network = new_network; }
82
83 virtual void set_dataset(Dataset* new_dataset) { dataset = new_dataset; }
84
86 void set_regularization(const string& new_regularization_method) { regularization_method = string_to_regularization(new_regularization_method); }
87 void set_regularization(Regularization new_regularization) { regularization_method = new_regularization; }
88 void set_regularization_weight(const float new_regularization_weight) { regularization_weight = new_regularization_weight; }
89 void set_minkowski_parameter(const float new_minkowski_parameter) { minkowski_parameter = new_minkowski_parameter; }
90
92
94 {
95 float error = 0.0f;
96 float accuracy = 0.0f;
98 };
99
101 const ForwardPropagation&) const;
102
103 void set_error(const Error&);
104 void set_error(const string&);
105
106 Error get_error() const noexcept { return error; }
107
108 vector<Index> get_output_delta_layer_indices() const;
109
111
114 BackPropagation&) const;
115
117
121 float*,
122 float*) const;
123
125 const ForwardPropagation&,
126 float*,
127 float*) const;
128
131
134
136
137 void to_JSON(JsonWriter&) const;
138
141
142 const string& get_name() const noexcept { return name; }
143
150protected:
151
153
155 float positives_weight = 1.0f;
156 float negatives_weight = 1.0f;
159
160 float yolo_lambda_giou = 5.0f;
161 float yolo_lambda_dfl = 1.5f;
162 float yolo_lambda_noobj = 0.5f;
163 float yolo_lambda_class = 1.0f;
164 float yolo_focal_gamma = 0.0f;
166
168 float regularization_weight = 0.001f;
169
170 Network* network = nullptr;
171 Dataset* dataset = nullptr;
172
173 string name = "Loss";
174
175private:
176
178 Index parameter_offset) const;
179
180 void check_network() const
181 {
182 throw_if(!network, "Loss error: neural network is not set.");
183 }
184
185 bool runs_on_gpu() const noexcept
186 {
188 }
189
190 bool has_regularization() const noexcept
191 {
193 && regularization_weight != 0.0f;
194 }
195
196 Index error_workspace_floats(const TensorView&) const;
197 bool uses_binary_cross_entropy(const TensorView&) const;
198 float* ensure_error_workspace(Buffer&, const TensorView&,
199 Index batch_samples,
200 Index reduction_floats = 0) const;
201 float* ensure_metrics_workspace(Buffer&, const TensorView&, Index batch_samples) const;
202
203 float get_weighted_coefficient(const Batch& batch) const { return get_batch_scale(batch) / (normalization_coefficient + EPSILON); }
204
205 float get_batch_scale(const Batch&) const;
206
207 void calculate_layers_error_gradient(const Batch&,
208 ForwardPropagation&,
209 BackPropagation&) const;
210
211 void back_propagate_layers(ForwardPropagation&,
212 BackPropagation&) const;
213
214 void calculate_output_deltas(const Batch&,
215 const ForwardPropagation&,
216 BackPropagation&) const;
217
218#ifndef OPENNN_NO_VISION
219 EvaluationResult calculate_yolo(const ForwardPropagation&,
220 const TensorView& target,
221 BackPropagation*) const;
222#endif
223};
224
225#ifndef OPENNN_NO_VISION
226
228{
229 float giou = 5.0f;
230 float dfl = 1.5f;
231 float noobj = 0.5f;
232 float cls = 1.0f;
233 float focal_gamma = 0.0f;
234 float obj_focal_gamma = 0.0f;
235};
236
237float yolo_error_kernel(const TensorView& output,
238 const TensorView& target,
239 Index boxes_per_cell,
240 Index classes_number,
241 bool sigmoid_classes,
242 YoloLambdas lam);
243
245 const TensorView& target,
246 const TensorView& output_delta,
247 Index boxes_per_cell,
248 Index classes_number,
249 bool sigmoid_classes,
250 float inv_batch,
251 YoloLambdas lam);
252
253#endif
254
255}
Definition dataset.h:48
Definition enum_map.h:15
Definition json.h:75
Definition json.h:92
Network * get_network()
Definition loss.h:64
static Regularization string_to_regularization(const string &name)
Definition loss.h:49
float yolo_focal_gamma
Definition loss.h:164
float yolo_obj_focal_gamma
Definition loss.h:165
float negatives_weight
Definition loss.h:156
float normalization_coefficient
Definition loss.h:154
void set_yolo_lambda_class(float v)
Definition loss.h:145
Error get_error() const noexcept
Definition loss.h:106
Regularization regularization_method
Definition loss.h:167
float calculate_regularization(const VectorR &) const
void set(Network *=nullptr, Dataset *=nullptr)
void set_yolo_obj_focal_gamma(float v)
Definition loss.h:149
float positives_weight
Definition loss.h:155
bool back_propagate_device_metrics(const Batch &, ForwardPropagation &, BackPropagation &, float *, float *) const
void set_regularization(const string &new_regularization_method)
Definition loss.h:86
void from_JSON(const JsonDocument &)
void set_minkowski_parameter(const float new_minkowski_parameter)
Definition loss.h:89
void regularization_from_JSON(const JsonDocument &)
Dataset * get_dataset()
Definition loss.h:74
Network * network
Definition loss.h:170
static const string & regularization_to_string(Regularization regularization)
Definition loss.h:44
float yolo_lambda_giou
Definition loss.h:160
Error error
Definition loss.h:152
bool output_delta_overwrites_outputs() const
string get_regularization_method() const
Definition loss.h:85
float regularization_weight
Definition loss.h:168
void set_yolo_lambda_noobj(float v)
Definition loss.h:144
Dataset * dataset
Definition loss.h:171
virtual void set_dataset(Dataset *new_dataset)
Definition loss.h:83
void set_yolo_lambda_giou(float v)
Definition loss.h:146
float calculate_regularization(const TensorView &) const
void set_normalization_coefficient()
void regularization_to_JSON(JsonWriter &) const
const Dataset * get_dataset() const noexcept
Definition loss.h:69
string name
Definition loss.h:173
static const EnumMap< Regularization > & regularization_map()
Definition loss.h:34
bool supports_device_epoch_metrics() const
const Network * get_network() const noexcept
Definition loss.h:59
bool calculate_error_device_metrics(const Batch &, const ForwardPropagation &, float *, float *) const
Loss(Network *=nullptr, Dataset *=nullptr)
Index weighted_samples_number
Definition loss.h:157
const string & get_name() const noexcept
Definition loss.h:142
float yolo_lambda_noobj
Definition loss.h:162
void back_propagate(const Batch &, ForwardPropagation &, BackPropagation &) const
void set_error(const string &)
EvaluationResult calculate_error(const Batch &, const ForwardPropagation &) const
void to_JSON(JsonWriter &) const
void set_yolo_lambda_dfl(float v)
Definition loss.h:147
Regularization
Definition loss.h:32
@ NoRegularization
Definition loss.h:32
@ L2
Definition loss.h:32
@ L1
Definition loss.h:32
void set_error(const Error &)
virtual ~Loss()=default
float yolo_lambda_dfl
Definition loss.h:161
void set_regularization_weight(const float new_regularization_weight)
Definition loss.h:88
vector< Index > get_output_delta_layer_indices() const
Error
Definition loss.h:23
@ CrossEntropy3d
Definition loss.h:28
@ CrossEntropy
Definition loss.h:27
@ MinkowskiError
Definition loss.h:29
@ NormalizedSquaredError
Definition loss.h:25
@ Yolo
Definition loss.h:30
@ MeanSquaredError
Definition loss.h:23
@ MeanAbsoluteError
Definition loss.h:24
@ WeightedSquaredError
Definition loss.h:26
void set_network(Network *new_network)
Definition loss.h:81
void set_yolo_focal_gamma(float v)
Definition loss.h:148
void add_regularization_gradient(BackPropagation &) const
float minkowski_parameter
Definition loss.h:158
float yolo_lambda_class
Definition loss.h:163
void add_regularization_gradient(const TensorView &) const
void set_regularization(Regularization new_regularization)
Definition loss.h:87
Definition network.h:87
bool is_gpu() const noexcept
Definition network.h:126
constexpr bool is_cuda_build() noexcept
Definition device_backend.h:72
Definition configuration.h:10
void yolo_gradient_kernel(const TensorView &output, const TensorView &target, const TensorView &output_delta, Index boxes_per_cell, Index classes_number, bool sigmoid_classes, float inv_batch, YoloLambdas lam)
constexpr float EPSILON
Definition opennn_types.h:308
float yolo_error_kernel(const TensorView &output, const TensorView &target, Index boxes_per_cell, Index classes_number, bool sigmoid_classes, YoloLambdas lam)
Eigen::Matrix< float, Eigen::Dynamic, 1 > VectorR
Definition opennn_types.h:335
#define throw_if(condition,...)
Definition opennn_types.h:243
Definition back_propagation.h:19
Definition batch.h:60
Definition forward_propagation.h:52
Definition loss.h:94
float accuracy
Definition loss.h:96
Index active_tokens_count
Definition loss.h:97
float error
Definition loss.h:95
Definition tensor_types.h:540
Definition loss.h:228
float cls
Definition loss.h:232
float focal_gamma
Definition loss.h:233
float dfl
Definition loss.h:230
float obj_focal_gamma
Definition loss.h:234
float noobj
Definition loss.h:231
float giou
Definition loss.h:229