neural_network.h
1// OpenNN: Open Neural Networks Library
2// www.opennn.net
3//
4// N E U R A L N E T W O R K C L A S S H E A D E R
5//
6// Artificial Intelligence Techniques SL
7// artelnics@artelnics.com
8
9#ifndef NEURALNETWORK_H
10#define NEURALNETWORK_H
11
12// System includes
13
14#include <cmath>
15#include <cstdlib>
16#include <fstream>
17#include <iostream>
18#include <string>
19#include <sstream>
20#include <errno.h>
21
22// OpenNN includes
23
24#include "config.h"
25#include "data_set.h"
26#include "layer.h"
27#include "perceptron_layer.h"
28#include "scaling_layer.h"
29#include "unscaling_layer.h"
30#include "bounding_layer.h"
31#include "probabilistic_layer.h"
32#include "convolutional_layer.h"
33#include "pooling_layer.h"
34#include "long_short_term_memory_layer.h"
35#include "recurrent_layer.h"
36
37namespace OpenNN
38{
39 struct NeuralNetworkForwardPropagation;
40 struct NeuralNetworkBackPropagation;
41
45
47{
48
49public:
50
51 enum class ProjectType{Approximation, Classification, Forecasting, ImageApproximation, ImageClassification};
52
53 // Constructors
54
55 explicit NeuralNetwork();
56
57 explicit NeuralNetwork(const NeuralNetwork::ProjectType&, const Tensor<Index, 1>&);
58 explicit NeuralNetwork(const NeuralNetwork::ProjectType&, const initializer_list<Index>&);
59
60 explicit NeuralNetwork(const Tensor<Index, 1>&, const Index&, const Tensor<Index, 1>&, const Index&);
61
62 explicit NeuralNetwork(const string&);
63
64 explicit NeuralNetwork(const tinyxml2::XMLDocument&);
65
66 explicit NeuralNetwork(const Tensor<Layer*, 1>&);
67
68 // Destructor
69
70 virtual ~NeuralNetwork();
71
72 // APPENDING LAYERS
73
74 void delete_layers();
75
76 void add_layer(Layer*);
77
78 bool check_layer_type(const Layer::Type);
79
80 // Get methods
81
82 bool has_scaling_layer() const;
84 bool has_recurrent_layer() const;
85 bool has_unscaling_layer() const;
86 bool has_bounding_layer() const;
87 bool has_probabilistic_layer() const;
88 bool has_convolutional_layer() const;
89 bool is_empty() const;
90
91 const Tensor<string, 1>& get_inputs_names() const;
92 string get_input_name(const Index&) const;
93 Index get_input_index(const string&) const;
94
95 const Tensor<string, 1>& get_outputs_names() const;
96 string get_output_name(const Index&) const;
97 Index get_output_index(const string&) const;
98
99 Tensor<Layer*, 1> get_layers_pointers() const;
100 Layer* get_layer_pointer(const Index&) const;
101 Tensor<Layer*, 1> get_trainable_layers_pointers() const;
102 Tensor<Index, 1> get_trainable_layers_indices() const;
103
110
111 Layer* get_last_trainable_layer_pointer() const;
112 PerceptronLayer* get_first_perceptron_layer_pointer() const;
113
114 const bool& get_display() const;
115
116 // Set methods
117
118 void set();
119
120 void set(const NeuralNetwork::ProjectType&, const Tensor<Index, 1>&);
121 void set(const NeuralNetwork::ProjectType&, const initializer_list<Index>&);
122 void set(const Tensor<Index, 1>&, const Index&, const Tensor<Index, 1>&, const Index&);
123
124 void set(const string&);
125
126 void set_layers_pointers(Tensor<Layer*, 1>&);
127
128 void set_inputs_names(const Tensor<string, 1>&);
129 void set_outputs_names(const Tensor<string, 1>&);
130
131 void set_inputs_number(const Index&);
132 void set_inputs_number(const Tensor<bool, 1>&);
133
134 virtual void set_default();
135
136 void set_threads_number(const int&);
137
138
139 void set_scaling_layer(ScalingLayer&);
140
141 void set_display(const bool&);
142
143 // Layers
144
145 Index get_layers_number() const;
146 Tensor<Index, 1> get_layers_neurons_numbers() const;
147
148 Index get_trainable_layers_number() const;
149
150 Index get_perceptron_layers_number() const;
151 Index get_probabilistic_layers_number() const;
152 Index get_long_short_term_memory_layers_number() const;
153 Index get_recurrent_layers_number() const;
154
155 // Architecture
156
157 Index get_inputs_number() const;
158 Index get_outputs_number() const;
159
160 Tensor<Index, 1> get_trainable_layers_neurons_numbers() const;
161 Tensor<Index, 1> get_trainable_layers_inputs_numbers() const;
162 Tensor<Index, 1> get_trainable_layers_synaptic_weight_numbers() const;
163
164 Tensor<Index, 1> get_architecture() const;
165
166 // Parameters
167
168 Index get_parameters_number() const;
169 Tensor<type, 1> get_parameters() const;
170
171 Tensor<Index, 1> get_trainable_layers_parameters_numbers() const;
172 Tensor<Tensor<type, 1>, 1> get_trainable_layers_parameters(const Tensor<type, 1>&) const;
173
174 void set_parameters(Tensor<type, 1>&);
175
176 // Parameters initialization methods
177
178 void set_parameters_constant(const type&);
179
181
182 // Parameters
183
184 type calculate_parameters_norm() const;
185
186 void perturbate_parameters(const type&);
187
188 // Output
189
190 Tensor<type, 2> calculate_outputs(const Tensor<type, 2>&);
191
192 Tensor<type, 2> calculate_outputs(const Tensor<type, 4>&);
193
194 Tensor<type, 2> calculate_directional_inputs(const Index&, const Tensor<type, 1>&, const type&, const type&, const Index& = 101) const;
195
196 // Serialization methods
197
198 Tensor<string, 2> get_information() const;
199 Tensor<string, 2> get_perceptron_layers_information() const;
200 Tensor<string, 2> get_probabilistic_layer_information() const;
201
202 virtual void from_XML(const tinyxml2::XMLDocument&);
203 void inputs_from_XML(const tinyxml2::XMLDocument&);
204 void layers_from_XML(const tinyxml2::XMLDocument&);
205 void outputs_from_XML(const tinyxml2::XMLDocument&);
206
207 virtual void write_XML(tinyxml2::XMLPrinter&) const;
208 // virtual void read_XML( );
209
210 void print() const;
211 void save(const string&) const;
212 void save_parameters(const string&) const;
213
214 virtual void load(const string&);
215 void load_parameters_binary(const string&);
216
217 Tensor<string, 1> get_layers_names() const;
218
219 // Expression methods
220
221 string write_expression() const;
222 string write_expression_python() const;
223 string write_expression_c() const;
224
225 void save_expression_c(const string&);
226 void save_expression_python(const string&);
227
228 void save_outputs(const Tensor<type, 2>&, const string&);
229
231
233 void forward_propagate(const DataSetBatch&, Tensor<type, 1>&, NeuralNetworkForwardPropagation&) const;
234
235protected:
236
237 string name = "neural_network";
238
240
241 Tensor<string, 1> inputs_names;
242
244
245 Tensor<string, 1> outputs_names;
246
248
249 Tensor<Layer*, 1> layers_pointers;
250
252
253 bool display = true;
254
255#ifdef OPENNN_CUDA
256 #include "../../opennn-cuda/opennn-cuda/neural_network_cuda.h"
257#endif
258
259};
260
262{
264
266
267 NeuralNetworkForwardPropagation(const Index& new_batch_samples_number, NeuralNetwork* new_neural_network_pointer)
268 {
269 set(new_batch_samples_number, new_neural_network_pointer);
270 }
271
273
275
276 void set(const Index& new_batch_samples_number, NeuralNetwork* new_neural_network_pointer)
277 {
278 if(new_batch_samples_number == 0) return;
279
280 batch_samples_number = new_batch_samples_number;
281
282 neural_network_pointer = new_neural_network_pointer;
283
284 const Tensor<Layer*, 1> trainable_layers_pointers = neural_network_pointer->get_trainable_layers_pointers();
285
286 const Index trainable_layers_number = trainable_layers_pointers.size();
287
288 layers.resize(trainable_layers_number);
289
290 for(Index i = 0; i < trainable_layers_number; i++)
291 {
292 switch (trainable_layers_pointers(i)->get_type())
293 {
294 case Layer::Type::Perceptron:
295 {
296 layers(i) = new PerceptronLayerForwardPropagation(new_batch_samples_number, trainable_layers_pointers(i));
297 }
298 break;
299
300 case Layer::Type::Probabilistic:
301 {
302 layers(i) = new ProbabilisticLayerForwardPropagation(new_batch_samples_number, trainable_layers_pointers(i));
303 }
304 break;
305
306 case Layer::Type::Recurrent:
307 {
308 layers(i) = new RecurrentLayerForwardPropagation(new_batch_samples_number, trainable_layers_pointers(i));
309 }
310 break;
311
312 case Layer::Type::LongShortTermMemory:
313 {
314 layers(i) = new LongShortTermMemoryLayerForwardPropagation(new_batch_samples_number, trainable_layers_pointers(i));
315 }
316 break;
317
318 case Layer::Type::Convolutional:
319 {
320 layers(i) = new ConvolutionalLayerForwardPropagation(new_batch_samples_number, trainable_layers_pointers(i));
321 }
322 break;
323
324 default: break;
325 }
326 }
327 }
328
329 void print() const
330 {
331 const Index layers_number = layers.size();
332
333 cout << "Layers number: " << layers_number << endl;
334
335 for(Index i = 0; i < layers_number; i++)
336 {
337 cout << "Layer " << i + 1 << endl;
338
339 layers(i)->print();
340 }
341 }
342
343 Index batch_samples_number = 0;
344
345 NeuralNetwork* neural_network_pointer = nullptr;
346
347 Tensor<LayerForwardPropagation*, 1> layers;
348};
349
350
352{
354
355 NeuralNetworkBackPropagation(const Index& new_batch_samples_number, NeuralNetwork* new_neural_network_pointer)
356 {
357 batch_samples_number = new_batch_samples_number;
358
359 neural_network_pointer = new_neural_network_pointer;
360 }
361
362 void set(const Index& new_batch_samples_number, NeuralNetwork* new_neural_network_pointer)
363 {
364 batch_samples_number = new_batch_samples_number;
365
366 neural_network_pointer = new_neural_network_pointer;
367
368 const Tensor<Layer*, 1> trainable_layers_pointers = neural_network_pointer->get_trainable_layers_pointers();
369
370 const Index trainable_layers_number = trainable_layers_pointers.size();
371
372 layers.resize(trainable_layers_number);
373
374 for(Index i = 0; i < trainable_layers_number; i++)
375 {
376 switch (trainable_layers_pointers(i)->get_type())
377 {
378 case Layer::Type::Perceptron:
379 {
380 layers(i) = new PerceptronLayerBackPropagation(new_batch_samples_number, trainable_layers_pointers(i));
381 }
382 break;
383
384 case Layer::Type::Probabilistic:
385 {
386 layers(i) = new ProbabilisticLayerBackPropagation(new_batch_samples_number, trainable_layers_pointers(i));
387 }
388 break;
389
390 case Layer::Type::Recurrent:
391 {
392 layers(i) = new RecurrentLayerBackPropagation(new_batch_samples_number, trainable_layers_pointers(i));
393 }
394 break;
395
396 case Layer::Type::LongShortTermMemory:
397 {
398 layers(i) = new LongShortTermMemoryLayerBackPropagation(new_batch_samples_number, trainable_layers_pointers(i));
399 }
400 break;
401
402 case Layer::Type::Convolutional:
403 {
404 layers(i) = new ConvolutionalLayerBackPropagation(new_batch_samples_number, trainable_layers_pointers(i));
405 }
406 break;
407
408 default: break;
409 }
410 }
411 }
412
413 void print() const
414 {
415 cout << "Neural network back-propagation" << endl;
416
417 const Index layers_number = layers.size();
418
419 cout << "Layers number: " << layers_number << endl;
420
421 for(Index i = 0; i < layers_number; i++)
422 {
423 cout << "Layer " << i + 1 << endl;
424
425 layers(i)->print();
426 }
427 }
428
429 Index batch_samples_number = 0;
430
431 NeuralNetwork* neural_network_pointer = nullptr;
432
433 Tensor<LayerBackPropagation*, 1> layers;
434};
435
436
438{
440
441 NeuralNetworkBackPropagationLM(const Index& new_batch_samples_number, NeuralNetwork* new_neural_network_pointer)
442 {
443 batch_samples_number = new_batch_samples_number;
444
445 neural_network_pointer = new_neural_network_pointer;
446 }
447
448 void set(const Index& new_batch_samples_number, NeuralNetwork* new_neural_network_pointer)
449 {
450 batch_samples_number = new_batch_samples_number;
451
452 neural_network_pointer = new_neural_network_pointer;
453
454 const Tensor<Layer*, 1> trainable_layers_pointers = neural_network_pointer->get_trainable_layers_pointers();
455
456 const Index trainable_layers_number = trainable_layers_pointers.size();
457
458 layers.resize(trainable_layers_number);
459
460 for(Index i = 0; i < trainable_layers_number; i++)
461 {
462 switch (trainable_layers_pointers(i)->get_type())
463 {
464 case Layer::Type::Perceptron:
465
466 layers(i) = new PerceptronLayerBackPropagationLM(new_batch_samples_number, trainable_layers_pointers(i));
467
468 break;
469
470 case Layer::Type::Probabilistic:
471
472 layers(i) = new ProbabilisticLayerBackPropagationLM(new_batch_samples_number, trainable_layers_pointers(i));
473
474 break;
475
476 default:
477 {
478 ostringstream buffer;
479
480 buffer << "OpenNN Exception: NeuralNetwork class.\n"
481 << "Levenberg-Marquardt can only be used with Perceptron and Probabilistic layers.\n";
482
483 throw logic_error(buffer.str());
484 }
485 }
486 }
487 }
488
489 void print()
490 {
491 const Index layers_number = layers.size();
492
493 cout << "Layers number: " << layers_number << endl;
494
495 for(Index i = 0; i < layers_number; i++)
496 {
497 cout << "Layer " << i + 1 << endl;
498
499 layers(i)->print();
500 }
501 }
502
503 Index batch_samples_number = 0;
504
505 NeuralNetwork* neural_network_pointer = nullptr;
506
507 Tensor<LayerBackPropagationLM*, 1> layers;
508};
509
510}
511
512#endif
513
514// OpenNN: Open Neural Networks Library.
515// Copyright(C) 2005-2021 Artificial Intelligence Techniques, SL.
516//
517// This library is free software; you can redistribute it and/or
518// modify it under the terms of the GNU Lesser General Public
519// License as published by the Free Software Foundation; either
520// version 2.1 of the License, or any later version.
521//
522// This library is distributed in the hope that it will be useful,
523// but WITHOUT ANY WARRANTY; without even the implied warranty of
524// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
525// Lesser General Public License for more details.
526
527// You should have received a copy of the GNU Lesser General Public
528// License along with this library; if not, write to the Free Software
529
530// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
This class represents a layer of bounding neurons.
This abstract class represents the concept of layer of neurons in OpenNN.
Definition: layer.h:53
Type
This enumeration represents the possible types of layers.
Definition: layer.h:61
ScalingLayer * get_scaling_layer_pointer() const
Returns a pointer to the scaling layers object composing this neural network object.
string write_expression_c() const
Returns a string with the c function of the expression represented by the neural network.
Tensor< string, 1 > outputs_names
Names of ouputs.
Tensor< Layer *, 1 > get_trainable_layers_pointers() const
Returns a pointer to the trainable layers object composing this neural network object.
bool has_long_short_term_memory_layer() const
void load_parameters_binary(const string &)
bool has_scaling_layer() const
void set_parameters_constant(const type &)
Initializes all the neural and the independent parameters with a given value.
bool check_layer_type(const Layer::Type)
Tensor< Index, 1 > get_trainable_layers_indices() const
Returns a vector with the indices of the trainable layers.
const Tensor< string, 1 > & get_outputs_names() const
Returns a string vector with the names of the variables used as outputs.
type calculate_parameters_norm() const
Returns the norm of the vector of parameters.
const bool & get_display() const
Tensor< Layer *, 1 > layers_pointers
Layers.
Index get_inputs_number() const
Returns the number of inputs to the neural network.
LongShortTermMemoryLayer * get_long_short_term_memory_layer_pointer() const
Returns a pointer to the long short term memory layer of this neural network, if exits.
virtual void from_XML(const tinyxml2::XMLDocument &)
virtual void set_default()
Sets those members which are not pointer to their default values.
bool has_probabilistic_layer() const
virtual void load(const string &)
string write_expression_python() const
Returns a string with the python function of the expression represented by the neural network.
bool has_unscaling_layer() const
bool display
Display messages to screen.
Tensor< type, 2 > calculate_directional_inputs(const Index &, const Tensor< type, 1 > &, const type &, const type &, const Index &=101) const
bool has_recurrent_layer() const
bool has_convolutional_layer() const
bool has_bounding_layer() const
Tensor< Layer *, 1 > get_layers_pointers() const
Returns a pointer to the layers object composing this neural network object.
Index get_input_index(const string &) const
Tensor< string, 2 > get_information() const
const Tensor< string, 1 > & get_inputs_names() const
Returns a string vector with the names of the variables used as inputs.
void save_expression_python(const string &)
virtual ~NeuralNetwork()
Destructor.
void save_parameters(const string &) const
void forward_propagate(const DataSetBatch &, NeuralNetworkForwardPropagation &) const
Calculate forward propagation in neural network.
void save(const string &) const
Tensor< Index, 1 > get_architecture() const
void set_inputs_number(const Index &)
Index get_layers_number() const
string get_output_name(const Index &) const
Index get_output_index(const string &) const
Tensor< type, 2 > calculate_outputs(const Tensor< type, 2 > &)
void set_parameters(Tensor< type, 1 > &)
void save_expression_c(const string &)
Tensor< string, 2 > get_perceptron_layers_information() const
For each perceptron layer: inputs, neurons, activation function.
string get_input_name(const Index &) const
Tensor< string, 2 > get_probabilistic_layer_information() const
For each probabilistic layer: inputs, neurons, activation function.
BoundingLayer * get_bounding_layer_pointer() const
Returns a pointer to the bounding layers object composing this neural network object.
Tensor< string, 1 > inputs_names
Names of inputs.
void print() const
Prints to the screen the most important information about the neural network object.
UnscalingLayer * get_unscaling_layer_pointer() const
Returns a pointer to the unscaling layers object composing this neural network object.
void set_display(const bool &)
ProbabilisticLayer * get_probabilistic_layer_pointer() const
Returns a pointer to the first probabilistic layer composing this neural network.
void set_inputs_names(const Tensor< string, 1 > &)
virtual void write_XML(tinyxml2::XMLPrinter &) const
RecurrentLayer * get_recurrent_layer_pointer() const
Returns a pointer to the recurrent layer of this neural network, if exits.
Index get_parameters_number() const
void perturbate_parameters(const type &)
void save_outputs(const Tensor< type, 2 > &, const string &)
void set_outputs_names(const Tensor< string, 1 > &)
Tensor< type, 1 > get_parameters() const
This class represents a layer of perceptrons.
This class represents a layer of probabilistic neurons.
This class represents a layer of scaling neurons.
Definition: scaling_layer.h:38
This class represents a layer of unscaling neurons.
virtual ~NeuralNetworkForwardPropagation()
Destructor.
NeuralNetworkForwardPropagation()
Default constructor.