Разработка программы моделирования нейронной сети

Общие сведения о принципах построения нейронных сетей. Искусственные нейронные системы. Математическая модель нейрона. Классификация нейронных сетей. Правила обучения Хэбба, Розенблатта и Видроу-Хоффа. Алгоритм обратного распространения ошибки.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 29.09.2014
Размер файла 814,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

}

studyArrayOUT = new double [stOut];

vvodCifr.setMessage("Что на выходе нейронной сети");

if(vvodCifr.showIt())

{

studyArrayOUT = vvodCifr.getMassiv();

}

else

{

txtArea.append ("\n П Р О И З О Ш Л А О Ш И Б К А \n");

return;

}

StudyArrays stAr = new StudyArrays (stIn, studyArrayIN, stOut, studyArrayOUT);

massivStudy.add(stAr);

}

massivStudy.trimToSize();

while (!STOP)

{

e = new double [epoxa];

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

{

StudyArrays s = (StudyArrays)massivStudy.get(i);

tempArray = new double [s.getIN()];

tempArray = s.getArrayIn();

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

{

l = (Layer) massivLayers.get (j);

if (j==0)

{

resultStudy = new double[l.getVIxodi()];

resultStudy = l.makeRas4et (j, tempArray);

}

else

{

tempArray = new double[l.getVIxodi()];

tempArray = l.makeRas4et (j, resultStudy);

resultStudy = new double[l.getVIxodi()];

for (int ij = 0; ij<resultStudy.length; ij++)

{

resultStudy[ij] = tempArray[ij];

}

}

}

result = new double [s.getOUT()];

result = s.getArrayOut();

for (int j =layers-1; j>0; j--)

{

l = (Layer) massivLayers.get (j);

if (j == (layers-1))

{

l.ras4etOshibki (result, resultStudy);

}

else

{

l1 = (Layer) massivLayers.get (j+1);

resultStudy = new double [l.getVIxodi()];

resultStudy = l.getMassivRas4et();

l.ras4etOshibki (l1, resultStudy);

}

}

//вычисление квадрата ошибок

tempArray = new double [s.getOUT()];

tempArray = s.getArrayOut();

l = (Layer) massivLayers.get (massivLayers.size()-1);

tempArray2 = new double [l.getVIxodi()];

tempArray2 = l.getMassivRas4et();

boolean last = true;

temp = 0;

for (int j=0; j < l.getVIxodi(); j++)

{

temp= temp + (tempArray2[j]- tempArray[j])*(tempArray2[j]- tempArray[j]);

}

e[i]=temp;

//изменение весовых коэффициентов

for (int j =layers-1; j>0; j--)

{

l = (Layer) massivLayers.get (j);

tempArray = new double[l.getVIxodi()];

tempArray = l.getMassivOshibok ();

l1 = (Layer) massivLayers.get (j-1);

resultStudy = new double [l1.getVIxodi()];

resultStudy = l1.getMassivRas4et();

l.izmenenieVesov (normaObu4eniya, resultStudy, tempArray);

}

}

//проверка на достоверность

temp =0;

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

{

temp=temp+e[i];

}

temp=temp/2;

if (temp<Em) STOP = true;

counter++;

if (counter==10) {JOptionPane.showMessageDialog(null,"Прошло "+(count2*10)+" эпох обучения");

count2++; counter=1;}

}

}

/**

Объект класса StudyArrays представляет собой один

обучающий образец из эпохи.

*/

private class StudyArrays

{

/**

Конструктор класса StudyArrays

@param int input -количество входных нейронов

@param double[] array1 -значение входных сигналов

@param int output -количество выходных нейронов

@param double[] array2 -целевое значение выходных сигналов

*/

public StudyArrays (int input, double[] array1, int output, double[] array2)

{

in = input;

arrayInput = new double [in];

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

{

arrayInput[i]= array1[i];

}

out = output;

arrayOutput = new double [out];

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

{

arrayOutput[i]= array2[i];

}

}

/**

Отображает информацию обучающего образца

@return количество входных нейронов

*/

public int getIN ()

{

return in;

}

/**

Отображает информацию обучающего образца

@return количество выходных нейронов

*/

public int getOUT ()

{

return out;

}

/**

Отображает информацию обучающего образца

@return значения поступающие на входные нейроны

*/

public double[] getArrayIn ()

{

return arrayInput;

}

/**

Отображает информацию обучающего образца

@return значения которые должна выдать нейронная сеть

*/

public double[] getArrayOut ()

{

return arrayOutput;

}

private double [] arrayInput;

private int in;

private double [] arrayOutput;

private int out;

}

public int getIn ()

{

return in;

}

public int getsubS ()

{

return subS;

}

public int getout ()

{

return out;

}

public int[] getsub ()

{

return sub;

}

private int count2 = 1;

private int counter=1;

private VvodCifr vvodCifr= null;

private int funkciya;

private VivodRez VIvod = null;

private int strok=0;

private int stolbcov=0;

private VvodKartinki vvod= null;

private double [] e;

private boolean STOP = false;

private static double Em;

private static double normaObu4eniya;

private double [] resultStudy;

private Layer l;

private Layer l1;

private ArrayList massivStudy;

private ArrayList massivLayers;

private static int layers;

private double temp;

private double [] tempArray;

private double [] tempArray2;

private double [] studyArrayIN;

private int stIn;

private double [] studyArrayOUT;

private int stOut;

private double [] result;

private String input;

private int in;

private int subS;

private int[] sub;

private int out;

}

Листинг программного модуля, описывающего слой нейронной сети

/**

Объект класса Layer является моделью одного слоя нейронной сети.

Слой характеризуется типом: входной, скрытый или выходной, а так же количеством нейронов в слое. Каждый нейрон слоя связан со всеми нейронами предидущего и последующего слоев.

*/

package classNet.classLayer;

import classNeiron.*;

import java.util.*;

import java.io.*;

import javax.swing.*;

public class Layer implements Serializable

