Читайте также: |
|
Методы класса TNetManager реализуют логику поведения нейросети в процессе обучения, построения и аппроксимации, т.е. реализуют основные алгоритмы.
class TNetManager
{
public:
double r,p,A,delta,eps;//параметры алгоритма
int Nst;
TNetStream* Stream;//текущий обучаемый поток
double (*XY) [2];//входная выборка
TNetManager(double r,double p,double A,double d,double e, int nst, int sz);
~ TNetManager(){};
void changeMap(double,double*);//изменение параметров сети
double increase(double,double*);//поиск оптимального шага в сторону увеличения
double decrease(double,double*);//поиск оптимального шага в сторону уменьшения
double parabola(double,double,double,double,double*); //поиск оптимального шага в направлении параболы
double countError(double,double*);//вычисление ошибки потока сети с измененными параметрами
double countError();//вычисление ошибки сети до изменения параметров
void Study();//алгоритм обучения потока
};
Алгоритм обучения нейросети начинает работать после указания всех необходимых параметров алгоритма в диалоговом окне.(рисунок 4.4)
Рисунок 4.4 – Диалоговое окно при обучении сети
После запуска процесса обучения система функционирует так, как представлено на рисунке 4.5.
Рисунок 4.5 – Диаграмма состояний нейросети
Программная реализация функционирования сети в процессе обучения будет следующей.
// Сформировали набор функций
TList* functionsList = new TList();
functionsList->Add(new TF1());
functionsList->Add(new TF2());
functionsList->Add(new TF3());
//Создали менеджер сети, Взяли базу данных из файла в задачник менеджера сети
Задачник сети представляет собой матрицу (N+1)xP, где N-число переменных функции, P-количество обучающих примеров.
M->Lines->LoadFromFile(leFile->Text);//file with study set (xi,yi)
TNetManager NetMan(StrToFloat(frmStudyNet->ler->Text),StrToFloat(frmStudyNet->lep->Text),StrToFloat(frmStudyNet->leA->Text),StrToFloat(frmStudyNet->led->Text),StrToFloat(frmStudyNet->lee->Text), StrToInt(frmStudyNet->leNst->Text),M->Lines->Count);
for (int i=0;i<M->Lines->Count;i++)
{
int xCharNumber = M->Lines->Strings[i].Pos(";");
int yCharNumber = M->Lines->Strings[i].Length() - M->Lines->Strings[i].Pos(";");
AnsiString xString = M->Lines->Strings[i].SubString(1, xCharNumber - 1);
AnsiString yString = M->Lines->Strings[i].SubString(M->Lines->Strings[i].Pos(";")+1, yCharNumber);
NetMan.XY[i][0]=StrToFloat(xString);
NetMan.XY[i][1]=StrToFloat(yString);
};
//Создали пустую сеть
TNet RBFNet(M->Lines->Count,NetMan.XY);//create net with one stream
//цикл обучения сети
NetMan.Stream=RBFNet.StreamsFirst;//point to one existing stream in empty net
NetMan.Stream->functionList=functionsList;
double H=10;
while (H>StrToFloat(leH->Text))
{
NetMan.Study();
if (RBFNet.StreamsFirst->link!=NULL) NetMan.Stream=RBFNet.AddStream();
H=RBFNet.countError(NetMan.XY);
;};
}
Как уже было отмечено ранее обучение сети есть итерационный процесс обучения элементарных структур – «потоков». Схема алгоритма представлена на рисунке 4.6.
Алгоритм обучения потока также реализует класс TNetManager.
void TNetManager::Study(){
double * st=new double[sizeof(this->Stream->alpha0)];
for(int i=0;i<this->Stream->functionList->Count;i++){
TFunction* function = (TFunction*)this->Stream->functionList->Items[i];
int iNst=0;
while(iNst<Nst){
double h0 = 0.1;
this->Stream->initializeMap(function);
double * s = this->Stream->gradient(st);
double Hp = this->countError();
double Hs = this->countError(h0,s);//h0*s + alpha0
if(Hp >= Hs){
changeMap(increase(h0,s),s);
} else {
changeMap(decrease(h0,s),s);
}
iNst++;
}
}
};
Следующий метод вычисляет фунцию ошибки аппроксимации потока.
double TNetManager::countError(double h0, double* s){
double H=0;
double wjk=0;
double wk=0;
double xj=0;
double yj=0;
double an=0;
double ac=0;
int k=0;
for (int j=0;j<sizeof(this->XY[1]);j++)
{
for (k=0;k<sizeof(this->Stream->alpha0)-3;k++)
{
wjk=Stream->alpha0[k]+h0*s[k];
xj=xj+wjk*XY[k][0];
};
wk=Stream->alpha0[k]+h0*s[k];
an=Stream->alpha0[k+1]+h0*s[k+1];
ac=Stream->alpha0[k+2]+h0*s[k+2];
yj=Stream->Neuron->function->execute(xj,an,ac);
H=H+pow(wk*yj-XY[j][1],2);
};
return H;
};
Далее представлены алгоритмы, реализующие градиентный метод поиска оптимального значения шага.
double TNetManager::parabola(double h0,double h1,double h2,double h3,double* s){
bool f1,f2;
double H1=this->countError(h1,s);
double H2=this->countError(h2,s);
double H3=this->countError(h3,s);
int k=0;
while(f1||f2||(k<Nst))
{
double W=(h3+h1)/2-(H3-H1)/((H3-H2)/(h3-h2)-(H2-H1)/(h2-h1));
double Hw=this->countError(W,s);
k++;
if (H2<Hw)
{
if (W>h2)
{
h3=W;
H3=Hw;
}
else
{
h1=W;
H1=Hw;
};
}
else
{
if (W>h2)
{
h3=h2;
h2=W;
H3=H2;
H2=Hw;
}
else
{
h1=h2;
h2=W;
H1=H2;
H2=Hw;
};
};
f1= abs(H3-H2)<delta||abs(H2-H1)<delta;
f2= abs(h3-h2)<eps||abs(h2-h1)<eps;
};
return (((H3>H2)?h2:h3)>H1)?h1:((H3>H2)?h2:h3);
};
double TNetManager::increase(double h0,double* s){
double h1=0;
double h2=h0;
double h3=r*h0;
bool endFlag=false;
while (!endFlag)
{
double H1=this->countError(h1,s);
double H2=this->countError(h2,s);
double H3=this->countError(h3,s);
if (H3>A)
{
endFlag=true;
}
else
{
if (abs((h3-h2)/h3)<eps&&abs(H3-H2)<delta)
{
endFlag=true;
return (H3>H2)?h2:h3;
}
else
{
bool cmpFlag=false;
while (!cmpFlag)
{
if (H3>H2)
{
endFlag=true;
cmpFlag=true;
return parabola(h0,h1,h2,h3,s);
}
else
{
if (H2<(H3*(h3-h2)+H1*(h2-h1))/(h3-h1))
{
double W=(h3+h1)/2-(H3-H1)/((H3-H2)/(h3-h2)-(H2-H1)/(h2-h1));
if (W>h3)
{
h1=h2;
h2=W;
cmpFlag=true;
}
else
{
h1=h2;
h2=h3;
h3=W;
H1=H2;
H2=H3;
H3=this->countError(h3,s);
};
}
else
{
h1=h2;
h2=h3;
h3=r*h2;
};
};
};
};
};
};
};
double TNetManager::decrease(double h0, double* s){
bool parFlag=false;
bool zstFlag=false;
double h1=h0*p;
double h2=0;
double h3=0;
double H2=0;
double H1= this->countError(h1,s);
double H0= this->countError(h0,s);//do not shure
if (h1>eps)
{
zstFlag=true;
if (!parFlag) return 0;
else
{
H2=this->countError(p*h1,s);
if (H0>H2&&H2<H1)
{
h3=h1;
h2=p*h1;
h1=0;
return parabola(h0,h1,h2,h3,s);
}
else return 0;
};
}
else
{
if (H1<H2)
{
parFlag=true;
}
else
{
H2=this->countError(p*h1,s);
if (H0>H2&&H2<H1)
{
h3=h1;
h2=p*h1;
h1=0;
return parabola(h0,h1,h2,h3,s);
}
else return 0;
};
};
};
Дата добавления: 2015-08-03; просмотров: 72 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Объектная модель RBF-нейросети | | | За миллиард лет до конца света |