28#include "statistics.h"
38struct LayerForwardPropagation;
39struct LayerBackPropagation;
40struct LayerBackPropagationLM;
43 #include "../../opennn-cuda/opennn-cuda/struct_layer_cuda.h"
61 enum class Type{Scaling, Convolutional, Perceptron, Pooling, Probabilistic,
62 LongShortTermMemory,Recurrent, Unscaling, Bounding};
68 const int n = omp_get_max_threads();
70 non_blocking_thread_pool =
new NonBlockingThreadPool(n);
71 thread_pool_device =
new ThreadPoolDevice(non_blocking_thread_pool, n);
78 string get_name()
const
85 virtual void set_parameters_constant(
const type&);
87 virtual void set_parameters_random();
91 virtual Tensor<type, 1> get_parameters()
const;
92 virtual Index get_parameters_number()
const;
94 virtual void set_parameters(
const Tensor<type, 1>&,
const Index&);
96 void set_threads_number(
const int&);
98 virtual void insert_gradient(LayerBackPropagation*,
const Index&, Tensor<type, 1>&)
const {}
102 virtual Tensor<type, 2> calculate_outputs(
const Tensor<type, 2>&);
104 virtual Tensor<type, 2> calculate_outputs_from4D(
const Tensor<type, 4>&) {
return Tensor<type, 2>();}
106 virtual Tensor<type, 4> calculate_outputs_4D(
const Tensor<type, 4>&) {
return Tensor<type, 4>();}
108 virtual void forward_propagate(
const Tensor<type, 2>&, LayerForwardPropagation*) {}
109 virtual void forward_propagate(
const Tensor<type, 4>&, LayerForwardPropagation*) {}
111 virtual void forward_propagate(
const Tensor<type, 4>&, Tensor<type, 1>, LayerForwardPropagation*) {}
112 virtual void forward_propagate(
const Tensor<type, 2>&, Tensor<type, 1>, LayerForwardPropagation*) {}
116 virtual void calculate_hidden_delta(LayerForwardPropagation*,
117 LayerBackPropagation*,
118 LayerBackPropagation*)
const {}
120 virtual void calculate_hidden_delta_lm(LayerForwardPropagation*,
121 LayerBackPropagationLM*,
122 LayerBackPropagationLM*)
const {}
126 virtual void calculate_error_gradient(
const Tensor<type, 2>&,
127 LayerForwardPropagation*,
128 LayerBackPropagation*)
const {}
130 virtual void calculate_error_gradient(
const Tensor<type, 4>&,
131 LayerForwardPropagation*,
132 LayerBackPropagation*)
const {}
136 virtual void calculate_squared_errors_Jacobian_lm(
const Tensor<type, 2>&,
137 LayerForwardPropagation*,
138 LayerBackPropagationLM*) {}
140 virtual void insert_squared_errors_Jacobian_lm(LayerBackPropagationLM*,
142 Tensor<type, 2>&)
const {}
147 virtual Index get_neurons_number()
const;
149 virtual void set_inputs_number(
const Index&);
150 virtual void set_neurons_number(
const Index&);
166 virtual string write_expression(
const Tensor<string, 1>&,
const Tensor<string, 1>&)
const {
return string();}
168 virtual string write_expression_c()
const {
return string();}
170 virtual string write_expression_python()
const {
return string();}
174 NonBlockingThreadPool* non_blocking_thread_pool =
nullptr;
175 ThreadPoolDevice* thread_pool_device =
nullptr;
187 void hard_sigmoid(
const Tensor<type, 1>&, Tensor<type, 1>&)
const;
188 void hyperbolic_tangent(
const Tensor<type, 1>&, Tensor<type, 1>&)
const;
189 void logistic(
const Tensor<type, 1>&, Tensor<type, 1>&)
const;
190 void linear(
const Tensor<type, 1>&, Tensor<type, 1>&)
const;
191 void threshold(
const Tensor<type, 1>&, Tensor<type, 1>&)
const;
192 void symmetric_threshold(
const Tensor<type, 1>&, Tensor<type, 1>&)
const;
193 void rectified_linear(
const Tensor<type, 1>&, Tensor<type, 1>&)
const;
194 void scaled_exponential_linear(
const Tensor<type, 1>&, Tensor<type, 1>&)
const;
195 void soft_plus(
const Tensor<type, 1>&, Tensor<type, 1>&)
const;
196 void soft_sign(
const Tensor<type, 1>&, Tensor<type, 1>&)
const;
197 void exponential_linear(
const Tensor<type, 1>&, Tensor<type, 1>&)
const;
198 void softmax(
const Tensor<type, 1>&, Tensor<type, 1>&)
const;
199 void binary(
const Tensor<type, 1>&, Tensor<type, 1>&)
const;
200 void competitive(
const Tensor<type, 1>&, Tensor<type, 1>&)
const;
202 void hard_sigmoid_derivatives(
const Tensor<type, 1>&, Tensor<type, 1>&, Tensor<type, 1>&)
const;
203 void hyperbolic_tangent_derivatives(
const Tensor<type, 1>&, Tensor<type, 1>&, Tensor<type, 1>&)
const;
204 void linear_derivatives(
const Tensor<type, 1>&, Tensor<type, 1>&, Tensor<type, 1>&)
const;
205 void logistic_derivatives(
const Tensor<type, 1>&, Tensor<type, 1>&, Tensor<type, 1>&)
const;
206 void threshold_derivatives(
const Tensor<type, 1>&, Tensor<type, 1>&, Tensor<type, 1>&)
const;
207 void symmetric_threshold_derivatives(
const Tensor<type, 1>&, Tensor<type, 1>&, Tensor<type, 1>&)
const;
208 void rectified_linear_derivatives(
const Tensor<type, 1>&, Tensor<type, 1>&, Tensor<type, 1>&)
const;
209 void scaled_exponential_linear_derivatives(
const Tensor<type, 1>&, Tensor<type, 1>&, Tensor<type, 1>&)
const;
210 void soft_plus_derivatives(
const Tensor<type, 1>&, Tensor<type, 1>&, Tensor<type, 1>&)
const;
211 void soft_sign_derivatives(
const Tensor<type, 1>&, Tensor<type, 1>&, Tensor<type, 1>&)
const;
212 void exponential_linear_derivatives(
const Tensor<type, 1>&, Tensor<type, 1>&, Tensor<type, 1>&)
const;
216 void hard_sigmoid(
const Tensor<type, 2>&, Tensor<type, 2>&)
const;
217 void hyperbolic_tangent(
const Tensor<type, 2>&, Tensor<type, 2>&)
const;
218 void logistic(
const Tensor<type, 2>&, Tensor<type, 2>&)
const;
219 void linear(
const Tensor<type, 2>&, Tensor<type, 2>&)
const;
220 void threshold(
const Tensor<type, 2>&, Tensor<type, 2>&)
const;
221 void symmetric_threshold(
const Tensor<type, 2>&, Tensor<type, 2>&)
const;
222 void rectified_linear(
const Tensor<type, 2>&, Tensor<type, 2>&)
const;
223 void scaled_exponential_linear(
const Tensor<type, 2>&, Tensor<type, 2>&)
const;
224 void soft_plus(
const Tensor<type, 2>&, Tensor<type, 2>&)
const;
225 void soft_sign(
const Tensor<type, 2>&, Tensor<type, 2>&)
const;
226 void exponential_linear(
const Tensor<type, 2>&, Tensor<type, 2>&)
const;
227 void softmax(
const Tensor<type, 2>&, Tensor<type, 2>&)
const;
228 void binary(
const Tensor<type, 2>&, Tensor<type, 2>&)
const;
229 void competitive(
const Tensor<type, 2>&, Tensor<type, 2>&)
const;
231 void hard_sigmoid_derivatives(
const Tensor<type, 2>&, Tensor<type, 2>&, Tensor<type, 2>&)
const;
232 void hyperbolic_tangent_derivatives(
const Tensor<type, 2>&, Tensor<type, 2>&, Tensor<type, 2>&)
const;
233 void linear_derivatives(
const Tensor<type, 2>&, Tensor<type, 2>&, Tensor<type, 2>&)
const;
234 void logistic_derivatives(
const Tensor<type, 2>&, Tensor<type, 2>&, Tensor<type, 2>&)
const;
235 void threshold_derivatives(
const Tensor<type, 2>&, Tensor<type, 2>&, Tensor<type, 2>&)
const;
236 void symmetric_threshold_derivatives(
const Tensor<type, 2>&, Tensor<type, 2>&, Tensor<type, 2>&)
const;
237 void rectified_linear_derivatives(
const Tensor<type, 2>&, Tensor<type, 2>&, Tensor<type, 2>&)
const;
238 void scaled_exponential_linear_derivatives(
const Tensor<type, 2>&, Tensor<type, 2>&, Tensor<type, 2>&)
const;
239 void soft_plus_derivatives(
const Tensor<type, 2>&, Tensor<type, 2>&, Tensor<type, 2>&)
const;
240 void soft_sign_derivatives(
const Tensor<type, 2>&, Tensor<type, 2>&, Tensor<type, 2>&)
const;
241 void exponential_linear_derivatives(
const Tensor<type, 2>&, Tensor<type, 2>&, Tensor<type, 2>&)
const;
243 void logistic_derivatives(
const Tensor<type, 2>&, Tensor<type, 2>&, Tensor<type, 3>&)
const;
244 void softmax_derivatives(
const Tensor<type, 2>&, Tensor<type, 2>&, Tensor<type, 3>&)
const;
248 void linear(
const Tensor<type, 4>&, Tensor<type, 4>&)
const;
249 void logistic(
const Tensor<type, 4>&, Tensor<type, 4>&)
const;
250 void hyperbolic_tangent(
const Tensor<type, 4>&, Tensor<type, 4>&)
const;
251 void threshold(
const Tensor<type, 4>&, Tensor<type, 4>&)
const;
252 void symmetric_threshold(
const Tensor<type, 4>&, Tensor<type, 4>&)
const;
253 void rectified_linear(
const Tensor<type, 4>&, Tensor<type, 4>&)
const;
254 void scaled_exponential_linear(
const Tensor<type, 4>&, Tensor<type, 4>&)
const;
255 void soft_plus(
const Tensor<type, 4>&, Tensor<type, 4>&)
const;
256 void soft_sign(
const Tensor<type, 4>&, Tensor<type, 4>&)
const;
257 void hard_sigmoid(
const Tensor<type, 4>&, Tensor<type, 4>&)
const;
258 void exponential_linear(
const Tensor<type, 4>&, Tensor<type, 4>&)
const;
260 void linear_derivatives(
const Tensor<type, 4>&, Tensor<type, 4>&, Tensor<type, 4>&)
const;
261 void logistic_derivatives(
const Tensor<type, 4>&, Tensor<type, 4>&, Tensor<type, 4>&)
const;
262 void hyperbolic_tangent_derivatives(
const Tensor<type, 4>&, Tensor<type, 4>&, Tensor<type, 4>&)
const;
263 void threshold_derivatives(
const Tensor<type, 4>&, Tensor<type, 4>&, Tensor<type, 4>&)
const;
264 void symmetric_threshold_derivatives(
const Tensor<type, 4>&, Tensor<type, 4>&, Tensor<type, 4>&)
const;
265 void rectified_linear_derivatives(
const Tensor<type, 4>&, Tensor<type, 4>&, Tensor<type, 4>&)
const;
266 void scaled_exponential_linear_derivatives(
const Tensor<type, 4>&, Tensor<type, 4>&, Tensor<type, 4>&)
const;
267 void soft_plus_derivatives(
const Tensor<type, 4>&, Tensor<type, 4>&, Tensor<type, 4>&)
const;
268 void soft_sign_derivatives(
const Tensor<type, 4>&, Tensor<type, 4>&, Tensor<type, 4>&)
const;
269 void hard_sigmoid_derivatives(
const Tensor<type, 4>&, Tensor<type, 4>&, Tensor<type, 4>&)
const;
270 void exponential_linear_derivatives(
const Tensor<type, 4>&, Tensor<type, 4>&, Tensor<type, 4>&)
const;
272 const Eigen::array<IndexPair<Index>, 1> A_BT = {IndexPair<Index>(1, 1)};
273 const Eigen::array<IndexPair<Index>, 1> AT_B = {IndexPair<Index>(0, 0)};
274 const Eigen::array<IndexPair<Index>, 1> A_B = {IndexPair<Index>(1, 0)};
277 #include "../../opennn-cuda/opennn-cuda/layer_cuda.h"
291 virtual void set(
const Index&, Layer*) {}
293 virtual void print()
const {}
295 Index batch_samples_number = 0;
297 Layer* layer_pointer =
nullptr;
309 virtual void set(
const Index&, Layer*) {}
311 virtual void print()
const {}
313 Index batch_samples_number = 0;
315 Layer* layer_pointer =
nullptr;
327 virtual void set(
const Index&, Layer*) {}
329 virtual void print()
const {}
331 Index batch_samples_number = 0;
333 Layer* layer_pointer =
nullptr;
This abstract class represents the concept of layer of neurons in OpenNN.
Type
This enumeration represents the possible types of layers.
virtual Index get_synaptic_weights_number() const
Returns the number of layer's synaptic weights.
string layer_name
Layer name.
virtual Index get_inputs_number() const
Returns the number of inputs.
Type layer_type
Layer type.
string get_type_string() const
Takes the type of layer used by the model.
Extensions to the C++ standard library.
LayerBackPropagation()
Default constructor.
LayerBackPropagationLM()
Default constructor.
LayerForwardPropagation()
Default constructor.