{

/**

Конструктор класса Layer

@param String tip - строка описывающая слой (in-входной, sub-скрытый, out-выходной)

@param int capacityNeironov хранит количество нейронов в этом слое

@param int vxodi хранит количество входов в каждый нейрон слоя, и соответствует

количеству нейронов предидущего слоя

*/

public Layer (String tip, int capacityNeironov, int vxodi, int fun)

{

koli4estvo = capacityNeironov;

funkciya = fun;

massivNeironov = new ArrayList(koli4estvo);

tip.toLowerCase();

if (tip == "in")

{

input = koli4estvo;

output = 1;

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

{

Neiron neiron1 = new Neiron (1, output, "in", funkciya);

massivNeironov.add(neiron1);

}

massivNeironov.trimToSize();

}

else

{

if (tip == "out")

{

input = vxodi;

output = koli4estvo;

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

{

Neiron neiron1 = new Neiron (input , 1, "out", funkciya);

massivNeironov.add(neiron1);

}

massivNeironov.trimToSize();

}

else

{

if (tip == "sub")

{

input = vxodi;

output = 1;

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

{

Neiron neiron1 = new Neiron (input, output, "sub", funkciya);

massivNeironov.add(neiron1);

}

massivNeironov.trimToSize();

}

}

}

}

/**

Возвращает количество нейронов в слое

@return количество нейронов

*/

public int getVIxodi ()

{

return koli4estvo;

}

/**

Устанавливает новое значение количества выходов в каждом нейроне слоя

@param int VIxodi - количество выходов из нейрон, равное

количеству нейронов последующего слоя

*/

public void setVIxodi (int VIxodi)

{

output = VIxodi;

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

{

Neiron n = (Neiron)massivNeironov.get(i);

n.setVIxodi(output);

}

}

/**

Возвращает значение объекта в виде текста

@return текст, каждая строка которого характеризует очередной нейрон */

public String getInfo ()

{

String infoString = "";

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

{

int n = infoString.length();

infoString= infoString.substring(0,n) + "Нейрон"+(i+1)+"\n"+(Neiron)massivNeironov.get(i)+"\n";

}

return infoString;

}

/**

Производит вычисления всех нейронов слоя

@param int thisSloi - номер текущего слоя в модели сети. Необходим, чтобы

отличить методы расчета результата в нейроне

@param double [] lastSloiResult значения на выходах нейронов предидущего слоя

@return массив результатов

*/

public double[] makeRas4et (int thisSloi, double [] lastSloiResult)

{

massivRas4et = new double[koli4estvo];

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

{

Neiron n = (Neiron) massivNeironov.get(i);

if (thisSloi==0)

{

temp = lastSloiResult[i];

temp = n.getINResult (temp);

}

else

{

temp = n.getResult (lastSloiResult);

}

massivRas4et[i]=temp;

}

return massivRas4et;

}

/**

Возвращает ранее вычисленные значения выходных сигналов нейронов слоя

@return массив результатов

*/

public double[] getMassivRas4et ()

{

return massivRas4et;

}

/**

Рассчитывает погрешность одной связи

@param int J - номер нейрона в слое

@param int I - номер весового коэффициента для нейрона

@return погрешность

*/

public double getDeltaW (int I, int J)

{

Neiron n = (Neiron) massivNeironov.get(J);

double tmp = n.getVesKoef (I);

tmp = tmp * massivOshibok[J];

return tmp;

}

/**

Вычисляет ошибки нейронов выходного слоя

@param double [] obrazecResult - целевой выходной образец

@param double [] realniiResult - реальный вывод сети

*/

public void ras4etOshibki (double [] obrazecResult, double [] realniiResult)

{

massivOshibok = new double [koli4estvo];

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

{

Neiron n = (Neiron) massivNeironov.get(i);

if (funkciya==0) delta = (obrazecResult[i]-realniiResult[i])*realniiResult[i]*(1-realniiResult[i]);

if (funkciya==1) delta = 0.5*(obrazecResult[i]-realniiResult[i])*(1-realniiResult[i]*realniiResult[i]);

massivOshibok[i] = delta;

}

}

/**

Вычисляет ошибки нейронов скрытого слоя

@param Layer preL - предидущий слой, при "обратном проходе"

@param double [] realniiResult - реальный вывод текущего слоя

*/

public void ras4etOshibki (Layer preL, double [] realniiResult)

{

massivOshibok = new double [koli4estvo];

tempArray = new double [preL.getVIxodi()];

tempArray = preL.getMassivRas4et();

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

{

sum = 0;

if(funkciya==0)

{

for (int j = 0; j< preL.getVIxodi(); j++)

{

temp = preL.getDeltaW(i, j)*tempArray[j]*(1-tempArray[j]);

sum = sum + temp;

}

delta = realniiResult[i]*(1-realniiResult[i])*sum;

}

if(funkciya==1)

{

for (int j = 0; j< preL.getVIxodi(); j++)

{

temp = preL.getDeltaW(i, j)*(1-tempArray[j]*tempArray[j]);

sum = sum + temp/2;

}

delta = realniiResult[i]*(1-realniiResult[i])*sum;

}

massivOshibok[i] = delta;

}

}

/**

Возвращает ранее вычисленные значения ошибок нейронов слоя

@return массив ошибок

*/

public double[] getMassivOshibok ()

{

return massivOshibok;

}

/**

Корректирует весовые коэффициенты нейронов слоя

@param double normaObu4 - const норма обучения

@param double [] resultPreL - результат предидущего слоя, при "прямом проходе"

@param double [] oshibki - ошибки нейронов текущего слоя

*/

public void izmenenieVesov (double normaObu4, double [] resultPreL, double [] oshibki)

{

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

{

Neiron n = (Neiron) massivNeironov.get(i);

for (int j =0; j<=resultPreL.length; j++)

{

if (j!=resultPreL.length)

{

if (funkciya==0) temp = oshibki[i] * normaObu4 * resultPreL[j];

if (funkciya==1) temp = 0.5*oshibki[i] * normaObu4 * resultPreL[j];

n.setVesKoef(j, temp);

}

else

{

if (funkciya==0) temp = oshibki[i] * normaObu4 * 1;

if (funkciya==1) temp = 0.5*oshibki[i] * normaObu4 * 1;

n.setVesKoef(j, temp);

}

}

}

}

private int funkciya;

private double sum;

private double delta;

private double temp;

private ArrayList massivNeironov;

private double [] massivRas4et;

private double [] massivOshibok;

private double [] tempArray;

private int input;

private int output;

private int koli4estvo;

}

