Files
ia2005/backprop/outputCouche.cpp
2024-11-12 17:41:10 +01:00

67 lines
2.1 KiB
C++

#include "outputCouche.h"
OutputCouche::OutputCouche() : Couche(){
//cout << " Create empty PrevChange Matrix [in OutputCouche()]\n";
prevChange = SynapseMatrix();
//cout << " Done\n";
}
OutputCouche::OutputCouche(const unsigned int nbr,const HiddenCouche *prev) : Couche(nbr,NULL){
prevCouche = prev;
if(prev)
prevChange = SynapseMatrix(prev->getNumber(),getNumber());
else
prevChange = SynapseMatrix();
}
void OutputCouche::setPrevCouche(const HiddenCouche *prev){
prevCouche = prev;
//cout << " Create Synapse PrevChange [in OutputCouche.setPrevCouche(const HiddenCouche *prev)]\n";
prevChange = SynapseMatrix(prev->getNumber(),getNumber());
//cout << prevChange;
//cout << " Done\n";
}
void OutputCouche::activate(){
unsigned int prevSize = prevCouche->getNumber();
unsigned int thisSize = getNumber();
double sum;
for(unsigned int i=0; i < thisSize ; ++i){
sum = 0.0;
for(unsigned int j=0; j < prevSize ; ++j){
sum += (*prevCouche)[j].getWeight() * (*prevCouche).getSynapse(j,i).getWeight();
}
(*this)[i] = util.sigmoid(sum);
}
}
void OutputCouche::backPropagate(const std::vector<double> deltaOutput){
unsigned int prevSize = prevCouche->getNumber();
unsigned int thisSize = getNumber();
double change;
for(unsigned int i=0; i < prevSize ; ++i){
for(unsigned int j=0; j < thisSize ; ++j){
change = (deltaOutput[j] * (*prevCouche)[i].getWeight());
(*prevCouche).getSynapse(i,j) = (*prevCouche).getSynapse(i,j).getWeight() + LEARNING_RATE*change + MOMENTUM*getChange(i,j);
prevChange(i,j) = change;
}
}
}
double OutputCouche::getChange(const unsigned int neurPrevCouche,const unsigned int neurThisCouche) const throw(const unsigned int, std::string){
return prevChange(neurPrevCouche,neurThisCouche).getWeight();
}
void OutputCouche::printMatrix(){
cout << prevChange;
}
OutputCouche& OutputCouche::operator=(const OutputCouche& c){
if(this!=&c){
Couche::operator=(c);
prevChange = c.prevChange;
}
return (*this);
};