00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef _MULTILAYERPERCEPTRON_H__
00017 #define _MULTILAYERPERCEPTRON_H__
00018
00019
00020
00021 #include <string>
00022
00023
00024
00025 #include "perceptron.h"
00026 #include "perceptron_layer.h"
00027 #include "inputs_outputs_information.h"
00028
00029 #include "../utilities/vector.h"
00030 #include "../utilities/matrix.h"
00031
00032
00033
00034 #include "../../parsers/tinyxml/tinyxml.h"
00035
00036
00037 namespace OpenNN
00038 {
00039
00043
00044 class MultilayerPerceptron
00045 {
00046
00047 public:
00048
00049
00050
00051 explicit MultilayerPerceptron(void);
00052
00053
00054
00055 explicit MultilayerPerceptron(const Vector<PerceptronLayer>&);
00056
00057
00058
00059 explicit MultilayerPerceptron(const Vector<unsigned int>&);
00060
00061
00062
00063 explicit MultilayerPerceptron(const unsigned int&, const unsigned int&);
00064
00065
00066
00067 explicit MultilayerPerceptron(const unsigned int&, const unsigned int&, const unsigned int&);
00068
00069
00070
00071 MultilayerPerceptron(const MultilayerPerceptron&);
00072
00073
00074
00075 virtual ~MultilayerPerceptron(void);
00076
00077
00078
00079 MultilayerPerceptron& operator = (const MultilayerPerceptron&);
00080
00081
00082
00083 bool operator == (const MultilayerPerceptron&) const;
00084
00085
00086
00094
00095 inline Vector<unsigned int> arrange_architecture(void) const
00096 {
00097 unsigned int layers_number = count_layers_number();
00098
00099 Vector<unsigned int> architecture;
00100
00101 if(layers_number != 0)
00102 {
00103 unsigned int inputs_number = count_inputs_number();
00104 architecture.resize(1+layers_number);
00105
00106 architecture[0] = inputs_number;
00107
00108 Vector<unsigned int> layers_size = arrange_layers_perceptrons_numbers();
00109
00110 for(unsigned int i = 0; i < layers_number; i++)
00111 {
00112 architecture[i+1] = layers_size[i];
00113 }
00114 }
00115
00116 return(architecture);
00117 }
00118
00119
00121
00122 inline unsigned int count_inputs_number(void) const
00123 {
00124 unsigned int layers_number = count_layers_number();
00125
00126 if(layers_number == 0)
00127 {
00128 return(0);
00129 }
00130 else
00131 {
00132 return(layers[0].count_inputs_number());
00133 }
00134 }
00135
00137
00138 inline unsigned int count_layers_number(void) const
00139 {
00140 return(layers.size());
00141 }
00142
00144
00145 inline Vector<unsigned int> get_layers_inputs_number(void) const
00146 {
00147 unsigned int layers_number = count_layers_number();
00148
00149 Vector<unsigned int> layers_inputs_number(layers_number);
00150
00151 for(unsigned int i = 0; i < layers_number; i++)
00152 {
00153 layers_inputs_number[i] = layers[i].count_inputs_number();
00154 }
00155
00156 return(layers_inputs_number);
00157 }
00158
00159
00161
00162 inline Vector<unsigned int> arrange_layers_perceptrons_numbers(void) const
00163 {
00164 unsigned int layers_number = count_layers_number();
00165
00166 Vector<unsigned int> layers_perceptrons_number(layers_number);
00167
00168 for(unsigned int i = 0; i < layers_number; i++)
00169 {
00170 layers_perceptrons_number[i] = layers[i].count_perceptrons_number();
00171 }
00172
00173 return(layers_perceptrons_number);
00174 }
00175
00176
00178
00179 inline int count_outputs_number(void) const
00180 {
00181 unsigned int layers_number = count_layers_number();
00182
00183 if(layers_number == 0)
00184 {
00185 return(0);
00186 }
00187 else
00188 {
00189 return(layers[layers_number-1].count_perceptrons_number());
00190 }
00191 }
00192
00193 const Vector<PerceptronLayer>& get_layers(void) const;
00194 const PerceptronLayer& get_layer(const unsigned int&) const;
00195 PerceptronLayer* get_layer_pointer(const unsigned int&);
00196
00197 unsigned int count_perceptrons_number(void) const;
00198 Vector<unsigned int> count_cumulative_perceptrons_number(void) const;
00199
00200
00201
00202 Vector<unsigned int> arrange_layers_parameters_number(void) const;
00203 Vector<unsigned int> arrange_layers_cumulative_parameters_number(void) const;
00204
00205 Vector< Vector<double> > arrange_layers_biases(void) const;
00206 Vector< Matrix<double> > arrange_layers_synaptic_weights(void) const;
00207
00208 Vector< Vector<double> > get_layers_parameters(void) const;
00209
00210 unsigned int count_parameters_number(void) const;
00211 Vector<double> arrange_parameters(void) const;
00212
00213 unsigned int get_layer_index(const unsigned int&) const;
00214 unsigned int get_perceptron_index(const unsigned int&, const unsigned int&) const;
00215
00216 unsigned int get_layer_bias_index(const unsigned int&, const unsigned int&) const;
00217 unsigned int get_layer_synaptic_weight_index(const unsigned int&, const unsigned int&, const unsigned int&) const;
00218
00219 Vector<unsigned int> arrange_parameter_indices(const unsigned int&) const;
00220 Matrix<unsigned int> arrange_parameters_indices(void) const;
00221
00222
00223
00224 Vector<Perceptron::ActivationFunction> get_layers_activation_function(void) const;
00225 Vector<std::string> write_layers_activation_function(void) const;
00226
00227
00228
00229 const bool& get_display(void) const;
00230
00231
00232
00233 void set(void);
00234 void set(const Vector<PerceptronLayer>&);
00235 void set(const Vector<unsigned int>&);
00236 void set(const unsigned int&, const unsigned int&);
00237 void set(const unsigned int&, const unsigned int&, const unsigned int&);
00238 void set(const MultilayerPerceptron&);
00239
00240 virtual void set_default(void);
00241
00242
00243
00244 void set_inputs_number(const unsigned int);
00245
00246 void set_layers_perceptrons_number(const Vector<unsigned int>&);
00247 void set_layer_perceptrons_number(const unsigned int&, const unsigned int&);
00248
00249 void set_layers(const Vector<PerceptronLayer>&);
00250
00251
00252
00253
00254 void set_layers_biases(const Vector< Vector<double> >&);
00255 void set_layers_synaptic_weights(const Vector< Matrix<double> >&);
00256
00257 void set_layers_parameters(const Vector< Vector<double> >&);
00258
00259 void set_parameters(const Vector<double>&);
00260
00261 void initialize_biases(const double&);
00262 void initialize_synaptic_weights(const double&);
00263 void initialize_parameters(const double&);
00264
00265 void initialize_parameters_uniform(void);
00266 void initialize_parameters_uniform(const double&, const double&);
00267 void initialize_parameters_uniform(const Vector<double>&, const Vector<double>&);
00268 void initialize_parameters_uniform(const Vector< Vector<double> >&);
00269
00270 void initialize_parameters_normal(void);
00271 void initialize_parameters_normal(const double&, const double&);
00272 void initialize_parameters_normal(const Vector<double>&, const Vector<double>&);
00273 void initialize_parameters_normal(const Vector< Vector<double> >&);
00274
00275 void initialize_parameters(void);
00276
00277 double calculate_parameters_norm(void) const;
00278
00279
00280
00281 void set_layers_activation_function(const Vector<Perceptron::ActivationFunction>&);
00282 void set_layers_activation_function(const Vector<std::string>&);
00283
00284
00285
00286 void set_display(const bool&);
00287
00288
00289
00290 bool is_empty(void) const;
00291
00292
00293
00294 void grow_input(const unsigned int&);
00295 void grow_layer(const unsigned int&, const unsigned int&);
00296
00297 void prune_input(const unsigned int&);
00298 void prune_layer(const unsigned int&, const unsigned int&);
00299
00300
00301
00302 void initialize_random(void);
00303
00304
00305
00306 Vector<double> calculate_layer_combination_combination(const unsigned int&, const Vector<double>&) const;
00307 Matrix<double> calculate_layer_combination_combination_Jacobian(const unsigned int&, const Vector<double>&) const;
00308
00309
00310
00311 Vector<double> calculate_output_layer_combination(const unsigned int&, const Vector<double>&) const;
00312
00313 Vector< Matrix<double> > calculate_output_layers_delta(const Vector< Vector<double> >&) const;
00314
00315
00316
00317
00318 Matrix< Vector< Matrix<double> > > calculate_output_interlayers_Delta(const Vector< Vector< Vector<double> > >&, const Matrix< Matrix<double> >&, const Vector< Matrix<double> >&) const;
00319
00320
00321
00322 Vector<double> calculate_interlayer_combination_combination(const unsigned int&, const unsigned int&, const Vector<double>&) const;
00323 Matrix<double> calculate_interlayer_combination_combination_Jacobian(const unsigned int&, const unsigned int&, const Vector<double>&) const;
00324
00325
00326
00327 Vector< Vector<double> > calculate_layers_input(const Vector<double>&) const;
00328 Vector< Vector<double> > arrange_layers_input(const Vector<double>&, const Vector< Vector<double> >&) const;
00329
00330
00331
00332 Vector< Vector<double> > calculate_layers_combination(const Vector<double>&) const;
00333 Vector< Matrix<double> > calculate_layers_combination_Jacobian(const Vector<double>&) const;
00334
00335 Vector< Matrix<double> > calculate_layers_combination_parameters_Jacobian(const Vector< Vector<double> >&) const;
00336
00337 Vector< Vector< Vector<double> > > calculate_perceptrons_combination_parameters_gradient(const Vector< Vector<double> >&) const;
00338
00339
00340
00341 Vector< Vector<double> > calculate_layers_activation(const Vector<double>&) const;
00342 Vector< Vector<double> > calculate_layers_activation_derivative(const Vector<double>&) const;
00343 Vector< Vector<double> > calculate_layers_activation_second_derivative(const Vector<double>&) const;
00344
00345
00346
00347
00348 Vector< Matrix<double> > calculate_layers_Jacobian(const Vector<double>&) const;
00349 Vector< Vector< Matrix<double> > > calculate_layers_Hessian_form(const Vector<double>&) const;
00350
00351 Matrix <Matrix<double> > calculate_interlayers_combination_combination_Jacobian(const Vector<double>&) const;
00352 Matrix <Matrix<double> > calculate_interlayers_combination_combination_Jacobian(const Vector< Vector<double> >&) const;
00353
00354
00355
00356
00357 Vector< Vector< Vector<double> > > calculate_first_order_forward_propagation(const Vector<double>&) const;
00358 Vector< Vector< Vector<double> > > calculate_second_order_forward_propagation(const Vector<double>&) const;
00359
00360
00361
00362 Vector<double> calculate_outputs(const Vector<double>&) const;
00363 Matrix<double> calculate_Jacobian(const Vector<double>&) const;
00364 Vector< Matrix<double> > calculate_Hessian_form(const Vector<double>&) const;
00365
00366
00367 Matrix<double> calculate_parameters_Jacobian(const Vector<double>&, const Vector<double>&) const;
00368 Vector< Matrix<double> > calculate_parameters_Hessian_form(const Vector<double>&, const Vector<double>&) const;
00369
00370
00371
00372 TiXmlElement* to_XML(void) const;
00373 void from_XML(TiXmlElement*);
00374
00375
00376
00377 std::string write_expression(const Vector<std::string>&, const Vector<std::string>&) const;
00378
00379 std::string to_string(void) const;
00380
00381
00382 protected:
00383
00384
00385
00389
00390 Vector<PerceptronLayer> layers;
00391
00393
00394 bool display;
00395 };
00396
00397 }
00398
00399 #endif
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419