00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
#ifndef __MULTILAYERFFNN_H
00040
#define __MULTILAYERFFNN_H
00041
00042
#include <vector>
00043
00044
#include "feedforwardnn.h"
00045
#include "invertablemodel.h"
00046
00047 class Layer :
public Storeable {
00048
public:
00049 Layer(
int size,
double factor_bias=0.1,
00050
ActivationFunction actfun = FeedForwardNN::linear,
00051
ActivationFunction dactfun = FeedForwardNN::dlinear)
00052 : size(size), factor_bias(factor_bias),
actfun(
actfun),
dactfun(
dactfun) {}
00053
00054
00055
00056
bool store(FILE* f)
const;
00057
00058
bool restore(FILE* f);
00059
00060 int size;
00061 double factor_bias;
00062 ActivationFunction actfun;
00063 ActivationFunction dactfun;
00064
00065
00066
friend std::ostream&
operator<<(std::ostream& ,
const Layer&);
00067 };
00068
00069
00070 class MultiLayerFFNN :
public FeedForwardNN,
public InvertableModel {
00071
public:
00072
00073
00074
00075
00076 MultiLayerFFNN(
double eps,
const std::vector<Layer>& layers)
00077 : eps(eps), layers(layers) {
00078
00079
initialised =
false;
00080 }
00081 virtual ~MultiLayerFFNN(){ }
00082
00083
00084
virtual void init(
unsigned int inputDim,
unsigned int outputDim,
double unit_map = 0.0);
00085
00086
00087
virtual const matrix::Matrix process (
const matrix::Matrix& input);
00088
00089
00090
00091
virtual const matrix::Matrix learn (
const matrix::Matrix& input,
00092
const matrix::Matrix& nom_output,
00093
double learnRateFactor = 1);
00094
00095
00096
00097
00098
virtual const matrix::Matrix response(
const matrix::Matrix& input)
const;
00099
00100
00101 virtual unsigned int getInputDim()
const {
00102
return weights[0].getN();
00103 }
00104
00105 virtual unsigned int getOutputDim()
const {
00106
return (
weights.rbegin())->getM();
00107 }
00108
00109
00110
virtual void damp(
double damping);
00111
00112
00113
00114
00115
bool store(FILE* f)
const;
00116
00117
bool restore(FILE* f);
00118
00119
00120
00121 virtual paramkey
getName()
const {
00122
return std::string(
"multilayerffnn");
00123 }
00124
00125 virtual paramval
getParam(
const paramkey& key)
const {
00126
if(key ==
"epsM")
return eps;
00127
else return 0.0;
00128 }
00129
00130 virtual bool setParam(
const paramkey& key, paramval val){
00131
if( key ==
"epsM") {
00132
eps = val;
00133
return true;
00134 }
else return false;
00135 }
00136
00137 virtual paramlist
getParamList()
const{
00138 paramlist l;
00139 l.push_back(std::pair<paramkey, paramval> (
"epsM",
eps));
00140
return l;
00141 }
00142
00143 virtual const Layer&
getLayer(
unsigned int layer)
const {
00144 assert(layer <
layers.size());
00145
return layers[layer];
00146 }
00147
00148 virtual const matrix::Matrix&
getWeights(
unsigned int to_layer)
const {
00149 assert(to_layer <
weights.size());
00150
return weights[to_layer];
00151 }
00152
00153 virtual const matrix::Matrix&
getBias(
unsigned int of_layer)
const {
00154 assert(of_layer <
bias.size());
00155
return bias[of_layer];
00156 }
00157
00158
protected:
00159 double eps;
00160 std::vector<Layer>
layers;
00161 std::vector<matrix::Matrix>
weights;
00162 std::vector<matrix::Matrix>
bias;
00163
00164 std::vector<matrix::Matrix>
ys;
00165 std::vector<matrix::Matrix>
zs;
00166
00167 bool initialised;
00168 };
00169
00170
#endif