Автор работы: Пользователь скрыл имя, 12 Октября 2011 в 22:10, лабораторная работа
Цель работы: разработать модель нейронной сети Хопфилда, обучить данную сеть образам. Сеть должна уметь из произвольного неидеального сигнала, поданного на ее вход, выделить ("вспомнить" по частичной информации) соответствующий образец (если такой есть) или "дать заключение" о том, что входные данные не соответствуют ни одному из образцов.
}
}
}
return x;
}
private void button3_Click(object sender, EventArgs e) //фильтр файлов
{
openFileDialog1.Filter = "bmp files (*.bmp)|*.bmp|All files (*.*)|*.*";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = Image.FromFile(
}
}
public int ff(int sum) //функция активации
{
if (sum >= 0) return 1;
else return -1;
}
private void button1_Click(object sender, EventArgs e)
{
N = 10000;
test = 0;
//Обучение
int Obr; //количество образов
if (textBox1.Text == "")
{
Obr = 3; textBox1.Text = "3";
}
else int.TryParse(textBox1.Text, out Obr);
//Запоминание образов
label2.Text = "Запоминание образов"; //Hopf_net.ActiveForm.Refresh(
MessageBox.Show("Запоминание образов. Нажмите
Ок.");
//Строки вида 1.bmp, 2.bmp хранятся в string [] filesm
string [] filesm = new string [Obr];
for (int i = 0; i < Obr; i++)
filesm[i] = Path.GetDirectoryName(
int[][] x = new int[Obr][]; //массив весов загружаемых изображений для обучения
for (int i = 0; i < Obr; i++)
x[i] = Loadbmpd(filesm[i]);
//Файл весов
FileStream stream = new FileStream(Path.
StreamWriter f1 = new StreamWriter(stream);
f1.WriteLine(N.ToString());
int sum;
label2.Text = "Запись в файл весов";// Hopf_net.ActiveForm.Refresh();
MessageBox.Show("Запись в файл весов. Нажмите Ок.");
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
sum = 0;
if (i != j)
{
}
f1.WriteLine(sum.ToString());
}
}
f1.Close();
stream.Close();
x = null;
filesm = null;
System.GC.Collect();
MessageBox.Show("Обучение завершено!");
label2.Text = "Готово";
}
private void button2_Click(object sender, EventArgs e)
{
//Тестирование
string s; //временная переменная для загрузки весов из файла построчно
N = 10000; //размер изображения
int kolvit = 0; //количество итераций
if (textBox2.Text == "")
{
Nisp = 10000; textBox2.Text = "10000";
}
else int.TryParse(textBox2.Text, out Nisp);
label2.Text = "Загрузка файла весов";
MessageBox.Show("Начата загрузка файла весов. Нажмите ОК.");
if (test == 0)
{
FileStream stream = new FileStream(Path.
StreamReader f1 = new StreamReader(stream);
s = f1.ReadLine(); //загрузка из файла весов размера изображения
int.TryParse(s, out N);
w = new sbyte[N, N];
for (int k = 0; k < N; k++)
{
for (int i = 0; i < N; i++)
{
s = f1.ReadLine(); //загрузка весов из файла в массив w
sbyte.TryParse(s, out w[k, i]);
}
}
f1.Close();
stream.Close();
test = 1;
}
int[] y = new int[N]; // состояние изображения на предыдущем шаге
int[] yo = new int[N]; //состояние изображения на текущем шаге
int[] ys = new int[N] ; //состояние изображения
вначале
int sum = 0;
long flag = 0; //флаг совпадения изображений
int nn = (int)Math.Sqrt(N);
label2.Text = "Чтение изображения";// Hopf_net.ActiveForm.Refresh();
yo = Loadbmpd_see(openFileDialog1.
for (int j = 0; j < N; j++)
{
ys[j] = yo[j]; //сохранение начального изображения
}
label2.Text = "Обработка изображения";
MessageBox.Show("Начата
do
{
flag = 0;
for (int j = 0; j < N; j++)
{
y[j] = yo[j]; //сохранение изображения на предыдущем шаге
}
for (int j = 0; j < N; j++)
{
sum = 0;
for (int i = 0; i < N; i++)
{
sum += y[i] * w[i, j];
}
yo[j] = ff(sum);
}
for (int j = 0; j < N; j++)
{
if (y[j] != yo[j]) //проверка отличий изображений, если есть отличия, увеличиваем флаг
flag++;
}
kolvit++;
} while (flag != 0);
if (kolvit > 3) MessageBox.Show("Неизвестный образ!");
label6.Text = kolvit.ToString();
label2.Text = "Вывод данных на экран";
//Hopf_net.ActiveForm.Refresh(
Bitmap ybmp = new Bitmap(nn, nn); //вывод результирующего изображения на экран
for (int j = 0; j < nn; j++)
{
for (int i = 0; i < nn; i++)
if (yo[i + j * nn] == 1)
{
ybmp.SetPixel(j, i, Color.Black);
}
else
{
ybmp.SetPixel(j, i, Color.White);
}
}
pictureBox2.Image = Image.FromFile(
pictureBox2.Image = ybmp;
int nn1 = (int)Math.Sqrt(Nisp); //вывод начального изображения на экран
Bitmap ybmp1 = new Bitmap(nn1, nn1);
for (int j = 0; j < nn1; j++)
{
for (int i = 0; i < nn1; i++)
if (ys[i + j * nn] == 1)
{
ybmp1.SetPixel(j, i, Color.Black);
}
else
{
ybmp1.SetPixel(j, i, Color.White);
}
}
pictureBox1.Image = ybmp1;
label2.Text = "Готово";
MessageBox.Show("Тестирование завершено!");
}
private void pictureBox1_Click(object sender, EventArgs e)
{
}
private void оПрограммеToolStripMenuItem_
{
MessageBox.Show(" Нейронная сеть Хопфилда\n " +
"\n Программа разработана студенткой группы ПМИ-105 \n" +
" Щетниковой Викторией Юрьевной\
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void button4_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void button5_Click(object sender, EventArgs e) //Очистка области изображения
{
pictureBox1.Image = null;
pictureBox2.Image = null;
}
private void label3_Click(object sender, EventArgs e)
{
}
private void label4_Click(object sender, EventArgs e)
{
}
private void button6_Click(object sender, EventArgs e) //сохранение изображения в файл
{
saveFileDialog1.Filter = "bmp files (*.bmp)|*.bmp|All files (*.*)|*.*";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
pictureBox2.Image.Save(
}
}
private void Hopf_net_Load(object sender, EventArgs e)
{
test = 0;
}
}
}
Выводы по работе: в ходе данной лабораторной работы была разработана программа, моделирующая нейронную сеть Хопфилда; данная сеть была обучена различным искаженным образам, для чего был разработан оконный интерфейс. Размер изображения и число входных образов могут быть заданы произвольно пользователем, формат изображения .bmp. После обучения сети на выходе был получен восстановленный выходной образ и число итераций, которое потребовалось сети для восстановления искаженного изображения. Значения весов были записаны в файл w.txt. Программа также позволяет сохранить выходной образ в файле.