Смекни!
smekni.com

Распознавание слов естественного языка с использованием нейросетей (стр. 6 из 7)

run_hidden_layer();

run_output_layer();

}

//{Процедура выводит на экран результаты теста}

private void display_the_results(out string[] outp)

{

outp = new string[ol.Length];

for (int i = 0; i < MAX_OUT; i++)

{ outp[i] = ol[i].a.ToString() + " "; }

}

// {Процедуры для тестирования сети до и после обучения}

public void get_test_pattern(double[] tests)

{

test_pat = tests;

}

public string[] test_the_network(double[] test)

{

test_pat = test;

Console.WriteLine();

Console.WriteLine("Процедура тестирования сети");

Console.WriteLine();

string[] str;

run_the_network();

display_the_results(out str);

return str;

}

// {Процедуры обучения сети}

private void calculate_output_layer_errors()

{

for (int j = 0; j < MAX_OUT; j++)

{ ol[j].E = (desired[j] - ol[j].a) * ol[j].a * (1 - ol[j].a); }

}

private void calculate_hidden_layer_errors()

{

double sum;

for (int i = 0; i < MAX_HID; i++)

{

sum = 0; // {Сумма ошибок выходного слоя}

for (int j = 0; j < MAX_OUT; j++)

{ sum = sum + ol[j].E * ol[j].w[i]; }

hl[i].E = hl[i].a * (1 - hl[i].a) * sum;

}

}

private void calculate_input_layer_errors()

{

double sum;

for (int i = 0; i < MAX_INP; i++)

{

sum = 0; // {Сумма ошибок скрытого слоя}

for (int j = 1; j < MAX_HID; j++)

{ sum = sum + hl[j].E * hl[j].w[i]; }

ipl[i].E = ipl[i].a * (1 - ipl[i].a) * sum;

}

}

private void weight_change()

{

for (int j = 0; j < MAX_OUT; j++) //{выходнойслой}

{

for (int i = 0; i < MAX_HID; i++) //{Подстройка}

{

ol[j].change[i] = BETA * ol[j].E * hl[i].a + M * ol[j].change[i];

ol[j].w[i] = ol[j].w[i] + ol[j].change[i];

}

// {Подстройказначенияпорога}

ol[j].t_change = BETA * ol[j].E * 1 + M * ol[j].t_change;

//--------------------

ol[j].threshold = ol[j].threshold + ol[j].t_change;

//----------------------------

}

// {Модифицируем веса между входным слоем и скрытым слоем}

// {i -нейрон входного слоя, j -скрытого}

for (int j = 0; j < MAX_HID; j++)

{

for (int i = 0; i < MAX_INP; i++)

{

hl[j].change[i] = BETA * hl[j].E * ipl[i].a + M * hl[j].change[i];

hl[j].w[i] = hl[j].w[i] + hl[j].change[i];

}

hl[j].t_change = BETA * hl[j].E * 1 + M * hl[j].t_change;

//-------------------------------------

hl[j].threshold = hl[j].threshold + hl[j].t_change;

}

// {Модифицируем веса между входами и входным слоем }

// {i -входной образ, j - нейроны входного слоя}

for (int j = 0; j < MAX_INP; j++)

{

for (int i = 0; i < MAX_INP; i++)

{

ipl[j].change[i] = BETA * ipl[j].E * test_pat[i] + M * ipl[j].change[i];

ipl[j].w[i] = ipl[j].w[i] + ipl[j].change[i];

}

ipl[j].t_change = BETA * ipl[j].E * 1 + M * ipl[j].t_change;

ipl[j].threshold = ipl[j].threshold + ipl[j].t_change;

}

}

//{Выполнениеалгоритма back propagation }

private void back_propagate()

{

calculate_output_layer_errors();

calculate_hidden_layer_errors();

calculate_input_layer_errors();

weight_change();

}

//{Инициализация весовых коэффициентов и порогов}

public void random_weights()

