Тема: Использование нейронных сетей в инфокоммуникациях
Цель работы: При передаче мультимедийного трафика в системах связи возможны его частичные искажения. При передаче в сети графических изображений, помехи могут влиять на качество изображений.Поэтому предполагается на приемной стороне(в приемнике) возможность применить алгоритмы искусственного интеллекта, которые позволят попиксельно относить оттенки цвета к основному набору цветов и восстановить изображение.
Структура:1)Постановка задачи2)Искусственный интеллект3)Искусственные нейронные сети4)Функция активации нейрона5)Методы обучения нейронной сети6)Программная реализация7)Выводы.
Содержание приложения:1)Исходники программы;
2)Презентация для выступа на конференции *.ppt;
3)Доклад по выступу на конференции *.doc.
Описание программы: программа представляет собой нейронную сеть предназначеную для определения основного цвета, который передавался в телекоммуникационной системе, но был подвержен искажениям. Тон искаженного цвета задается в формате RGB. Для обучения механизма сети предусмотрен ручной и автоматический режимы. Обученая сеть автоматически может определить к какому из основных цветов относится цвет который мы вручную задаем с помощью RGB.
Исходный код:(отрывок)
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <math.h> #include "Unit1.h" //--------------------------------------------------------------------------- #define INCOUNT 3 #define NEUROCOUNT 8 #define E 2.7182818284590452354 //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TCanvas *t,*t2; //--------------------------------------------------------------------------- void color() {int r=255-Form1->TrackBar1->Position, g=255-Form1->TrackBar2->Position, b=255-Form1->TrackBar3->Position; t->Brush->Color=RGB(r, g, b); t->Rectangle(0,0,Form1->Image1->Width,Form1->Image1->Height); } //--------------------------------------------------------------------------- struct Neuron { double x[INCOUNT];// входные сигналы double w[INCOUNT];// весовые коэфициенты double w0;// доп вес double sum;// сумма double y;// выход аксон double h; // множитель задающий скорость движения }; //--------------------------------------------------------------------------- class CNeuroNet { public: CNeuroNet(void); ~CNeuroNet(void); float ActiveSigm(float x); float ActiveSigmPro(float x); void ProcNeuro(Neuron& n); int Process(); int Teach(int Num); void AutoTeach(); void ProcNet(); void Draw(); int m_NeuroCount; Neuron m_Neuro[NEUROCOUNT]; int m_TechColor; int m_Red; int m_Green; int m_Blue; int m_ProcRes; }; CNeuroNet m_NeuroNet; //--------------------------------------------------------------------------- CNeuroNet::CNeuroNet(void) { m_NeuroCount=NEUROCOUNT; for(int i=0;i<m_NeuroCount;i++) { for(int j=0;j<INCOUNT;j++) { m_Neuro[i].x[j]=0; m_Neuro[i].w[j]=1; //((rand()&0xFF)-127)/127. } m_Neuro[i].y=0; m_Neuro[i].sum=0; m_Neuro[i].h=1; m_Neuro[i].w0=1; } } //--------------------------------------------------------------------------- CNeuroNet::~CNeuroNet(void) { } //--------------------------------------------------------------------------- float CNeuroNet::ActiveSigm(float x) //сигмоидальная функция активации { float e=(float)E; float y=1./(1+pow(e,-x))-0.5; return y; } //--------------------------------------------------------------------------- float CNeuroNet::ActiveSigmPro(float x)//производная сигмоид. ф.активации { //используется для обучения нейронной сети float e=(float)E; //методом обратного распространения float y=pow(e,-x)/pow((1+pow(e,-x)),2); return y; } //--------------------------------------------------------------------------- void CNeuroNet::ProcNeuro(Neuron& n) { float Net=0;//NET — взвешенная сумма входных сигналов, for(int i=0;i<INCOUNT;i++) { Net+=n.x[i]*n.w[i]; } Net+=n.w0; n.sum=Net; n.y=ActiveSigm(Net); } //--------------------------------------------------------------------------- int CNeuroNet::Process() { double Max=0; int Num=0; for(int i=0;i<m_NeuroCount;i++) { ProcNeuro(m_Neuro[i]); if(m_Neuro[i].y>Max) { Max=m_Neuro[i].y; Num=i; } } return Num; } //--------------------------------------------------------------------------- int CNeuroNet::Teach(int Num) { Process(); for(int i=0;i<m_NeuroCount;i++) { float t=0; if(Num==i)// t=1 t=1; float deltaRes = m_Neuro[i].y - t;// res - t float delta = ActiveSigmPro(m_Neuro[i].sum)*deltaRes; for(int j=0;j<INCOUNT;j++) { m_Neuro[i].w[j]=m_Neuro[i].w[j]-m_Neuro[i].h*delta*m_Neuro[i].x[j]; } m_Neuro[i].w0 = m_Neuro[i].w0 - m_Neuro[i].h*delta; float a=m_Neuro[i].w0; } return 0; } //--------------------------------------------------------------------------- void CNeuroNet::AutoTeach() { double Red=(((double)(rand()&0xFF)))/255.; double Green=(((double)(rand()&0xFF)))/255.; double Blue=(((double)(rand()&0xFF)))/255.; for(int i=0;i<m_NeuroNet.m_NeuroCount;i++) { m_NeuroNet.m_Neuro[i].x[0]=Red; m_NeuroNet.m_Neuro[i].x[1]=Green; m_NeuroNet.m_Neuro[i].x[2]=Blue; } double Level=Red; if(Green>Level) Level=Green; if(Blue>Level) Level=Blue; Level=Level*0.7; m_TechColor=0; if(Red>Level) m_TechColor|=1; //побитовое ИЛИ (001или010=011) if(Green>Level) m_TechColor|=2; if(Blue>Level) m_TechColor|=4; m_NeuroNet.Teach(m_TechColor); }
alexfint32