ПРИЛОЖЕНИЕ В

Листинг программного модуля, описывающего работу нейронного элемента

/**

Объект класса Neiron является математической моделью биологического нейрона. Нейрон иеет не менее одного входа и не менее одного выхода. Каждому входу соответствует весовой коэффициент.

Так же нейрон характеризуется функцией активности.

*/

package classNeiron;

import java.awt.*;

import javax.swing.*;

import java.io.*;

import java.util.*;

public class Neiron implements Serializable

{

/**

Конструктор класса Neiron

@param int IN хранит количество входов в данный нейрон

@param int OUT хранит количество выходов из данного нейрон

@param int type хранит тип нейрона, может быть входным, скрытым или выходным

*/

public Neiron (int IN, int OUT, String type, int fun)

{

funkciya = fun;

VIxodi = OUT;

if (type == "in")

{

vxodi = 1;

ves_koef = new float [vxodi];

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

{

ves_koef[i]=1.0F;

}

}

else

{

vxodi = IN+1;

ves_koef = new float [vxodi];

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

{

vk = Math.random();

if (vk<=0.45) { ves_koef[i]= (float)vk;}

ves_koef[i]=(float)(0.45-vk);

}

}

}

/**

Устанавливает новое значение количества выходов

@param int out - количество выходов из данного нейрон

*/

public void setVIxodi (int out)

{

VIxodi = out;

}

/**

Возвращает количество входов в нейрон

@return количество входов

*/

public int get_vxodi ()

{

return vxodi;

}

/**

Возвращает количество выходов из нейрон

@return количество выходов

*/

public int get_VIxodi ()

{

return VIxodi;

}

/**

Возвращает весовой коэффициент определенного входа

@param int nomer_koef - номер интересующего входа

@return значение весового коэффициента соответствующего заданному входу

*/

public float getVesKoef (int nomer_koef)

{

return ves_koef[nomer_koef];

}

/**

Возвращает значение объекта в виде строки

@return строку, содержащую информацию о количестве входов, соответствующих

весовых коэффициентах, и количестве выходов

*/

public String toString ()

{

String str = "входов="+vxodi;

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

{

n=str.length();

if (i!= vxodi-1) str= str.substring(0,n) + " весовой коэф[" +(i+1) +"] связи =" +ves_koef[i];

else str= str.substring(0,n) + " весовой коэф[" +(i+1) +"] смещения =" +ves_koef[i];

}

n=str.length();

str= str.substring(0,n) + " ВЫходов=" +VIxodi;

return str;

}

/**

Вычисляет результат функционирования нейрона скрытого или выходного

@param double [] tempResult - значения поступающие на каждый вход нейрона

(за исключением входа смещения) для вычисления взвешенной суммы

@return значение функции активации

*/

public double getResult (double [] tempResult)

{

sum = 0.0;

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

{

if (i < (vxodi-1)) sum = sum + ves_koef[i]*(tempResult[i]);

else sum = sum + ves_koef[i]*1;

}

result = getResultat (sum);

return result;

}

/**

Вычисляет результат функционирования нейрона входного слоя

@param double tempResult - значения поступающие на вход нейрона

для вычисления взвешенной суммы

@return значение функции активации

*/

public double getINResult (double tempResult)

{

sum = 0.0;

sum = sum + ves_koef[0]*tempResult;

result = getINResultat(sum);

return result;

}

/**

Рассчитывает функцию активации для нейрона скрытого или выходного слоя

@param double param - взвешенная сумма

@return значение функции активации (сигмоидальна функция)

*/

public double getResultat (double param)

{

if (funkciya==0)

{

res = 1.0/(1.0 + Math.exp(-param));

}

if (funkciya==1)

{

res = -1.0 + 2.0/(1.0 + Math.exp(-param));

}

return res;

}

/**

Рассчитывает функцию активации для нейрона входного слоя

@param double param - взвешенная сумма

@return значение функции активации (линейная функция)

*/

public double getINResultat (double param)

{

double res = param;

return res;

}

/**

Устанавливает весовой коэффициент

@param int j - номер входа, весовой коэффициент которого необходимо скорректировать

@param int tmp - величина на которую измениться весовой коэффициент

*/

public void setVesKoef (int j, double tmp)

{

double temp = ves_koef [j] + tmp;

ves_koef[j] = (float)temp;

}

private double res;

private int funkciya;

private double result;

private double sum;

private String input;

private int inp;

private double vk;

private int n;

private int vxodi;

private int VIxodi;

private float [] ves_koef;

}

ПРИЛОЖЕНИЕ Г

Листинги программных модулей, описывающих графический интерфейс программы

Листинги класса панели с кнопками для создания нейронной сети

package classWindow;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class ButonPanel extends JPanel

