Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Нейросеть / neuro

.cpp
Скачиваний:
16
Добавлен:
01.02.2019
Размер:
4.08 Кб
Скачать
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>

using namespace std;

const int NSL = 3;
const int NMAX = 30;
const int NMIN = 4;
const int NSH = 10;
const int N = 1;
const float EPS = 0.01;
const int NU = 10000;

int struc[NSL + 1] = { NMAX,30,25,NMIN };
int i, j, k, m, c;

float net;
float outs[NSL + 1][NMAX];
float w[NSL + 1][NMAX][NMAX];
float pattern[NSH][NMAX];
float target[NSH][NMIN];
float b[NSL + 1][NMAX];
float e;

ifstream f;

void NeuroCalc() {
	for (k = 1; k <= NSL; k++)
		for (i = 0; i < struc[k]; i++) {
			net = 0;
			for (j = 0; j < struc[k - 1]; j++)
				net += outs[k - 1][j] * w[k][j][i];
			outs[k][i] = 1 / (1 + exp(-net));
		}
}

float calcErr(int m) {
	float sum = 0;
	for (i = 0; i < NMIN; i++)
		sum += pow(target[m][i] - outs[NSL][i], 2);
	return sqrt(sum / NMIN);
}

void loadPatterns() {
	f.open("patterns.txt");
	if (!f) cout << "Can't open file!";
	else {
		while (!f.eof()) {
			f >> m;
			cout << m << ' ';
			for (i = 0; i<NMAX; i++)
				f >> pattern[m][i];
			for (i = 0; i<NMIN; i++)
				f >> target[m][i];
		}
		f.close();
	}
}

void printNeuroNet() {
	cout << "Input:" << endl;
	for (i = 0; i < NMAX; i++) {
		if (outs[0][i] == 1)
			cout << char(219);
		else cout << char(176);
		if ((i + 1) % 5 == 0)
			cout << '\n';
	}
	cout << '\n';
	cout << "Output:" << endl;
	for (i = 0; i<NMIN; i++) {
		cout << outs[NSL][i] << ' ';
	}
	cout << '\n';
	cout << "Target: " << endl;
	for (i = 0; i<NMIN; i++) {
		cout << target[m][i] << ' ';
	}
	cout << '\n';
}

double calcSumErr() {
	double sum = 0;
	for (c = 0; c < NSH; c++) {
		for (int i = 0; i<NMAX; i++)
			outs[0][i] = pattern[c][i];
		NeuroCalc();
		sum = sum + pow(calcErr(c), 2);
	}
	return (sqrt(sum / NSH));
}

void goBack() {
	for (int k = NSL; k >= 1; k--) {
		for (int i = 0; i < struc[k]; i++) {
			if (k == NSL)
				e = target[m][i] - outs[k][i];
			else {
				e = 0;
				for (int c = 0; c < struc[k + 1]; c++)
					e = e + b[k + 1][c] * w[k + 1][i][c];
			}
			b[k][i] = outs[k][i] * (1 - outs[k][i])*e;
			for (int j = 0; j < struc[k - 1]; j++)
				w[k][j][i] = w[k][j][i] + N * b[k][i] * outs[k - 1][j];
		}
	}
}

void educate() {
	int count = 0;
	m = 0;
	do {
		for (int i = 0; i<NMAX; i++) outs[0][i] = pattern[m][i];
		NeuroCalc();
		goBack();
		if (m == NSH - 1) m = 0;
		else m++;
		count++;
	} while (calcSumErr() > EPS && count < NU);
	cout << count << endl;
	cout << " Sum error: " << calcSumErr() << endl;
}

void calcPattern() {
	cout << "Type pattern number:" << endl;
	cin >> m;
	for (i = 0; i<NMAX; i++) outs[0][i] = pattern[m][i];
	NeuroCalc();
	printNeuroNet();
	cout << "Error: " << calcErr(m) << endl;
}

void calcInput() {
	f.open("input.txt");
	if (!f) cout << "Can't open file!";
	else {
		while (!f.eof()) {
			f >> m; 
			cout << m << ' '; 
			for (i = 0; i < NMAX; i++) f >> outs[0][i];
		}
		f.close();
	}
	NeuroCalc();
	printNeuroNet();
	cout << "Error: " << calcErr(m) << endl;
}

void SetStructure() {
	cout << "Enter n1(30) and n2(25)" << endl;
	cin >> struc[1] >> struc[2];
	cout << "SumError = " << calcSumErr() << endl;
}

void init() {
	srand(time(NULL));
	for (k = 1; k <= NSL; k++)
		for (j = 0; j<NMAX; j++)
			for (i = 0; i<NMAX; i++)
				w[k][j][i] = -1 + 2 * (float)rand() / RAND_MAX;
}

int main()
{
	init();
	char ch;
	do {
		cout << "\nMenu:" << endl;
		cout << "1: Load patterns" << endl;
		cout << "2: Calc pattern" << endl;
		cout << "3: Calc input" << endl;
		cout << "4: Educate" << endl;
		cout << "5: Set Structure" << endl;
		cout << "6: Exit" << endl;
		cout << "\n Select menu item: ";
		cin >> ch;
		switch (ch) {
		case '1':
			loadPatterns();
			break;
		case '2':
			calcPattern();
			break;
		case '3':
			calcInput();
			break;
		case '4':
			educate();
			break;
		case '5':
			SetStructure();
			break;
		default:
			cout << "Wrong item!" << endl;
			break;
		}
	} while (ch != '6');
}
Соседние файлы в папке Нейросеть