{

Random rnd = new Random();

for (int i = 0; i < MAX_INP; i++)

{

ipl[i].w = new double[MAX_INP]; // {весовыекоэффициенты}

ipl[i].change = new double[MAX_INP];

}

for (int i = 0; i < MAX_HID; i++)

{

hl[i].w = new double[MAX_INP]; // {весовыекоэффициенты}

hl[i].change = new double[MAX_INP];

}

for (int i = 0; i < MAX_OUT; i++)

{

ol[i].w = new double[MAX_HID]; // {весовыекоэффициенты}

ol[i].change = new double[MAX_HID];

}

for (int i = 0; i < MAX_INP; i++)

{

for (int j = 0; j < MAX_INP; j++)

{ ipl[i].w[j] = (double)rnd.Next(1000) / 1000; }

ipl[i].threshold = (double)rnd.Next(1000) / 1000;

}

for (int i = 0; i < MAX_HID; i++)

{

for (int j = 0; j < MAX_INP; j++)

{ hl[i].w[j] = (double)rnd.Next(1000) / 1000; }

hl[i].threshold = (double)rnd.Next(1000) / 1000;

}

for (int i = 0; i < MAX_OUT; i++)

{

for (int j = 0; j < MAX_HID; j++)

{ ol[i].w[j] = (double)rnd.Next(1000) / 1000; }

ol[i].threshold = (double)rnd.Next(1000) / 1000;

}

}

private void ExtractWeights()

{

for (int i = 0; i < MAX_INP; i++)

{

ipl[i].w = new double[MAX_INP]; // {весовыекоэффициенты}

ipl[i].change = new double[MAX_INP];

}

for (int i = 0; i < MAX_HID; i++)

{

hl[i].w = new double[MAX_INP]; // {весовыекоэффициенты}

hl[i].change = new double[MAX_INP];

}

for (int i = 0; i < MAX_OUT; i++)

{

ol[i].w = new double[MAX_HID]; // {весовыекоэффициенты}

ol[i].change = new double[MAX_HID];

}

if (File.Exists(filename + "ip.txt") == true && File.Exists(filename + "ol.txt") == true && File.Exists(filename + "hl.txt") == true)

{

StreamReader streamreader = new StreamReader(filename + "ip.txt");

for (int i = 0; i < ipl.Length; i++)

{

ipl[i].a = double.Parse(streamreader.ReadLine());

ipl[i].threshold = double.Parse(streamreader.ReadLine());

for (int j = 0; j < ipl[i].w.Length; j++)

{

ipl[i].w[j] = double.Parse(streamreader.ReadLine());

}

}

streamreader.Close();

streamreader = new StreamReader(filename + "ol.txt");

for (int i = 0; i < ol.Length; i++)

{

ol[i].a = double.Parse(streamreader.ReadLine());

ol[i].threshold = double.Parse(streamreader.ReadLine());

for (int j = 0; j < ol[i].w.Length; j++)

{

ol[i].w[j] = double.Parse(streamreader.ReadLine());

}

}

streamreader.Close();

streamreader = new StreamReader(filename + "hl.txt");

for (int i = 0; i < hl.Length; i++)

{

hl[i].a = double.Parse(streamreader.ReadLine());

hl[i].threshold = double.Parse(streamreader.ReadLine());

for (int j = 0; j < hl[i].w.Length; j++)

{

hl[i].w[j] = double.Parse(streamreader.ReadLine());

}

}

streamreader.Close();

}

else

{

File.Create(filename + "ip.txt");

File.Create(filename + "ol.txt");

File.Create(filename + "hl.txt");

}

}

//-------------------------------------------------------------

private void AddWeightsToFile()

{

StreamWriter streamwriter = new StreamWriter(filename + "ip.txt");

for (int i = 0; i < ipl.Length; i++)

{

streamwriter.WriteLine(ipl[i].a.ToString());

streamwriter.WriteLine(ipl[i].threshold.ToString());

for (int j = 0; j < ipl[i].w.Length; j++)

{

streamwriter.WriteLine(ipl[i].w[j].ToString());

streamwriter.Flush();

}

streamwriter.Flush();

}

streamwriter.Close();

streamwriter = new StreamWriter(filename + "hl.txt");

for (int i = 0; i < hl.Length; i++)

{

streamwriter.WriteLine(hl[i].a.ToString());

streamwriter.WriteLine(hl[i].threshold.ToString());

for (int j = 0; j < hl[i].w.Length; j++)

{

streamwriter.WriteLine(hl[i].w[j].ToString());

streamwriter.Flush();

}

streamwriter.Flush();

}

streamwriter.Close();

streamwriter = new StreamWriter(filename + "ol.txt");

for (int i = 0; i < ol.Length; i++)

{

streamwriter.WriteLine(ol[i].a.ToString());

streamwriter.WriteLine(ol[i].threshold.ToString());

for (int j = 0; j < ol[i].w.Length; j++)

{

streamwriter.WriteLine(ol[i].w[j].ToString());

streamwriter.Flush();

}

streamwriter.Flush();

}

streamwriter.Close();

}

private void blank_changes()

{

for (int j = 0; j < MAX_INP; j++)

{

for (int i = 0; i < MAX_INP; i++)

{ ipl[j].change[i] = 0; }

ipl[j].t_change = 0;

}

for (int j = 0; j < MAX_HID; j++)

{

for (int i = 0; i < MAX_INP; i++)

{ hl[j].change[i] = 0; }

hl[j].t_change = 0;

}

for (int j = 0; j < MAX_OUT; j++)

{

for (int i = 0; i < MAX_HID; i++)

{ ol[j].change[i] = 0; }

ol[j].t_change = 0;

}

}

public void train_the_network()

{

blank_changes(); // {Очисткапредыдущихзначений changes}

for (int loop = 0; loop < num_cycles; loop++)

{

for (int pat = 0; pat < MAX_PAT; pat++)

{

for (int i = 0; i < MAX_INP; i++) //{Копированиевходногообраза}

{ test_pat[i] = INP_PATTERNS[pat, i]; } //{вмассив 'test_pat' }

for (int i = 0; i < MAX_OUT; i++) //{Копированиевыходногообраза}

{ desired[i] = OUT_PATTERNS[pat, i]; } //{ вмассив'desired' }

run_the_network(); //{Определение выходов сети}

back_propagate();

}

}

AddWeightsToFile();

}

}


Приложение Б. Листинг класса Analization

public class Analization