{

public ButonPanel (DrawPanel panelDraw)

{

setLayout (layout);

JButton nextButton = new JButton ("Далее");

NextAction nextAction = new NextAction (panelDraw, "drawLines");

nextButton.addActionListener (nextAction);

add(nextButton);

layout.putConstraint(SpringLayout.WEST, nextButton, strut, SpringLayout.WEST, this);

layout.putConstraint(SpringLayout.SOUTH, nextButton, strut2, SpringLayout.SOUTH, this);

rast = rast -35;

strut2 = Spring.constant (rast);

addButton ("выходной слой", "classWindow\\outSloy.gif", this, panelDraw);

addButton ("скрытый слой", "classWindow\\subSloy.gif", this, panelDraw);

addButton ("входной слой", "classWindow\\inSloy.gif", this, panelDraw);

}

private void addButton (String labl, String icn, Component parent, DrawPanel panDr)

{

JLabel podpis = new JLabel (labl);

this.add(podpis);

layout.putConstraint(SpringLayout.WEST, podpis, strut, SpringLayout.WEST, parent);

layout.putConstraint(SpringLayout.SOUTH, podpis, strut2, SpringLayout.SOUTH, parent);

rast = rast -15;

strut2 = Spring.constant (rast);

JButton button = new JButton (new ImageIcon (icn));

button.setVerticalTextPosition(SwingConstants.TOP);

NextAction probaAction = new NextAction (panDr, icn);

button.addActionListener (probaAction);

this.add(button);

layout.putConstraint(SpringLayout.WEST, button, strut, SpringLayout.WEST, parent);

layout.putConstraint(SpringLayout.SOUTH, button, strut2, SpringLayout.SOUTH, parent);

rast = rast -85;

strut2 = Spring.constant (rast);

}

private class NextAction implements ActionListener

{

public NextAction (DrawPanel drPan, String nameSloy)

{

panDraw = drPan;

sloy = nameSloy;

}

public void actionPerformed (ActionEvent event)

{

setVisible(panDraw.setSloy(sloy));

}

private String sloy;

private DrawPanel panDraw;

}

private int rast=-5;

private Spring strut2 = Spring.constant (rast);

private SpringLayout layout = new SpringLayout ();

private Spring strut = Spring.constant (25);

}

Листинги класса панели для отображения слоев нейронной сети

package classWindow;

import java.awt.*;

import java.awt.event.*;

import java.util.*;

import java.awt.geom.*;

import javax.swing.*;

import classNet.*;

import classWindow.ImagePanel;

public class DrawPanel extends JPanel

{

public DrawPanel (JTextArea textArea, MyMenu mM)

{

txtArea = textArea;

mMenu = mM;

owner = (Frame)SwingUtilities.getAncestorOfClass(DrawPanel.class, this);

squares = new ArrayList ();

current = null;

addMouseListener (new MouseHandler ());

addMouseMotionListener (new MouseMotionHandler ());

popup = new JPopupMenu();

JMenuItem deleteItem = new JMenuItem ("удалить");

deleteItem.addActionListener (new

ActionListener()

{

public void actionPerformed (ActionEvent evt)

{

txtArea.append ("\n был удален элемент \n");

remove (current);

}

});

popup.add(deleteItem);

}

public boolean setSloy (String sloy)

{

if (sloy == "classWindow\\outSloy.gif")

{

iSloy=false; sSloy=false; oSloy=true; return true;

}

if (sloy == "classWindow\\subSloy.gif")

{

iSloy=false; sSloy=true; oSloy=false; return true;

}

if (sloy == "classWindow\\inSloy.gif")

{

iSloy=true; sSloy=false; oSloy=false; return true;

}

if (sloy == "drawLines")

{

if (iSloyExist && oSloyExist)

{

net1 = new Net (owner, ain, asubS, asub, aout);

ImagePanel imPanel = new ImagePanel (net1);

mMenu.setNet (net1);

setVisible(false);

return false;

}

else txtArea.append("\n!!! Необходимо иметь как минимум входной и выходной слой !!!\n");

return true;

}

return true;

}

public void paintComponent (Graphics g)

{

super.paintComponent (g);

Graphics2D g2 = (Graphics2D) g;

for (int i = 0; i < squares.size (); i++)

g2.draw ((Rectangle2D)squares.get(i));

}

public Rectangle2D find (Point2D p)

{

for (int i = 0; i < squares.size (); i++)

{

Rectangle2D r = (Rectangle2D) squares.get (i);

if (r.contains (p)) return r;

}

return null;

}

public void add (Point2D p)

{

double x = p.getX ();

double y = p.getY ();

if (iSloy)

{

ainput = JOptionPane.showInputDialog ("Количество нейронов в слое");

ain = Integer.parseInt (ainput);

iSloyExist = true;

current = new Rectangle2D.Double (x-SIDELENGTH/2, y-SIDELENGTH/2, SIDELENGTH/2, SIDELENGTH);

squares.add (0, current);

}

if (sSloy)

{

ainput = JOptionPane.showInputDialog ("Количество нейронов в слое");

atemp = Integer.parseInt (ainput);

asubS++;

if (asubS==1)

{

asub = new int [asubS];

asub[0] = atemp;

}

else

{

int [] tempSub = new int [asubS-1];

System.arraycopy(asub, 0, tempSub, 0, asub.length);

asub = new int [asubS];

System.arraycopy(tempSub, 0, asub, 0, tempSub.length);

asub[asubS-1] = atemp;

}

sSloyExist = true;

current = new Rectangle2D.Double (x-SIDELENGTH/2, y-SIDELENGTH/2, SIDELENGTH, SIDELENGTH);

atemp = squares.size();

if (atemp == 0) squares.add (current);

else if (oSloyExist) squares.add (squares.size()-1, current);

else squares.add (squares.size(), current);

}

if (oSloy)

{

ainput = JOptionPane.showInputDialog ("Количество нейронов в слое");

aout = Integer.parseInt (ainput);

oSloyExist = true;

current = new Rectangle2D.Double (x-SIDELENGTH/2, y-SIDELENGTH/2, SIDELENGTH*2, SIDELENGTH);

atemp = squares.size();

if (atemp == 0) squares.add (current);

else squares.add (squares.size(), current);

}

iSloy=false;

sSloy=false;

oSloy=false;

repaint ();

}

public void remove (Rectangle2D s)

{

if (s == null) return;

if (s == current)

{

double st = current.getWidth ();

if (st == SIDELENGTH*2) oSloyExist = false;

if (st == SIDELENGTH ) sSloyExist = false;

if (st == SIDELENGTH/2) iSloyExist = false;

current = null;

}

squares.remove (s);

repaint ();

}

private class MouseHandler extends MouseAdapter

{

public void mousePressed (MouseEvent event)

{

current = find (event.getPoint ());

if (current == null && (event.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK)!=0)

{

if ((iSloy && iSloyExist) ||(oSloy && oSloyExist))

{

txtArea.append("\nТакой слой уже есть!!!!\n");

}

else

{

add (event.getPoint ());

}

}

if (current != null && (event.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK)!=0)

{

int last_x = (int)current.getX() - event.getX();

int last_y = (int)current.getY() - event.getY();

}

if (event.isPopupTrigger() && current != null)

{

popup.show (event.getComponent(), event.getX(), event.getY());

}

}

public void mouseClicked (MouseEvent event)

{

current = find (event.getPoint ());

if (event.isPopupTrigger() && current != null)

{

popup.show (event.getComponent(), event.getX(), event.getY());

}

}

public void mouseReleased (MouseEvent event)

{

current = find (event.getPoint ());

if (event.isPopupTrigger() && current != null)

{

popup.show (event.getComponent(), event.getX(), event.getY());

}

}

}

private class MouseMotionHandler implements MouseMotionListener

{

public void mouseMoved (MouseEvent event)

{

if (find(event.getPoint())==null) setCursor(Cursor.getDefaultCursor());

else setCursor (Cursor.getPredefinedCursor (Cursor.CROSSHAIR_CURSOR));

}

public void mouseDragged (MouseEvent event)

{

if (current != null)

{

dim = getSize();

double sideHeight = current.getHeight();

double sideWidth = current.getWidth();

if((current.getY() + sideHeight) > dim.getHeight())

{

new_y = dim.getHeight()-sideHeight/2-1;

}

else

{

if(current.getY() < 0)

{

new_y = 1+sideHeight/2;

}

else

{

new_y = event.getY();

}

}

if((current.getX() + sideWidth) > dim.getWidth())

{

new_x = dim.getWidth()-sideWidth/2-1;

}

else

{

if(current.getX() < 0)

{

new_x = sideWidth/2+1;

}

else

{

new_x = event.getX();

}

}

current.setFrame (new_x-sideWidth/2, new_y-sideHeight/2, sideWidth, sideHeight);

repaint ();

}

}

}

private Frame owner;

private double new_x;

private double new_y;

private Dimension dim;

private MyMenu mMenu;

private boolean iSloyExist=false;

private boolean sSloyExist=false;

private boolean oSloyExist=false;

private boolean iSloy=false;

private boolean sSloy=false;

private boolean oSloy=false;

private JTextArea txtArea;

private JPopupMenu popup;

private static final int SIDELENGTH = 50;

private ArrayList squares;

private Rectangle2D current;

private Net net1;

private String ainput;

private int ain;

private int asubS;

private int[] asub = new int [0];

private int aout;

private int atemp;

}

