00001 #ifndef MULTILAYERNETWORK_H
00002 #define MULTILAYERNETWORK_H
00003
00004
00005 #include "Layer.h"
00006 #include "InputLayer.h"
00007 #include "Network.h"
00008 #include "TrainingSet.h"
00009 #include "Control.h"
00010
00011 namespace annie
00012 {
00026 class MultiLayerNetwork : public Network
00027 {
00028 protected:
00034 uint _nLayers;
00035
00037 std::vector<Layer *> _layers;
00038
00040 InputLayer *_inputLayer();
00041
00043 Layer *_outputLayer();
00044
00046 void _layerValid(uint layer) const;
00047
00048 void _connectLayer(Layer &srcLayer, Layer &destLayer);
00049 public:
00050 static const real DEFAULT_MOMENTUM, DEFAULT_LEARNINGRATE;
00051 static const Creal CDEFAULT_MOMENTUM, CDEFAULT_LEARNINGRATE;
00055 #ifndef CONTROL
00056 MultiLayerNetwork(uint inputs);
00057 #else
00058 MultiLayerNetwork(uint inputs, uint neuronLabelOffset=0, PublicValues &pv=defaultControl);
00059 MultiLayerNetwork(uint inputs, PublicValues &pv);
00060 #endif
00061
00063 MultiLayerNetwork(MultiLayerNetwork &srcNet);
00064
00069 MultiLayerNetwork(const std::string &filename);
00070
00071 virtual ~MultiLayerNetwork();
00072
00074 virtual void addLayer(int size);
00075
00082 virtual void connectLayer(uint srcLlayer);
00083
00090 virtual void connect(uint srcLlayer, int srcNrn, int destNrn);
00091
00099 virtual void connect(uint srcLlayer, int srcNrn, int destNrn, real weight);
00100
00106 virtual void setBias(uint layer, int nrn, real bias);
00107
00109 virtual uint getLayerCount() const;
00110
00115 virtual Vector getOutput(const Vector &input);
00116
00121 virtual Vector getOutput(real *input);
00122
00131 virtual void train(TrainingSet &T, uint epochs, real learningRate=DEFAULT_LEARNINGRATE, real momentum = DEFAULT_MOMENTUM);
00132
00133 virtual void train(TrainingSet &T, Creal epochs, Creal learningRate=CDEFAULT_LEARNINGRATE, Creal momentum = CDEFAULT_MOMENTUM);
00134
00136 virtual void train(TrainingSet &T, PublicValues ¶meters);
00137
00139 void getError(TrainingSet &ts);
00140
00142 void getErrorGREN(TrainingSet &ts);
00143
00144 struct Error;
00146 Error getErrorGREN(const Vector &input, const Vector &desired);
00147
00152 virtual void trainExample(const Vector& input, const Vector& desiredOutput, real learningRate=DEFAULT_LEARNINGRATE, real momentum = DEFAULT_MOMENTUM);
00153
00159 virtual void save(const std::string &filename);
00160
00169 virtual void setActivationFunction(uint layer, ActivationFunction f, ActivationFunction df);
00170
00172 virtual const char *getClassName() const;
00173
00174
00176 void resetWeights();
00177
00182 const Layer &getLayer(uint layer) const;
00183
00187 uint getNeuronsCount() const;
00188
00192 uint getLinksCount() const;
00193
00194
00199 Layer &getLayer(uint layer);
00200
00202 operator std::string() const;
00203 #ifdef CONTROL
00204 PublicValues &getControl() { return *_control; }
00205 void setControl(PublicValues &ctrl) { _control = &ctrl; }
00206
00207 void setLabelOffset(uint firstLabel) { _neuronLabelOffset = firstLabel; }
00208
00215 virtual void trainGREN(MultiLayerNetwork &errorNetwork, TrainingSet &ts, uint epochs, real learningRate=DEFAULT_LEARNINGRATE, real momentum = DEFAULT_MOMENTUM);
00216 protected:
00218 void _attachGREN(MultiLayerNetwork &errorNetwork, bool detach);
00219
00221 void _trainExampleGREN(MultiLayerNetwork &errorNetwork, const Vector& input, real learningRate, real momentum);
00222
00223 PublicValues *_control;
00224
00227 struct Error {
00230 void operator+= (const Error &e) { _val += e._val; }
00231 Error(const Vector &diff);
00232 Error() :_val(2) { zero(); }
00233 Error(real delta);
00234
00237 void publish(std::string name, real per=0, PublicValues &pv=defaultControl);
00238 void zero() { _val[0] = 0; _val[1] = 0; }
00239 real getSq() const { return _val[0]; }
00240 real getAbs() const { return _val[1]; }
00241 protected:
00242 Vector _val;
00243 };
00244 Error _exampleError;
00245 #endif
00246 uint _neuronLabelOffset;
00247 };
00248
00250 #define DEFAULT_MLP_NPARS \
00251 { "learningRate", "learing rate (alpha)", MultiLayerNetwork::DEFAULT_LEARNINGRATE }, \
00252 { "momentum", "learning momentum", MultiLayerNetwork::DEFAULT_MOMENTUM}, \
00253 { "epochs", "how many epochs to train. You can usually keep it inf and interrupt by ESC if neccesary", 1000. },
00254
00255 };
00256 #endif // define _MULTILAYERNETWORK_H
00257