15 #include <yarp/math/Math.h>
19 using namespace yarp::os;
20 using namespace yarp::sig;
21 using namespace yarp::math;
33 ff2LayNN::ff2LayNN(
const Property &options)
40 bool ff2LayNN::isValid()
const
47 void ff2LayNN::setItem(Property &options,
const string &tag,
const Vector &item)
const
49 Bottle b; Bottle &v=b.addList();
50 for (
size_t i=0; i<item.length(); i++)
51 v.addFloat64(item[i]);
53 options.put(tag,b.get(0));
58 bool ff2LayNN::getItem(
const Property &options,
const string &tag, Vector &item)
const
60 if (Bottle *b=options.find(tag).asList())
62 item.resize(b->size());
63 for (
size_t i=0; i<item.length(); i++)
64 item[i]=b->get(i).asFloat64();
74 void ff2LayNN::prepare()
76 inMinX.resize(inMinMaxX.size());
77 inMinY.resize(inMinMaxX.size());
78 inRatio.resize(inMinMaxX.size());
80 for (
size_t i=0; i<inMinX.length(); i++)
82 inMinX[i]=inMinMaxX[i].min;
83 inMinY[i]=inMinMaxY[i].min;
84 inRatio[i]=(inMinMaxY[i].max-inMinMaxY[i].min)/(inMinMaxX[i].
max-inMinMaxX[i].
min);
87 outMinX.resize(outMinMaxX.size());
88 outMinY.resize(outMinMaxX.size());
89 outRatio.resize(outMinMaxX.size());
91 for (
size_t i=0; i<outMinX.length(); i++)
93 outMinX[i]=outMinMaxX[i].min;
94 outMinY[i]=outMinMaxY[i].min;
95 outRatio[i]=(outMinMaxX[i].max-outMinMaxX[i].min)/(outMinMaxY[i].
max-outMinMaxY[i].
min);
101 bool ff2LayNN::configure(
const Property &options)
115 if (!options.check(
"numInputNodes") || !options.check(
"numHiddenNodes") ||
116 !options.check(
"numOutputNodes"))
119 int numHiddenNodes=options.find(
"numHiddenNodes").asInt32();
120 for (
int i=0; i<numHiddenNodes; i++)
126 if (getItem(options,tag.str(),item))
132 if (!getItem(options,
"b1",b1))
135 int numOutputNodes=options.find(
"numOutputNodes").asInt32();
136 for (
int i=0; i<numOutputNodes; i++)
142 if (getItem(options,tag.str(),item))
148 if (!getItem(options,
"b2",b2))
151 int numInputNodes=options.find(
"numInputNodes").asInt32();
152 for (
int i=0; i<numInputNodes; i++)
154 ostringstream tagX, tagY;
157 tagX<<
"inMinMaxX_"<<i;
158 tagY<<
"inMinMaxY_"<<i;
159 if (!getItem(options,tagX.str(),itemX) || !getItem(options,tagY.str(),itemY))
169 inMinMaxX.push_back(X);
170 inMinMaxY.push_back(Y);
174 for (
int i=0; i<numOutputNodes; i++)
176 ostringstream tagX, tagY;
179 tagX<<
"outMinMaxX_"<<i;
180 tagY<<
"outMinMaxY_"<<i;
181 if (!getItem(options,tagX.str(),itemX) || !getItem(options,tagY.str(),itemY))
191 outMinMaxX.push_back(X);
192 outMinMaxY.push_back(Y);
199 return configured=
true;
204 Vector ff2LayNN::scaleInputToNetFormat(
const Vector &
x)
const
206 return (inRatio*(
x-inMinX)+inMinY);
211 Vector ff2LayNN::scaleInputFromNetFormat(
const Vector &
x)
const
213 return ((
x-inMinY)/inRatio+inMinX);
218 Vector ff2LayNN::scaleOutputToNetFormat(
const Vector &
x)
const
220 return ((
x-outMinX)/outRatio+outMinY);
225 Vector ff2LayNN::scaleOutputFromNetFormat(
const Vector &
x)
const
227 return (outRatio*(
x-outMinY)+outMinX);
232 Vector ff2LayNN::predict(
const Vector &
x)
const
237 Vector
x1=scaleInputToNetFormat(
x);
240 Vector n1(IW.size());
241 for (
size_t i=0; i<n1.length(); i++)
243 Vector a1=hiddenLayerFcn(n1);
246 Vector n2(LW.size());
247 for (
size_t i=0; i<n2.length(); i++)
249 Vector a2=outputLayerFcn(n2);
252 return scaleOutputFromNetFormat(a2);
260 bool ff2LayNN::getStructure(Property &options)
const
264 options.put(
"numHiddenNodes",(
int)IW.size());
265 options.put(
"numOutputNodes",(
int)LW.size());
266 options.put(
"numInputNodes",(
int)inMinMaxX.size());
268 for (
size_t i=0; i<IW.size(); i++)
273 setItem(options,tag.str(),IW[i]);
276 setItem(options,
"b1",b1);
278 for (
size_t i=0; i<LW.size(); i++)
283 setItem(options,tag.str(),LW[i]);
286 setItem(options,
"b2",b2);
288 for (
size_t i=0; i<inMinMaxX.size(); i++)
290 ostringstream tagX, tagY;
291 tagX<<
"inMinMaxX_"<<i;
292 tagY<<
"inMinMaxY_"<<i;
295 X[0]=inMinMaxX[i].min;
296 X[1]=inMinMaxX[i].max;
299 Y[0]=inMinMaxY[i].min;
300 Y[1]=inMinMaxY[i].max;
302 setItem(options,tagX.str(),X);
303 setItem(options,tagY.str(),Y);
306 for (
size_t i=0; i<outMinMaxX.size(); i++)
308 ostringstream tagX, tagY;
309 tagX<<
"outMinMaxX_"<<i;
310 tagY<<
"outMinMaxY_"<<i;
313 X[0]=outMinMaxX[i].min;
314 X[1]=outMinMaxX[i].max;
317 Y[0]=outMinMaxY[i].min;
318 Y[1]=outMinMaxY[i].max;
320 setItem(options,tagX.str(),X);
321 setItem(options,tagY.str(),Y);
329 bool ff2LayNN::printStructure(ostream &stream)
const
331 stream<<
"***** Input Layer Range *****"<<endl;
332 for (
size_t i=0; i<inMinMaxX.size(); i++)
333 stream<<i<<
": X ["<<inMinMaxX[i].
min<<
" "<<inMinMaxX[i].
max
334 <<
"]; Y ["<<inMinMaxY[i].
min<<
" "<<inMinMaxY[i].
max<<
"]"<<endl;
336 stream<<
"***** Hidden Layer Weights *****"<<endl;
337 for (
size_t i=0; i<IW.size(); i++)
338 stream<<
"IW_"<<i<<
": ["<<IW[i].
toString(16,1)<<
"]"<<endl;
340 stream<<
"***** Hidden Layer Bias *****"<<endl;
341 stream<<
"b1: ["<<b1.toString(16,1)<<
"]"<<endl;
343 stream<<
"***** Output Layer Weights *****"<<endl;
344 for (
size_t i=0; i<LW.size(); i++)
345 stream<<
"LW_"<<i<<
": ["<<LW[i].
toString(16,1)<<
"]"<<endl;
347 stream<<
"***** Output Layer Bias *****"<<endl;
348 stream<<
"b2: ["<<b2.toString(16,1)<<
"]"<<endl;
350 stream<<
"***** Output Layer Range *****"<<endl;
351 for (
size_t i=0; i<outMinMaxX.size(); i++)
352 stream<<i<<
": Y ["<<outMinMaxY[i].
min<<
" "<<outMinMaxY[i].
max
353 <<
"]; X ["<<outMinMaxX[i].
min<<
" "<<outMinMaxX[i].
max<<
"]"<<endl;
355 return stream.good();
360 ff2LayNN_tansig_purelin::ff2LayNN_tansig_purelin() :
376 Vector
y(
x.length());
377 for (
size_t i=0; i<
x.length(); i++)
378 y[i]=2.0/(1.0+
exp(-2.0*
x[i]))-1.0;
394 Vector
y(
x.length());
395 for (
size_t i=0; i<
x.length(); i++)
397 double tmp1=
exp(-2.0*
x[i]);
398 double tmp2=1.0+tmp1;
399 y[i]=(4.0*tmp1)/(tmp2*tmp2);
409 return Vector(
x.length(),1.0);
virtual yarp::sig::Vector hiddenLayerGrad(const yarp::sig::Vector &x) const
Gradient of the Hidden Layer Function.
ff2LayNN_tansig_purelin()
Create an empty network.
virtual yarp::sig::Vector outputLayerGrad(const yarp::sig::Vector &x) const
Gradient of the Output Layer Function.
virtual yarp::sig::Vector outputLayerFcn(const yarp::sig::Vector &x) const
Output Layer Function.
virtual yarp::sig::Vector hiddenLayerFcn(const yarp::sig::Vector &x) const
Hidden Layer Function.
Feed-Forward 2 layers Neural Network.
double dot(const yarp::sig::Matrix &A, int colA, const yarp::sig::Matrix &B, int colB)
Returns the dot product between two vectors given in the form: matrix(:,col).
std::string toString(const T &t)