- •Ход работы
- •1. Структура персептрона
- •2. Исходный код программы
- •2.1. Точка входа в программу Program.Cs
- •2.2. Входные данные InputData.Cs
- •2.3. Реализация персептрона по методу Хебба Perceptron.Cs
- •2.4 Вывод информации OutputInformation.Cs
- •3. Результат выполнения программы
- •4. Результаты исследования работы программы
- •Заключение
МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ.ПРОФ.М.А.БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Факультет: «Институт магистратуры»
Кафедра: «Систем автоматизации и робототехники»
Направление подготовки: |
Автоматизация технологических процессов и производств |
Направленность (профиль): |
Интеллектуальные технологии в автоматизации |
ЛАБОРАТОРНАЯ РАБОТА № 4
по дисциплине:
Методы и модели искусственного интеллекта в управлении техническими системами
|
на тему:
Программная реализация и экспериментальное исследование персептрона и алгоритма обучения
Вариант: 10
-
Выполнили студенты группы:
дата, подпись
Фамилия И. О.
Принял к.т.н., доцент
Верхова Г.В.
дата, подпись
Фамилия И. О.
Цель работы: Приобретение навыков программной реализации на языке C# и экспериментального исследования персептрона и алгоритмов обучения.
Задание: Выполнить программную реализацию на языке C# и экспериментально исследовать персептрон и алгоритм его обучения согласно 10 варианту.
При обучении персептрона обеспечить минимизацию ложно-положительных срабатываний путем формирования соответствующей обучающей выборки. В случае ввода изображения, которое явно не соответствует ни одному из распознаваемых символов, должно выводиться соответствующее сообщение.
Программа должна выводить матрицы всех весовых коэффициентов.
Провести исследование работы программы при обучающих выборках, содержащих 5, 10, 50, 100, 1 000, 10 000 и 100 000 элементов. Результаты представить в виде таблицы
Ход работы
1. Структура персептрона
Персептрон – это простейшая модель искусственного нейрона, представляющая упрощённое отображение работы нервной системы. Он состоит из трёх основных типов элементов:
1. S-элементы (датчики):
Принимают входную информацию (например, матрицы 5×5, где «1» означает наличие линии, а «0» – её отсутствие).
2. A-элементы (ассоциативные элементы):
Обеспечивают взвешенное суммирование входных сигналов с последующим добавлением смещения (Bias). Именно благодаря смещению можно гибко сдвигать порог активации, что позволяет лучше адаптировать модель к данным.
3. R-элементы (реагирующие элементы):
Реализуют функцию активации, которая на основании суммарного сигнала (с учётом весов и смещения) выдает выходной сигнал – «1» (символ распознан) или «0» (символ не распознан).
В основе обучения персептрона лежит правило Хебба. При ошибке классификации корректируются веса входов:
1. При ложном отрицательном срабатывании (ожидалось 1, а выдано 0) – веса увеличиваются.
2. При ложноположительном срабатывании (ожидалось 0, а выдано 1) – веса уменьшаются.
Рис.1 — Структура персептрона
2. Исходный код программы
2.1. Точка входа в программу Program.Cs
namespace PerceptronSymbols
{
class Program
{
static void Main()
{
var epochs = new[] {5,10,50,100,1000,10000,100000};
var results = new List<(int, double, double, double)>();
foreach(var e in epochs)
{
double si=0,sn=0,sm=0;
for(int i=0;i<10;i++)
{
var (ie,ne,me) = RunExperiment(e);
si+=ie; sn+=ne; sm+=me;
}
results.Add((e,si/10,sn/10,sm/10));
}
PrintResearchTable(results);
var samples = InputData.GetSymbolSamples();
var set = samples.Concat(Enumerable.Range(0,samples.Count*2).Select(_=>InputData.GenerateNoiseSample())).ToList();
var ps = samples.Select(s=>new Perceptron(s.Label,25)).DistinctBy(p=>p.Symbol).ToList();
for(int i=0;i<10000;i++)
foreach(var t in set)
foreach(var p in ps)
p.Train(t.Input, t.Label==p.Symbol?1:0);
}
static (double,double,double) RunExperiment(int n)
{
var s = InputData.GetSymbolSamples();
var set = s.Concat(Enumerable.Range(0,s.Count*2).Select(_=>InputData.GenerateNoiseSample())).ToList();
var ps = s.Select(x=>new Perceptron(x.Label,25)).DistinctBy(p=>p.Symbol).ToList();
for(int i=0;i<n;i++) foreach(var t in set) foreach(var p in ps) p.Train(t.Input, t.Label==p.Symbol?1:0);
double ie=Test(s,ps);
double ne=Test(Enumerable.Range(0,s.Count*2).Select(_=>InputData.GenerateNoiseSample()).ToList(),ps);
double me=Test(s.SelectMany(x=>new[]{x,InputData.GenerateNoiseSample(),InputData.GenerateNoiseSample()}).ToList(),ps);
return (ie,ne,me);
}
static double Test(List<TrainingSample> ts,List<Perceptron> ps)
=> ts.Count(t=>{
var f=ps.Where(p=>p.Predict(t.Input)==1).Select(p=>p.Symbol).ToList();
return t.Label=="None"?f.Count>0:f.Count!=1||f[0]!=t.Label;
})*100.0/ts.Count;
static void PrintResearchTable(List<(int,int,double,double)> r)
=> r.ForEach(x=>Console.WriteLine($"{x.Item1}|{x.Item2:F2}|{x.Item3:F2}|{x.Item4:F2}"));
}
}