Листинги класса меню

package classWindow;

import classNet.*;

import classNet.classLayer.*;

import classWindow.ImagePanel;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.*;

import javax.swing.filechooser.FileFilter;

import java.io.*;

import java.util.*;

public class MyMenu extends JMenu

{

public MyMenu (JTextArea textArea, JMenuBar menuBar)

{

owner = (Frame)SwingUtilities.getAncestorOfClass(MyMenu.class, this);

txtArea = textArea;

chooser = new JFileChooser();

chooser.setMultiSelectionEnabled (false);

chooser.setFileSelectionMode (JFileChooser.FILES_AND_DIRECTORIES);

chooser.setAcceptAllFileFilterUsed (false);

NetFileFilter filter = new NetFileFilter ();

filter.setDescription ("Net Files");

chooser.setFileFilter (filter);

ActionListener showNet = new ShowNet ();

ActionListener saveNet = new SaveNetAction ();

ActionListener openNet = new OpenNetAction ();

ActionListener ras4etNet = new Ras4etNetAction ();

ActionListener studyNet = new StudyNetAction ();

ActionListener showNetImage = new ShowNetImageAction ();

JMenu fileMenu = new JMenu ("Файл");

menuBar.add (fileMenu);

JMenuItem openNetItem = new JMenuItem ("Открыть..");

openNetItem.addActionListener (openNet);

fileMenu.add (openNetItem);

saveNetItem = new JMenuItem ("Сохранить как");

saveNetItem.addActionListener (saveNet);

fileMenu.add (saveNetItem);

saveNetItem.setEnabled (false);

fileMenu.addSeparator();

JMenuItem exitItem = new JMenuItem ("Выход");

exitItem.addActionListener (new

ActionListener ()

{

public void actionPerformed (ActionEvent event)

{

System.exit (0);

}

});

fileMenu.add (exitItem);

JMenu netMenu = new JMenu ("Нейро-сеть");

menuBar.add (netMenu);

ras4etNetItem = new JMenuItem ("Расчет");

ras4etNetItem.addActionListener (ras4etNet);

netMenu.add (ras4etNetItem);

ras4etNetItem.setEnabled (false);

studyNetItem = new JMenuItem ("Обучение");

studyNetItem.addActionListener (studyNet);

netMenu.add (studyNetItem);

studyNetItem.setEnabled (false);

fileMenu.addSeparator();

aboutNetItem = new JMenuItem ("параметры сети");

aboutNetItem.addActionListener (showNet);

netMenu.add (aboutNetItem);

aboutNetItem.setEnabled (false);

showNetImageItem = new JMenuItem ("схема сети");

showNetImageItem.addActionListener (showNetImage);

netMenu.add (showNetImageItem);

showNetImageItem.setEnabled (false);

}

public void setNet (Net n)

{

net2 = n;

saveNetItem.setEnabled (true);

aboutNetItem.setEnabled (true);

ras4etNetItem.setEnabled (true);

studyNetItem.setEnabled (true);

showNetImageItem.setEnabled (true);

}

private class ShowNetImageAction implements ActionListener

{

public void actionPerformed (ActionEvent event)

{

if (net2!=null && imPanel == null) {imPanel = new ImagePanel (net2);}

if (net2!=null && imPanel != null) {imPanel.setVisible(true);}

}

}

private class SaveNetAction implements ActionListener

{

public void actionPerformed (ActionEvent event)

{

chooser.setCurrentDirectory (new File ("."));

int result = chooser.showSaveDialog (null);

String filename = chooser.getSelectedFile().getPath();

net2.SaveNet(filename);

}

}

private class Ras4etNetAction implements ActionListener

{

public void actionPerformed (ActionEvent event)

{

net2.MakeRas4et(txtArea);

}

}

private class StudyNetAction implements ActionListener

{

public void actionPerformed (ActionEvent event)

{

net2.Study(txtArea);

}

}

private class OpenNetAction implements ActionListener

{

public void actionPerformed (ActionEvent event)

{

chooser.setCurrentDirectory (new File ("."));

int result = chooser.showOpenDialog (null);

if (result ==JFileChooser.APPROVE_OPTION)

{

String filename = chooser.getSelectedFile().getPath();

net2 = new Net(owner, filename);

if (imPanel != null)

{

imPanel.setVisible(false);

}

imPanel = new ImagePanel (net2);

saveNetItem.setEnabled (true);

aboutNetItem.setEnabled (true);

ras4etNetItem.setEnabled (true);

studyNetItem.setEnabled (true);

showNetImageItem.setEnabled (true);

}

}

}

private class ShowNet implements ActionListener

{

public void actionPerformed (ActionEvent event)

{

net2.ShowNetInfo(txtArea);

}

}

private ImagePanel imPanel;

private Frame owner;

private JMenuItem showNetImageItem;

private JMenuItem studyNetItem;

private JMenuItem ras4etNetItem;

private JMenuItem saveNetItem;

private JMenuItem aboutNetItem;

private JFileChooser chooser;

private Net net2;

private JTextArea txtArea;

}

