Нейронные сети. Описание. Обучение. Реализация.
Общие сведения и виды искусственного интеллекта | Методы обучения нейронных сетей | Реализация
Для реализации работы нейронной сети необходимо подготовить базу для работы с матрицами и векторами. Естесственно во многих средах программирования уже есть соответствующие классы. Но мы Не будем лезть в дебри и создадим свои классы, имеющие необходимые функции.
Перед компиляцией стоит добавить в соответствующие места кода символ "<" так как html код "съедает" его.
Класс нейронная сеть
NN.h
template
class NN
{
int layers; // количество слоев
Matrix*M;
Vector X;
Vector*Y;
public:
void Propagate(); // прямой обход для метода обратного распростроенния ошибки
void BackPropagate(); // обратный обход для метода обратного распростроенния ошибки
// алгоритм в математическом виде в разделе методы обучения нейронных сетей
NN(Vector);
~NN();
};
// NN.cpp
template
NN::NN(Vector v)
{
layers=5;
Y=new Vector[layers-1];
X=v;
X.Print();
cout<<"NN have "<[layers-1];
M[0].SS(X.getElements(),rand()%9);
M[0].RandomInit();
M[0].Print();
for(int i=1;i
NN::~NN()
{
delete[] Y;
cout<<"Neuro result vector was deleted...\n";
delete[] M;
cout<<"Neuro matrixs was deleted...\n";
}
template
void NN::Propagate(){
Y[0]=X*M[0];
Y[0].F(0.11,0.11,0);
for(int i=1;ilayers-1;i++)
{
Y[i]=Y[i-1]*M[i];
Y[i].F(0.11,0.11,0);
}
cout<<"Propagate is: ";
Y[layers-2].Print();
}
template
void NN::BackPropagate(){
// 1
T E;
int t=1;
int tmp;
float z=100;
double nu=(rand()%100)/z;
double mu=0.2;
double Emax=0.2;
Vector*delta=new Vector[layers-1];
Vector D;
Vector TMP;
Matrix DyDs;
Matrix*Wt1=new Matrix[layers-1];
Matrix*DWt1=new Matrix[layers-1];
Matrix*DWt2=new Matrix[layers-1];
Propagate();
D.setElements(Y[layers-2].getElements());
cout<<"Enter D vector: ";
D.Init();
// 2
while(t!=0)
{
E=0;
Propagate();
// 3
if(t==1)
TMP=Y[layers-2];
for(int i=0;i=0;i--)
{
DyDs.SS(Y[i].getElements(),Y[i].getElements());
DyDs.FermiInit(Y[i],0.11,0.11);
M[i+1].Transpon();
delta[i]=(delta[i+1]*M[i+1])*DyDs;
}
// 4b
for(int i=layers-2;i>=0;i--)
{
if(t==1)
{
if(i==0)
DWt1[i].SS(X.getElements(),delta[i].getElements());
else
DWt1[i].SS(Y[i-1].getElements(),delta[i].getElements());
}
else
DWt1[i]=DWt2[i];
if(i==0)
DWt2[i].SS(X.getElements(),delta[i].getElements());
else
DWt2[i].SS(Y[i-1].getElements(),delta[i].getElements());
for(int k=0;kEmax)
t++;
else
{
tmp=t;
t=0;
}
}
cout<<"\n";
cout<<"-------------------------------------------------\n";
cout<<"BackPropagate is over:\n\n\tFirst step is: ";
TMP.Print();
cout<<"\tD is: ";
D.Print();
cout<<"\tResult is: ";
Y[layers-2].Print();
cout<<"\tEmax is: "<< Emax;
cout<<"\n";
cout<<"\tE is: "<< E;
cout<<"\n";
cout<<"\tNumer of steps: "<< tmp;
cout<<"\n";
cout<<"-------------------------------------------------";
cout<<"\n";
}
Страницы: 1 | 2 | 3 |
СГУ.clan - в помощь студентам