Нейронные сети. Описание. Обучение. Реализация.

Общие сведения и виды искусственного интеллекта | Методы обучения нейронных сетей | Реализация

Для реализации работы нейронной сети необходимо подготовить базу для работы с матрицами и векторами. Естесственно во многих средах программирования уже есть соответствующие классы. Но мы Не будем лезть в дебри и создадим свои классы, имеющие необходимые функции.

Перед компиляцией стоит добавить в соответствующие места кода символ "<" так как 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 - в помощь студентам
Хостинг от uCoz