class NetFileFilter extends FileFilter

{

public void setDescription (String aDescription)

{

description = aDescription;

}

public String getDescription()

{

return description;

}

public boolean accept (File f)

{

if (f.isDirectory()) return true;

String name = f.getName().toLowerCase();

if (name.endsWith(".net")) return true;

return false;

}

private String description = "";

}

Листинги класса диалогового окна для ввода информации в нейронную сеть

package classWindow;

import java.awt.*;

import java.awt.event.*;

import java.util.*;

import javax.swing.*;

public class VvodKartinki extends JDialog

{

public VvodKartinki (Frame owner, int aStolbcov, int aStrok)

{

super (owner, "Изображение для обработки", true);

stolbcov = aStolbcov;

strok = aStrok;

kN = strok*stolbcov;

kartinka = new ArrayList (kN);

massiv = new double [kN];

Container contentPane = getContentPane();

setSize(stolbcov*40,(strok+1)*40);

InpPanel panel = new InpPanel(VvodKartinki.this);

contentPane.add(panel, BorderLayout.CENTER);

setResizable(false);

}

private class InpPanel extends JPanel

{

public InpPanel (final JDialog owner)

{

GridBagLayout layout = new GridBagLayout ();

setLayout (layout);

GridBagConstraints constraints = new GridBagConstraints ();

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

{

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

{

constraints = getConstr(j, i, 1, 1);

SmallButton sb = new SmallButton ();

add(sb, constraints);

kartinka.add(sb);

}

}

UprPanel panel22 = new UprPanel (owner);

constraints = getConstr(0, strok+1, stolbcov, 1);

add(panel22, constraints);

}

private GridBagConstraints getConstr (int x, int y, int w, int h)

{

GridBagConstraints constraint = new GridBagConstraints ();

constraint.fill = GridBagConstraints.BOTH;

Insets ins = new Insets (1,1,1,1);

constraint.insets = ins;

constraint.weightx = 100;

constraint.weighty = 100;

constraint.gridx = x;

constraint.gridy = y;

constraint.gridwidth = w;

constraint.gridheight = h;

return constraint;

}

private class SmallButton extends JButton

{

public SmallButton ()

{

setBackground(color0);

addMouseListener (new MouseHandler ());

}

private class MouseHandler extends MouseAdapter

{

public void mousePressed (MouseEvent event){}

public void mouseReleased (MouseEvent event){}

public void mouseClicked (MouseEvent event)

{

Color c = getBackground();

if(c == color0) setBackground(color1);

if(c == color1) setBackground(color0);

}

}

}

private class UprPanel extends JPanel

{

public UprPanel (final JDialog owner)

{

JButton okButton = new JButton ("ok");

okButton.addActionListener (new

ActionListener()

{

public void actionPerformed(ActionEvent event)

{

ok = true;

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

{

SmallButton s = (SmallButton)kartinka.get(i);

Color c = s.getBackground();

if (c == color0) massiv[i]=0;

if (c == color1) massiv[i]=1;

}

owner.setVisible (false);

}

});

JButton cancelButton = new JButton ("Cancel");

cancelButton.addActionListener(new

ActionListener()

{

public void actionPerformed (ActionEvent event)

{

owner.setVisible (false);

}

});

add(okButton);

add(cancelButton);

}

}

}

public boolean showIt ()

{

ok = false;

setVisible(true);

return ok;

}

public double[] getMassiv ()

{

return massiv;

}

private Color color1 = new Color (100,100,100);

private Color color0 = new Color (200,200,200);

private boolean ok;

private String input;

private ArrayList kartinka;

private int kN;

private double [] massiv;

private int strok;

private int stolbcov;

}

Листинги класса диалогового окна для вывода изображения модели нейронной сети

package classWindow;

import java.awt.*;

import java.awt.geom.*;

import java.util.*;

import javax.swing.*;

import classNet.*;

public class ImagePanel extends JDialog

