Файл: Лабораторная работа 4 по дисциплине аппроксимация функций с помощью нейронной сети прямого распространения.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 108
Скачиваний: 1
Минобрнауки России
Юго-Западный государственный университет
Кафедра программной инженерии
Лабораторная работа №4
по дисциплине
«АППРОКСИМАЦИЯ ФУНКЦИЙ С ПОМОЩЬЮ
НЕЙРОННОЙ СЕТИ ПРЯМОГО РАСПРОСТРАНЕНИЯ»
Выполнили:
Проверила: профессор кафедры ПИ Томакова Р.А.
Курск, 2023
производная выражается через саму функцию, что позволяет снизить скорость обучения нейронной сети.
Для простейшего случая аппроксимации одномерной функции y f (x) нейронная сеть выполняет функцию нахождения преобразования f (x) через функции активации. Число входов в случае одномерной функции равно 1 (х), число выходов – 1 (у).
Ход работы
Код программы:
public class cSensor
{
public event EventHandler ChangeState;
private sbyte state = 0;
public sbyte State
{
get { return state; }
set
{
state = value;
if (state == 1 && ChangeState != null)
{
ChangeState(this, new EventArgs());
}
}
}
}
public delegate void BackCommunication(sbyte Type);
class cSinaps
{
private sbyte type;
private BackCommunication hBackCommunication;
public cSinaps(sbyte tType,BackCommunication tBackCommunication)
{
type = tType;
hBackCommunication = tBackCommunication;
}
public void ChangeSensorState(object sourse, EventArgs e)
{
hBackCommunication(type);
}
}
public class cAssociation
{
public int ActivationLevel = 0;
private cSinaps[] oSinaps;
public cAssociation(cSensor[] sensorsField, int SCount, Random RND)
{
int SinapsCount = 10;
oSinaps = new cSinaps[SinapsCount];
int tSinapsNumber = 0;
int tmpSensorNumber = 0;
sbyte tmpSensorType = 0;
for (int j = 1; j < SinapsCount + 1; j++)
{
tmpSensorNumber = RND.Next(SCount);
if (RND.Next(2) == 0) tmpSensorType = 1; else tmpSensorType = -1;
oSinaps[tSinapsNumber] = new cSinaps(tmpSensorType, AssumeSinapsSignal);
sensorsField[tmpSensorNumber].ChangeState +=
new EventHandler(oSinaps[tSinapsNumber].ChangeSensorState);
tSinapsNumber++;
}
}
void AssumeSinapsSignal(sbyte Type)
{
ActivationLevel += Type;
}
}
public class cNeironNet
{
public cSensor[] SensorsField; /* Сенсорное поле*/
public cAssociation[] AssociationsFiled; /* Ассоциативное поле*/
int ACount;
int SCount;
public ArrayList AHConnections;
Random RND = new Random();
public cNeironNet(int argSCount, int argACount)
{
ACount = argACount;
SCount = argSCount;
SensorsField = new cSensor[SCount];
for (int i = 0; i < SCount; i++)
{
SensorsField[i] = new cSensor();
}
AssociationsFiled = new cAssociation[ACount];
for (int i = 0; i < ACount; i++)
{
AssociationsFiled[i] = new cAssociation(SensorsField, SCount, RND);
}
}
public ArrayList JoinStimul(int[] tPerception, int[] tReaction)
{
for (int i = 1; i < ACount + 1; i++)
{
AssociationsFiled[i].ActivationLevel = 0;
}
for (int i = 1; i < SCount + 1; i++)
{
SensorsField[i].State = 0;
}
//
for (int i = 0; i < SCount; i++)
{
SensorsField[i].State = tPerception[i];
}
AHConnections = new ArrayList();
for (i = 0; i < ACount; i++)
{
if (AssociationsFiled[i].ActivationLevel > 0)
{ AHConnections.Add(i); } } SaveReaction(tReaction); return AHConnections; } private void Storing() { for (int n = 1; n < 100000 + 1; n++) { for (int i = 1; i < StimulCount + 1; i++) { RAktivization(i); bool e = GetError(i); if (e) { LearnedStimul(i); Error++; } } } }}private void RAktivization(int ReactionNumber){ int[] Summa = new int[RCount + 1]; for (int j = 1; j < RCount + 1; j++) { for (i = 1; i < AHConnections[ReactionNumber].Count + 1; i++) { Summa[j] += Weight[AHConnections[ReactionNumber].Value[i]].Value[j]; } } for (int i = 1; i < RCount + 1; i++) { if (Summa[i] > 0) Reactions[i] = 1; if (Summa[i] <= 0) Reactions[i] = -1; }}private int GetError(int ReactionNumber){ int IsError = 0; for (int i = 1; i < RCount + 1; i++) { if (Reactions[i] == NecessaryReactions[ReactionNumber].Value[i]) { ReactionError[i] = 0; } else { IsError = 1; ReactionError[i] = NecessaryReactions[ReactionNumber].Value[i]; } } return IsError;}private void LearnedStimul(int ReactionNumber){ for (int j = 1; j < RCount + 1; j++) { for (int i = 1; i < AHConnections[ReactionNumber].Count + 1; i++) { Weight[AHConnections[ReactionNumber].Value[i]].Value[j] += ReactionError[j]; }Результаты выполнения программы: