50 cluster_deltas_vec.clear();
55 for(
int i=0; i<(int)outs.size(); i++ ) {
56 addCluster( outs[i],
true );
59 for(
int i=0; i<(int)update_order.size(); i++ ) {
60 cluster_temp =
dynamic_cast<Cluster*
>(update_order[i]);
62 addCluster( cluster_temp,
false );
67 addLinker( linker_temp );
73 this->update_order = update_order;
78 if ( mapIndex.count( output ) == 0 ) {
81 int index = mapIndex[ output ];
82 subtract( cluster_deltas_vec[index].deltas_outputs, output->
outputs(), ti );
87 if ( mapIndex.count( cl ) == 0 ) {
88 qWarning() <<
"Cluster not present in BackPropagationAlgo";
91 int index = mapIndex[ cl ];
92 return cluster_deltas_vec[index].deltas_outputs;
96 for (
int i=0; i<cluster_deltas_vec.size(); ++i ) {
97 for (
int j=0; j<cluster_deltas_vec[i].incoming_linkers_vec.size(); ++j ) {
99 cluster_deltas_vec[i].incoming_last_outputs[j].zeroing();
100 cluster_deltas_vec[i].last_deltas_inputs.zeroing();
106 void BackPropagationAlgo::propagDeltas() {
108 for(
int i=0; i<(int)cluster_deltas_vec.size(); i++ ) {
109 cluster_deltas_vec[i].incoming_linkers_vec;
111 cluster_deltas_vec[i].deltas_inputs.copyValues( cluster_deltas_vec[i].deltas_outputs );
112 Cluster* cl = cluster_deltas_vec[i].cluster;
114 diff_vec.
resize( cluster_deltas_vec[i].deltas_inputs.size() );
116 cluster_deltas_vec[i].deltas_inputs *= diff_vec;
119 for(
int k=0; k<cluster_deltas_vec[i].incoming_linkers_vec.size( ); ++k ) {
120 MatrixLinker* link =
dynamic_cast<MatrixLinker*
>(cluster_deltas_vec[i].incoming_linkers_vec[k]);
121 if ( mapIndex.count(link->from()) == 0 ) {
125 int from_index = mapIndex[ link->from() ];
126 amul( cluster_deltas_vec[from_index].deltas_outputs, link->matrix(), cluster_deltas_vec[i].deltas_inputs );
134 for (
int i=0; i<cluster_deltas_vec.size(); ++i ) {
135 if ( cluster_deltas_vec[i].isOutput )
continue;
136 cluster_deltas_vec[i].deltas_outputs.zeroing();
141 for (
int i=0; i<cluster_deltas_vec.size(); ++i ) {
142 if ( cluster_deltas_vec[i].cluster != NULL) {
143 DoubleVector minus_ones( cluster_deltas_vec[i].cluster->outputs().size( ), -1.0f );
144 deltarule( cluster_deltas_vec[i].cluster->biases(), -learn_rate, minus_ones, cluster_deltas_vec[i].deltas_inputs );
147 for (
int j=0; j<cluster_deltas_vec[i].incoming_linkers_vec.size(); ++j ) {
148 if ( cluster_deltas_vec[i].incoming_linkers_vec[j] != NULL ) {
150 cluster_deltas_vec[i].incoming_linkers_vec[j]->matrix(),
152 cluster_deltas_vec[i].incoming_linkers_vec[j]->from()->outputs(),
153 cluster_deltas_vec[i].deltas_inputs
155 if ( !useMomentum )
continue;
158 cluster_deltas_vec[i].incoming_linkers_vec[j]->matrix(),
159 -learn_rate*momentumv,
160 cluster_deltas_vec[i].incoming_last_outputs[j],
161 cluster_deltas_vec[i].last_deltas_inputs
164 cluster_deltas_vec[i].incoming_last_outputs[j].copyValues( cluster_deltas_vec[i].incoming_linkers_vec[j]->from()->outputs() );
165 cluster_deltas_vec[i].last_deltas_inputs.copyValues( cluster_deltas_vec[i].deltas_inputs );
175 for(
int i=0; i<clins.size(); i++ ) {
176 clins[i]->inputs().copyValues( pat.
inputsOf( clins[i] ) );
182 for(
int i=0; i<clout.size(); i++ ) {
191 for(
int i=0; i<clins.size(); i++ ) {
192 clins[i]->inputs().copyValues( pat.
inputsOf( clins[i] ) );
199 int dim = (int)clout.size();
200 for(
int i=0; i<dim; i++ ) {
201 mseacc +=
mse( clout[i]->outputs(), pat.
outputsOf( clout[i] ) );
206 void BackPropagationAlgo::addCluster(
Cluster* cl,
bool isOut ) {
207 if( mapIndex.count( cl ) == 0 ) {
211 temp.isOutput = isOut;
212 temp.deltas_outputs.resize( size );
213 temp.deltas_inputs.resize( size );
214 temp.last_deltas_inputs.resize( size );
215 cluster_deltas_vec.push_back( temp );
216 mapIndex[cl] = cluster_deltas_vec.size()-1;
220 void BackPropagationAlgo::addLinker( Linker* link ) {
221 if ( mapIndex.count( link->to() ) == 0 ) {
223 int size = link->to()->numNeurons();
224 temp.cluster =
dynamic_cast<BiasedCluster*
>(link->to());
225 temp.isOutput =
false;
226 temp.deltas_outputs.resize( size );
227 temp.deltas_inputs.resize( size );
228 temp.last_deltas_inputs.resize( size );
229 temp.incoming_linkers_vec.push_back( dynamic_cast<MatrixLinker*>(link) );
230 temp.incoming_last_outputs.push_back( DoubleVector( link->from()->numNeurons() ) );
231 cluster_deltas_vec.push_back( temp );
232 mapIndex[temp.cluster] = cluster_deltas_vec.size()-1;
235 int tmp = mapIndex[link->to()];
236 cluster_deltas_vec[ tmp ].incoming_linkers_vec.push_back( dynamic_cast<MatrixLinker*>(link) );
237 cluster_deltas_vec[ tmp ].incoming_last_outputs.push_back( DoubleVector( link->from()->numNeurons() ) );
243 learn_rate = params.
getValue( prefix +
"rate" ).toDouble();
244 momentumv = params.
getValue( prefix +
"momentum" ).toDouble();
245 if ( momentumv == 0.0 ) {
250 QString str = params.
getValue( prefix +
"order" );
251 update_order.clear();
252 if ( !str.isEmpty() ) {
253 QStringList list = str.split(QRegExp(
"\\s+"), QString::SkipEmptyParts);
254 foreach( QString upl, list ) {
269 params.
createParameter( prefix,
"momentum", QString::number(momentumv) );
284 d.
describeReal(
"momentum" ).
limits( 0.0, 1.0 ).
help(
"The momentum rate; if zero momentum will be disabled" );