{

public ImagePanel (Net net1)

{

Container contentPane = getContentPane();

setTitle ("Схема нейронной сети");

setResizable(false);

setModal (false);

ain=net1.getIn();

asubS=net1.getsubS();

asub = new int [asubS];

asub = net1.getsub();

aout=net1.getout();

kL = 2+asubS;

temp = ain;

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

{

if (temp<asub[i]) temp = asub[i];

}

if (temp<aout) temp = aout;

temp = 500/temp;

if ( temp/3 < 25) r=temp/3;

else r=25;

dX=700/kL;

setSize(width, height);

DrPanel panel = new DrPanel();

contentPane.add(panel, BorderLayout.CENTER);

setVisible (true);

}

private class DrPanel extends JPanel

{

public void paintComponent (Graphics g)

{

super.paintComponent (g);

Graphics2D g2 = (Graphics2D)g;

centerX = dX/2;

dY = height/(1+ain);

centerY = dY/2;

massivPoint = new ArrayList();

tempMassivPoint = new ArrayList();

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

{

neiron = new Ellipse2D.Double();

neiron.setFrameFromCenter(centerX,centerY,centerX+r,centerY+r);

g2.setStroke(new BasicStroke(1.0F));

g2.draw(neiron);

p = new Point2D.Double(centerX+r,centerY);

massivPoint.add(p);

g2.setStroke(new BasicStroke(2.0F));

g2.draw(new Line2D.Double(centerX-r,centerY,centerX-r-dX/3,centerY));

g2.draw(new Line2D.Double(centerX-r,centerY,centerX-r-10,centerY-4));

g2.draw(new Line2D.Double(centerX-r,centerY,centerX-r-10,centerY+4));

centerY = centerY+ dY;

}

neiron = new Ellipse2D.Double();

neiron.setFrameFromCenter(centerX+dX/2,520-4*r,centerX+dX/2+r,520-4*r+r);

g2.setStroke(new BasicStroke(2.0F));

g2.draw(neiron);

p = new Point2D.Double(centerX+dX/2+r,520-4*r);

massivPoint.add(p);

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

{

centerX = centerX + dX;

dY = height/(1+asub[j]);

centerY = dY/2;

for (int i =0; i< asub[j]; i++)

{

neiron = new Ellipse2D.Double();

neiron.setFrameFromCenter(centerX,centerY,centerX+r,centerY+r);

g2.setStroke(new BasicStroke(1.0F));

g2.draw(neiron);

p = new Point2D.Double(centerX-r,centerY);

for (int k=0; k< massivPoint.size(); k++)

{

g2.draw(new Line2D.Double((Point2D)massivPoint.get(k), p));

}

p = new Point2D.Double(centerX+r,centerY);

tempMassivPoint.add(p);

centerY = centerY+ dY;

}

neiron = new Ellipse2D.Double();

neiron.setFrameFromCenter(centerX+dX/2,520-4*r,centerX+dX/2+r,520-4*r+r);

g2.setStroke(new BasicStroke(2.0F));

g2.draw(neiron);

p = new Point2D.Double(centerX+dX/2+r,520-4*r);

tempMassivPoint.add(p);

massivPoint.clear();

for (int k=0; k< tempMassivPoint.size(); k++)

{

massivPoint.add(tempMassivPoint.get(k));

}

tempMassivPoint.clear();

}

centerX = centerX + dX;

dY = height/(1+aout);

centerY = dY/2;

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

{

neiron = new Ellipse2D.Double();

neiron.setFrameFromCenter(centerX,centerY,centerX+r,centerY+r);

g2.setStroke(new BasicStroke(1.0F));

g2.draw(neiron);

p = new Point2D.Double(centerX-r,centerY);

for (int k=0; k< massivPoint.size(); k++)

{

g2.draw(new Line2D.Double((Point2D)massivPoint.get(k), p));

}

g2.setStroke(new BasicStroke(2.0F));

g2.draw(new Line2D.Double(centerX+r,centerY,centerX+r+dX/3,centerY));

g2.draw(new Line2D.Double(centerX+r+dX/3,centerY,centerX+r+dX/3-10,centerY-4));

g2.draw(new Line2D.Double(centerX+r+dX/3,centerY,centerX+r+dX/3-10,centerY+4));

centerY = centerY+ dY;

}

}

}

private Ellipse2D neiron;

private Point2D p;

private ArrayList massivPoint;

private ArrayList tempMassivPoint;

private int temp;

private int width=750;

private int height=550;

private double dX;

private double dY;

private double centerX;

private double centerY;

private int kL;

private double r;

private int ain;

private int asubS;

private int[] asub = new int [0];

private int aout;

}

Листинги класса диалогового окна вывода результатов в графическом и числовом виде

package classWindow;

import java.awt.*;

import java.awt.geom.*;

import java.util.*;

import javax.swing.*;

public class VivodRez extends JDialog

{

public VivodRez (double [] massiv2)

{

massivVivod = massiv2;

Container contentPane = getContentPane();

setSize((massivVivod.length*25+200), 250);

setTitle ("Результат работы нейронной сети");

setResizable(false);

setModal (true);

scrollPane2 = new JScrollPane (rezultat);

contentPane.add(scrollPane2, BorderLayout.EAST);

for (int i =0 ; i< massivVivod.length; i++)

{

rezultat.append ((i+1)+" = "+massivVivod[i]+"\n");

}

DrPanel panel = new DrPanel();

contentPane.add(panel, BorderLayout.CENTER);

setVisible (true);

}

private class DrPanel extends JPanel

{

public void paintComponent (Graphics g)

{

super.paintComponent (g);

Graphics2D g2 = (Graphics2D)g;

g2.setPaint (new Color(180, 120, 180));

for (int i=0; i< massivVivod.length; i++)

{

if (massivVivod[i] >=0)

{

height = massivVivod[i]*100;

topY = 109 - height;

}

else

{

height = -(massivVivod[i]*100);

topY = 111;

}

Rectangle2D rect = new Rectangle2D.Double (leftX, topY, width, height);

g2.draw(rect);

g2.fill(rect);

g.drawString(""+(i+1), messageX, messageY);

leftX = leftX+25;

messageX = messageX + 25;

}

g2.setPaint (new Color(90, 60, 90));

g2.draw(new Line2D.Double(5, 10, leftX-5, 10));

g2.draw(new Line2D.Double(5, 110, leftX-5, 110));

g2.draw(new Line2D.Double(5, 210, leftX-5, 210));

g2.drawString("+1", 1, 10);

g2.drawString(" 0", 1, 110);

g2.drawString("-1", 1, 210);

}

}

private int messageX = 20;

private int messageY =225;

private double width = 20;

private double height;

private double leftX = 15;

private double topY;

private JTextArea rezultat = new JTextArea ();

private JScrollPane scrollPane2;

private double [] massivVivod;

}

Листинги класса диалогового окна ввода числовых значений