{

List<Results> results = new List<Results>();

public static void AddToFile(string sLetter, string sFile)

{

FileStream filestream = File.Open(sFile + ".txt", FileMode.Append, FileAccess.Write);

StreamWriter streamwriter = new StreamWriter(filestream);

streamwriter.WriteLine(sLetter);

streamwriter.Close();

filestream.Close();

}

private void AddEtalonLetter()

{

string[] im = { "смотрим@", "носим@", "ходим@", "бродим@", "катим@", "синим#", "большим#", "тугим#", "крайним#" };

if (File.Exists("-им.txt") == false)

{

FileStream filestream = File.Open("-им.txt", FileMode.CreateNew, FileAccess.Write);

StreamWriter streamwriter = new StreamWriter(filestream);

for (int i = 0; i < im.Length; i++)

{

streamwriter.WriteLine(im[i]);

}

streamwriter.Close();

filestream.Close();

}

string[] om = { "столом@", "стулом@", "ковром@", "городом@", "селом@", "красном#", "туманном#", "тяжелом#", "легком#" };

if (File.Exists("-ом.txt") == false)

{

FileStream filestream = File.Open("-ом.txt", FileMode.CreateNew, FileAccess.Write);

StreamWriter streamwriter = new StreamWriter(filestream);

for (int i = 0; i < om.Length; i++)

{

streamwriter.WriteLine(om[i]);

}

streamwriter.Close();

filestream.Close();

}

string[] oy = { "ручкой@", "краской@", "бумагой@", "оградой@", "каймой@", "большой#", "небольшой#", "тугой#", "малой#" };

if (File.Exists("-ой.txt") == false)

{

FileStream filestream = File.Open("-ой.txt", FileMode.CreateNew, FileAccess.Write);

StreamWriter streamwriter = new StreamWriter(filestream);

for (int i = 0; i < oy.Length; i++)

{

streamwriter.WriteLine(oy[i]);

}

streamwriter.Close();

filestream.Close();

}

string[] em = { "кидаем@", "бросаем@", "стережем@", "бережем@", "блюдем@", "гребнем#", "камнем#", "ставнем#", "гравием#" };

if (File.Exists("-ем.txt") == false)

{

FileStream filestream = File.Open("-ем.txt", FileMode.CreateNew, FileAccess.Write);

StreamWriter streamwriter = new StreamWriter(filestream);

for (int i = 0; i < em.Length; i++)

{

streamwriter.WriteLine(em[i]);

}

streamwriter.Close();

filestream.Close();

}

string[] ie = { "большие@", "синие@", "маленькие@", "хорошие@", "плохие@", "хождение#", "мероприятие#", "становление#", "украшение#" };

if (File.Exists("-ие.txt") == false)

{

FileStream filestream = File.Open("-ие.txt", FileMode.CreateNew, FileAccess.Write);

StreamWriter streamwriter = new StreamWriter(filestream);

for (int i = 0; i < ie.Length; i++)

{

streamwriter.WriteLine(ie[i]);

}

streamwriter.Close();

filestream.Close();

}

string[] mi = { "красными@", "зелеными@", "хорошими@", "плохими@", "трудными@", "стульями#", "столами#", "ставнями#", "карандашами#" };

if (File.Exists("-ми.txt") == false)

{

FileStream filestream = File.Open("-ми.txt", FileMode.CreateNew, FileAccess.Write);

StreamWriter streamwriter = new StreamWriter(filestream);

for (int i = 0; i < mi.Length; i++)

{

streamwriter.WriteLine(mi[i]);

}

streamwriter.Close();

filestream.Close();

}

}

public string BigToSmall(string letter)

{

switch (letter)

{

case "А": return "а";

case "Б": return "б";

case "В": return "в";

case "Г": return "г";

case "Д": return "д";

case "Е": return "е";

case "Ё": return "ё";

case "Ж": return "ж";

case "З": return "з";

case "И": return "и";

case "Й": return "й";

case "К": return "к";

case "Л": return "л";

case "М": return "м";

case "Н": return "н";

case "О": return "о";

case "П": return "п";

case "Р": return "р";

case "С": return "с";

case "Т": return "т";

case "У": return "у";

case "Ф": return "ф";

case "Х": return "х";

case "Ц": return "ц";

case "Ч": return "ч";

case "Ш": return "ш";

case "Щ": return "щ";

case "Ъ": return "ъ";

case "Ы": return "ы";

case "Ь": return "ь";

case "Э": return "э";

case "Ю": return "ю";

case "Я": return "я";

}

return "ё";

}

public Analization(string sText, int N_HID, double beta, double m, int Epoch, bool flag)

{

AddEtalonLetter();

Results res;

string sLetter = "";

for (int i = 0; i < sText.Length; i++)

{

if (sText[i] == ' ' || sText[i] == '.' || sText[i] == ',' || sText[i] == '!' || sText[i] == '?' || sText[i] == '-' || sText[i] == ':' || sText[i] == ';')

{

if (sLetter == "")

{

goto k;

}

if ((Char.ConvertToUtf32(sLetter, 0) >= 1040 && Char.ConvertToUtf32(sLetter, 0) <= 1071))

{

if (i - sLetter.Length + 1 == 1)

{

string ch = BigToSmall(sLetter[0].ToString());

sLetter = ch + sLetter.Substring(1, sLetter.Length - 1);

goto m;

}

else

if (sText[i - sLetter.Length - 1] == ' ' && sText[i - sLetter.Length - 2] == '.')

{

string ch = BigToSmall(sLetter[0].ToString());