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