package classWindow;

import java.awt.*;

import java.awt.event.*;

import java.util.*;

import javax.swing.*;

import java.text.*;

public class VvodCifr extends JDialog

{

public VvodCifr (Frame owner, int kol)

{

super (owner, "Ввод числовых данных", true);

k=kol;

label = new JLabel();

label.setText(text);

kartinka = new ArrayList (k);

massiv = new double [k];

setSize (150, (3+k)*30);

Container contentPane = getContentPane();

InpPanel panel = new InpPanel(VvodCifr.this);

contentPane.add(panel, BorderLayout.CENTER);

contentPane.add(label, BorderLayout.NORTH);

}

private class InpPanel extends JPanel

{

public InpPanel (final JDialog owner)

{

GridBagLayout layout = new GridBagLayout ();

setLayout (layout);

GridBagConstraints constraints = new GridBagConstraints ();

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

{

constraints = getConstr(0, i, 1, 1);

labelNumber = new JLabel();

labelNumber.setText("нейрон "+(i+1));

add(labelNumber, constraints);

constraints = getConstr(1, i, 1, 1);

SmallButton sb = new SmallButton ();

add(sb, constraints);

kartinka.add(sb);

}

UprPanel panel22 = new UprPanel (owner);

constraints = getConstr(0, k+1, 2, 1);

add(panel22, constraints);

}

private GridBagConstraints getConstr (int x, int y, int w, int h)

{

GridBagConstraints constraint = new GridBagConstraints ();

constraint.fill = GridBagConstraints.BOTH;

Insets ins = new Insets (1,1,1,1);

constraint.insets = ins;

constraint.weightx = 100;

constraint.weighty = 100;

constraint.gridx = x;

constraint.gridy = y;

constraint.gridwidth = w;

constraint.gridheight = h;

return constraint;

}

private class SmallButton extends JFormattedTextField

{

public SmallButton ()

{

setValue (new Integer (0));

}

}

private class UprPanel extends JPanel

{

public UprPanel (final JDialog owner)

{

JButton okButton = new JButton (" Ok ");

okButton.addActionListener (new

ActionListener()

{

public void actionPerformed(ActionEvent event)

{

ok = true;

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

{

SmallButton s = (SmallButton)kartinka.get(i);

Number value = (Number) s.getValue();

double v = value.doubleValue();

massiv[i] = v;

}

owner.setVisible (false);

}

});

JButton cancelButton = new JButton ("Cancel");

cancelButton.addActionListener(new

ActionListener()

{

public void actionPerformed (ActionEvent event)

{

owner.setVisible (false);

}

});

add(okButton);

add(cancelButton);

}

}

}

public void setMessage (String txt)

{

label.setText(txt);

}

public boolean showIt ()

{

ok = false;

setVisible(true);

return ok;

}

public double[] getMassiv ()

{

return massiv;

}

private JLabel labelNumber;

private JLabel label;

private boolean ok;

private String text = "пусто";

private ArrayList kartinka;

private int k;

private double [] massiv;

}

Размещено на Allbest.ru


Подобные документы

  • Обучение простейшей и многослойной искусственной нейронной сети. Метод обучения перцептрона по принципу градиентного спуска по поверхности ошибки. Реализация в программном продукте NeuroPro 0.25. Использование алгоритма обратного распространения ошибки.

    курсовая работа [1019,5 K], добавлен 05.05.2015

  • Механизм работы нервной системы и мозга человека. Схема биологического нейрона и его математическая модель. Принцип работы искусственной нейронной сети, этапы ее построения и обучения. Применение нейронных сетей в интеллектуальных системах управления.

    презентация [98,6 K], добавлен 16.10.2013

  • Математическая модель нейронной сети. Однослойный и многослойный персептрон, рекуррентные сети. Обучение нейронных сетей с учителем и без него. Алгоритм обратного распространения ошибки. Подготовка данных, схема системы сети с динамическим объектом.

    дипломная работа [2,6 M], добавлен 23.09.2013

  • Возможности программ моделирования нейронных сетей. Виды нейросетей: персептроны, сети Кохонена, сети радиальных базисных функций. Генетический алгоритм, его применение для оптимизации нейросетей. Система моделирования нейронных сетей Trajan 2.0.

    дипломная работа [2,3 M], добавлен 13.10.2015

  • Рассмотрение способов применения и основных понятий нейронных сетей. Проектирование функциональной структуры автоматизированной системы построения нейросети обратного распространения ошибки, ее классов и интерфейсов. Описание периода "бета тестирования".

    дипломная работа [3,0 M], добавлен 02.03.2010

  • Математическая модель искусственной нейронной сети. Структура многослойного персептрона. Обучение без учителя, методом соревнования. Правило коррекции по ошибке. Метод Хэбба. Генетический алгоритм. Применение нейронных сетей для синтеза регуляторов.

    дипломная работа [1,5 M], добавлен 17.09.2013

  • Обучение нейронных сетей как мощного метода моделирования, позволяющего воспроизводить сложные зависимости. Реализация алгоритма обратного распространения ошибки на примере аппроксимации функции. Анализ алгоритма обратного распространения ошибки.

    реферат [654,2 K], добавлен 09.06.2014

  • Понятие искусственного нейрона и искусственных нейронных сетей. Сущность процесса обучения нейронной сети и аппроксимации функции. Смысл алгоритма обучения с учителем. Построение и обучение нейронной сети для аппроксимации функции в среде Matlab.

    лабораторная работа [1,1 M], добавлен 05.10.2010

  • Понятие и свойства искусственных нейронных сетей, их функциональное сходство с человеческим мозгом, принцип их работы, области использования. Экспертная система и надежность нейронных сетей. Модель искусственного нейрона с активационной функцией.

    реферат [158,2 K], добавлен 16.03.2011

  • Диагностический анализ изучения алгоритмов обучения нейронных сетей "с учителем". Сбор входных и выходных переменных для наблюдений и понятие пре/пост процессирования. Подготовка и обобщение многослойного персептрона, модель обратного распространения.

    курсовая работа [249,3 K], добавлен 22.06.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.