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

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    349,69 Кб
  • Опубликовано:
    2015-07-23
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

ВВЕДЕНИЕ

Первые шаги в области искусственных нейронных сетей сделали в 1943 г. В.Мак-Калох (W.MCculloch) и В.Питс (W.Pitts). Они показали, что при помощи пороговых нейронных элементов можно реализовать исчисление любых логических функций. В 1957-1962 гг. Ф.Розенблатт предложил и исследовал модель нейронной сети, которую он назвал персептроном, результаты исследований он обобщил в книге “Принципы нейродинамики”. В 1969г. М.Минский и С.Пайперт опубликовали монографию “Персептроны”, в которой был дан математический анализ персептрона, и показали ограничения, присущие ему. Выводы из были довольно пессимистичными, и это сыграло негативную роль для дальнейшего развития исследований в области нейронных сетей. Работы в этой области были практически остановлены.

В 70-е годы появился ряд работ в области ассоциативной памяти. В 1982г. Д.Хопфилд дал анализ устойчивости нейронных сетей с обратными связями и предложил использовать их для решения задач оптимизации. Ряд авторов (Румельхарт, Хинтон, Уильямс) предложили алгоритм обратного распространения ошибки, который стал мощным средством для обучения многослойных нейронных сетей. В 1987г. под эгидой IEEE (Institute of Electrical and Electronic Engineer’s) проводится первая международная конференция в области нейронных сетей.

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

1. ПРИМЕНЕНИЕ нейронных сетей

Нейрокомпьютеры (компьютеры на основе нейронных сетей) или нейроимитаторы (программы, моделирующие работу нейронных сетей не ЭВМ) обладают целым рядом свойств, привлекательных с точки зрения их практического использования:

-       сверхвысокое быстродействие за счет использования массового параллелизма обработки информации;

-       толерантность к ошибкам - работоспособность сохраняется при повреждении значительного числа нейронов;

-       способность к обучению - программирование системы заменяется обучением;

-       способность к распознаванию образов в условиях сильных помех и искажений.

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

В настоящее время нейронные сети применяются для решения многих неформализуемых или трудно формализуемых задач:

-       распознавания и синтеза речи;

-       распознавания аэрокосмических изображений;

-       прогнозирования котировки ценных бумаг и курса валют;

-       предупреждения мошенничества с кредитными карточками;

-       оценки стоимости недвижимости;

-       оценки финансового состояния предприятий и риска невозврата кредитов;

-       обработки радиолокационных сигналов;

-       контроля движения на скоростных автомагистралях и железных дорогах;

-       диагностики в медицине;

-       добычи знаний из больших объемов данных в бизнесе, финансах и научных исследованиях.

Нейронные сети можно использовать при следующих условиях:

-       если задачу может решать человек;

-       если при решении задачи можно выделить множество входных факторов (сигналов, признаков, данных и т.п.) и множество выходных факторов;

-       если изменения входных факторов приводит к изменению выходных.

В то же время применение нейронных сетей при решении некоторых задач может оказаться эффективнее использования разума человека. Это объясняется тем, что человеческий разум ориентирован на решение задач в трехмерном пространстве. Многомерные задачи для него характеризуются значительно большей трудоемкостью. Искусственным нейронным сетям не свойственно такое ограничение. Им все равно решать трехмерную или 10-мерную задачу.

При применении нейронных сетей необходимо решить следующие задачи:

-        постановка задачи, пригодной для решения с помощью нейронной сети;

-       выбор модели ИНС;

-       подготовка исходных данных для обучения ИНС;

-       обучение ИНС;

-       собственно решение задачи с помощью обученной ИНС.

Кроме того, иногда нужен еще один этап - интерпретация решения, полученного нейронной сетью.

Наиболее трудоемкими процессами при использовании нейронных сетей являются подготовка исходных данных для обучения и обучение нейронной сети.

2. Общие сведения о принципах построения нейронных сетей

.1 Искусственные нейронные системы

Поиски алгоритмов, позволяющих автоматически использовать накопленных опыт, продолжаются уже более 100 лет. С появлением дешевых ЭВМ произошел резкий скачок в этой отрасли. Возникли новых обасти деятельности - нейроинформатика, нейрокибернетика и др. Приставка “нейро” в названии вовсе не случайна. Во-первых, нейрокомпьютеры и нейропрограммы явялются самообучающимися, что отличает их от обычных ЭВМ (программ); во-вторых, принципы их работы напоминают (хотя и отдаленно) взаимодействие клеток нервной системы - нейронов - через специальные связи - синапсы.

Основой работы самообучающихся нейропрограмм является нейронная сеть, представляющая собой совокупность нейронов - элементов, связанных между собой определенным образом. Нейроны и межнейронные связи задаются программно на обычном компьютере или могут иметь “материальную” основу - особые микросхемы, какие применяться в специально созданных нейрокомпьютерах. Функционирование нейрона в нейрокомпьютере или нейропрограмме отдаленно напоминает работу биологического нейрона.

Бионейрон - клетка, имеющая длинные отростки, связанные с другими нейронами с помощью синапсов, предающих электрический импульс от одного нейрона к другому. Отростки подразделяются на дендриты, передающие сигналы к данному нейрону, и аксоны, передающие сигналы от данного нейрона.

2.2 Математическая модель нейрона

Основной элемент нейронной сети - это формальный нейрон. Модель нейрона МакКаллока-Питтса, которая и сейчас является наиболее применяемым формализмом для описания отдельного нейрона в нейронной сети состоит из следующих элементов. Адаптивный сумматор, показанный на рисунке 2.1, вычисляет скалярное произведение вектора входного сигнала X на вектор параметров W. Преобразователь сигнала, изображенный на рисунке 2.2, получает скалярный входной сигнал (X,W) и переводит его в F(X,W). Последовательным соединением адаптивного сумматора с преобразователем, как показано на рисунке 2.3, получаем нейрон. В большинстве случаев на выходе каждого нейрона стоит точка ветвления, служащая для рассылки выходного сигнала нейрона по входам других элементов, рисунок 2.4.

 

Рисунок 2.1 - Адаптивный сумматор Рисунок 2.2 - Преобразователь

Рисунок 2.3 - Формальный нейрон

Рисунок 2.4 - Нейрон с точкой ветвления на выходе

Нейрон осуществляющий операцию нелинейного преобразования суммы произведения входных сигналов на весовые коэффициенты:

,(2.1)

где X - вектор входного сигнала;

W - весовой вектор;

F - оператор нелинейного преобразования.

Сумма произведений входных сигналов на весовые коэффициенты называется взвешенной суммой. Она представляет собой скалярное произведение вектора весов на входной вектор:

,

где |W|, |X| - соответственно длины векторов W и X;

 - угол между векторами W и X.

Длины весового и входного векторов определяются через их координаты:

;

.

Так для нейронного элемента длина весового вектора после обучения |W|=const, то величина взвешенной суммы определяется проекцией входного вектора на весовой вектор:

,

где Xw - проекция вектора X на вектор W.

Если входные векторы нормированы, т.е. |X|=const, то величина взвешенной суммы будет зависеть только от угла между векторами X и W. Тогда при различных входных сигналах взвешенная сумма будет изменяться по косинусоидальному закону. Максимального значения она будет достигать при коллинеарности входного и весового векторов.

Если сила связи wi отрицательная, то такая связь называется тормозящей. В противном случае синоптическая связь является усиливающей.

Оператор нелинейного преобразования называется функцией активации нейронного элемента. В качестве этого оператора могут использоваться различные функции, которые определяются в соответствии с решаемой задачей и типом нейронной сети. Рассмотрим наиболее распространенные функции активации нейронных элементов [2].

Линейная функция. Функция активности для входных элементов может быть тождественной функцией, и в этом случае выходное значение нейронного элемента равняется:

,(2.2)

где k - коэффициента наклона прямой.

Входные элементы обычно предназначены для распределения вводимых сигналов между другими элементами сети, поэтому для входных элементов обычно требуется, чтобы исходящий от элемента сигнал был таким же, как и входящий, т.е. k=1, как показано на рисунке 2.5. В отличие от других элементов сети, входные элементы имеют только по одному входному значению. Например, каждый элемент может получать сигнал от одного соответствующего ему датчика, размещенного на фюзеляже самолета. Один этот элемент связывается со многими другими элементами сети, так что данные, полученные от одного датчика, оказываются распределенными между многими элементами сети. Поскольку входные элементы предназначены исключительно для того, чтобы распределять сигналы, получаемые из внешней среды, многие исследователи вообще не считают входные элементы частью нейронной сети.

Пороговая функция. В качестве пороговой функции активации может использоваться биполярная, рисунок 2.6,а или бинарная, рисунок 2.6,б функция. В случае использования пороговой бинарной функции:

.(2.3)

Если применяется пороговая биполярная функция активации, то выходное значение нейронного элемента:

.(2.4)

Сигмоидная функция. Эта функция является непрерывной, возрастающей функцией в диапазоне [0, 1]:

,(2.5)

где с>0 - коэффициент, характеризующий ширину функции по оси абсцисс

Сигмоидная функция, рисунок 2.7,а является монотонной и всюду дифференцируемой, поэтому она получила широкое распространение в искусственных нейронных сетях. Так же существует биполярная сигмоидная функция, значения которой находятся в диапазоне [-1,1], рисунок 2.7,б:

,(2.6)

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

Рисунок 2.5 - Линейная функция активации

а)                                                                  б)

Рисунок 2.6 - Пороговая функция активации:

а) - бинарная

б) - биполярная

а)                                                               б)

Рисунок 2.7 - Сигмоидная функция активации:

а) - бинарная

б) - биполярная

.3 Классификация нейронных сетей

Нейронные сети различают по структуре сети (связей между нейронами), особенностям модели нейрона, особенностям обучения сети.

По структуре нейронные сети можно разделить на неполносвязные (или слоистые) и полносвязные.

Слоистые сети: нейроны расположены в несколько слоев, рисунок 2.8. Нейроны первого слоя получают входные сигналы, преобразуют их и через точки весвления вередают нейронам второго слоя. Далее срабатывает второй слой и т.д. до k-го, который выдает выходные сигналы для интерпретатора и пользователя. Если не оговорено противное, то каждый выходной сигнал i-го слоя подается на вход всех нейронов i+1-го слоя. Число нейронов в каждом слое может быть любым и никак заранее не связано с количеством нейронов в других слоях. Стандартный способ подачи входных сигналов: все нейроны первого слоя получают каждый входной сигнал. Особое распространение получили трехслойные сети, в которых каждый слой имеет свое наименование: первый - входной, второй - скрытый, третий - выходной.

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

По используемым на входах и выходах сигналам нейронные сети можно разделить на аналоговые и бинарные.

По моделированию времени нейронные сети подразделяются на сети с непрерывным и дискретным временем. Для программной реализации применяется как правило дискретное время.

По способу подачи информации на входы нейронной сети различают:

-          подачу сигналов на синапсы входных нейронов;

-       подачу сигналов на выходы входных нейронов;

-       подачу сигналов в виде весов синапсов входных нейронов;

-       аддитивную подачу на синапсы входных нейронов.

По способу съема информации с выходов нейронной сети различают:

-          съем с выходов выходных нейронов;

-       съем с синапсов выходных нейронов;

-       съем в виде значений весов синапсов выходных нейронов;

-       аддитивный съем с синапсов выходных нейронов.

Рисунок 2.8 - Слоистая сеть

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

По организации обучения разделяют обучение нейронных сетей с учителем (supervised neural networks) и без учителя (nonsupervised). При обучении с учителем предполагается, что есть внешняя среда, которая предоставляет обучающие примеры (значения входов и соответствующие им значения выходов) на этапе обучения или оценивает правильность функционирования нейронной сети, и, в соответствии со своими критериями, запускает механизм изменения состояния нейронной сети. Под состоянием нейронной сети, которое может изменяться, обычно понимается:

-          веса синапсов нейронов;

-       установление новых связей между нейронами (свойство биологических нейронов устанавливать новые связи и ликвидировать старые называется пластичностью).

По способу предъявления примеров различают предъявление одиночных примеров и "страницы" примеров. В первом случае изменение состояния нейронной сети (обучение) происходит после предъявления каждого примера. Во втором - после предъявления "страницы" (множества) примеров на основе анализа сразу их всех.

.4 Математическая модель нейронной сети

.4.1 Однослойные нейронные сети

Рассмотрим нейронные сети, состоящие из одного слоя нейронных элементов, который осуществляет обработку входной информации. Такие сети принято изображать в виде двухслойной нейронной сети, где первый слой нейронных элементов является распределительным, а второй - обрабатывающим. Распределительный слой передает входные сигналы на обрабатывающий слой нейронных элементов, который преобразует входную информацию в соответствии с синоптическими связями и функцией активации. При этом каждый нейрон распределительного слоя имеет синоптические связи со всеми нейронами обрабатывающего слоя. Тогда выходное значение j-го нейронного элемента второго слоя, в соответствии с (2.1) можно представить как:

,

где Tj - порог j-го нейронного элемента;

wij - сила синаптической связи между i-м нейроном распределительного слоя и

j-м нейроном обрабатывающего слоя.

Порог нейронного элемента характеризует расположение функции активации по оси абсцисс. При операциях с нейронными сетями порог нейронного элемента выходного слоя, а так же и срытых слоев, можно выносить за пределы слоя и изображать как синоптическую связь с весовым коэффициентом, равным значению Т, и входным значением, равным -1, рисунок 2.9.

Совокупность весовых коэффициентов сети можно представить в виде матрицы:

.

Тогда вектор-столбец взвешенной суммы в матричном виде определяется как:

,

где Т - вектор-столбец порогов нейронных элементов второго слоя.

Рассмотрим нейронную сеть с двумя нейронами входного и одним нейроном выходного слоя, рисунок 2.9. Функция активации нейронов выходного слоя - пороговая (2.3). Взвешенная сумма:

.

Соответственно выходное значение нейронной сети:

.

Такая сеть осуществляет линейное разделение входного пространства на два класса, и может использоваться для решения задач классификации образов. При этом уравнение разделяющей линии:

.(2.7)

Она разделяет область решений, соответствующую одному классу, от другого класса и называется дискриминантной линией. Из (2.7) получим:

.(2.8)

В системе координат (х2, х1) уравнение (2.8) изображает прямую линию, которая отделяет один класс от другого, рисунок 2.10. При этом величина T1/|W| представляет собой расстояние от центра координат до прямой. Если размерность входного сигнала n=3, то разделяющей поверхностью будет плоскость, если n>3 - гиперплоскость.

Рисунок 2.9 - Однослойная сеть с одним выходным нейроном и представлением порогового значения в виде синоптической связи.

Рисунок 2.10 - Дискриминантная линия

Рассмотрим решение простейших задач логических операций на описанной выше сети. Эти задачи решаются с использованием нейронной сети, если их пространство решений можно разбить на два класса, рисунок 2.11. Из рисунка следует, что рассмотренная сеть может решить задачу И и ИЛИ, но неспособна решить задачу ИСКЛЮЧАЮЩЕЕ ИЛИ. Таким образом, линейная разделяющая поверхность, формируемая нейронной сетью с одним слоем обрабатывающих нейронных элементов, ограничивает круг решаемых задач. Это в свое время показали американские ученые М.Минский и С.Пайперт.

Рассмотрим многослойную нейронную сеть, каждый нейрон которой имеет линейную функцию активации (2.2). Такая нейронная сеть является сетью с прямым распространением сигналов. Она характеризуется тем, что каждый нейронный элемент предыдущего слоя имеет синоптические связи со всеми нейронными элементами следующего слоя, рисунок 2.12. На этом рисунке изображены синоптические соединения только для одного нейрона каждого из слоев. Связи остальных нейронов будут идентичными. Для многослойной нейронной сети приведем доказательство теоремы:

Теорема 1 Многослойная нейронная сеть с линейной функцией активации нейронных элементов эквивалентна однослойной нейронной сети с соответствующей функцией активации нейронных элементов.

Доказательство. Выходные значения нейронной сети в матричной форме определяются следующим образом:

,

где Х(2) - матрица выходных сигналов промежуточного слоя;

W(2) - матрица весовых коэффициентов выходного слоя.

Аналогично, матрицу выходных значений промежуточного слоя можно представить в виде:

.

Отсюда получаем:

,

,

,

Что и требовалось доказать.

а)                                           б)                                           в)

Рисунок 2.11 - Графическая интерпретация решения логических задач типов и (а), или (б) и исключающее или (в)

Рисунок 2.12 - Многослойная линейная сеть

.4.2 Многослойные нейронные сети

Многослойная нейронная сеть способна осуществлять любое отображение входных векторов в выходные. Наибольшее распространение получили нейронные сети со слоистой архитектурой, и сигмоидной функцией активации (2.4) нейронных элементов во всех слоях кроме входного. Функция активации нейронов входного слоя, как отмечалось ранее, является линейной.

Пусть W(i) - матрица весовых коэффициентов i-го слоя многослойной сети. Тогда для нейронной сети с двумя скрытыми слоями выходные значения:

,

где Х=(х1, х2,…,хn) - вектор-строка входных сигналов;

F - оператор нелинейного преобразования.

Общее число синоптических связей:

,

где p - общее число слоев нейронной сети;

k(i) - количество нейронных элементов в i-м слое.

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

Рассмотрим решение задачи ИСКЛЮЧАЮЩЕЕ ИЛИ при помощи трехслойной нейронной сети. На рисунке 2.13 показана такая сеть, созданная в программе, описываемой в п.3 с указанием весовых коэффициентов и пороговых значений нейронных элементов. Слой скрытых нейронных элементов разбивает входное пространство образов на классы при помощи двух прямых, рисунок 2.14. Выходной нейронный элемент осуществляет композицию классов для реализации функции ИСКЛЮЧАЮЩЕЕ ИЛИ. В качестве функции активации нелинейных нейронных элементов используется сигмоидная функция, а поскольку она никогда не достигает значений 0 и 1, то вместо 0 используется 0,1, а вместо 1 - 0,9. Выбор конкретных значений 0,1 и 0,9 не обязателен, поскольку обычно считается, что сеть научилась выполнять задачу, когда все выходные данные попадают в определенные допустимые рамки.

Рисунок 2.13 - Нейронная сеть для решения задачи исключающее или

Рисунок 2.14 - Графическая иллюстрация решения задачи исключающее или

В 1957г. А.Н.Колмогоров показал, что любую непрерывную функцию n переменных на единичном отрезке [0, 1] можно представить в виде суммы конечного числа одномерных функций:

,

где функции g и φp являются одномерными и непрерывными;

λi = const для всех i.

Из данной теоремы следует, что любую непрерывную функцию f:[ 0, 1]n→[ 0, 1] можно аппроксимировать при помощи трехслойной нейронной сети, которая имеет n входных, (2n+1) скрытых и один выходной нейрон. Однако проблема здесь состоит в выборе соответствующих функций g и φ. В 1988г. ряд авторов обобщили приведенные результаты на многослойную нейронную сеть с алгоритмом обратного распространения ошибки:

Теорема2: Любая непрерывная функция f:[0, 1]n→[0, 1] может быть аппроксимирована трехслойной нейронной сетью с одним скрытым слоем и алгоритмом обратного распространения ошибки с любой степенью точности.

Данная теорема является основной для аппроксимации функций при помощи многослойных нейронных сетей.

.5 Обучение нейронной сети

.5.1 Правило обучения Хэбба

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

Правило обучения Хебба имеет биологические предпосылки. Оно является основой многих методов обучения нейронных сетей. Согласно этому правилу, обучение происходит в результате усиления силы связи (синаптического веса) между одновременно активными нейронами. Исходя из этого, часто используемые в сети связи усиливаются, что объясняет феномен обучения путем повторения и привыкания.

Пусть имеются два нейронных элемента i и j, между которыми существует сила связи, равная wij, тогда правило обучения Хебба запишется как:

,

где t - время;

xi и yj- соответственно выходное значение i-го и j-го нейронов.

В начальный момент времени предполагается, что:

.

Правило Хеббо для нейронной сети, изображенной на рисунке 2.9, можно представить в виде выражений:

,

,

.

Аналогичным образом правило Хебба записывается для нейронной сети большей размерности.

Правило Хебба может использоваться как при обучении с учителем, так и без него. Если в качестве выходных значений y нейронной сети используются эталонные значения, то это правило будет соответствовать обучению с учителем. При использовании в качестве y реальных значений, которые получаются при подаче на вход сети входных образов, правило Хебба соответствует обучению без учителя.

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

2.5.2 Правило обучения Розенблатта

Данную процедуру предложил американский ученый Ф.Розенблатт в 1959г. для нейронной сети, которую он назвал персептрон.

Персептрон - это сеть, состоящая из S, A и R нейронных элементов. Нейроны слоя S называются сенсорными и предназначены для формирования входных сигналов в результате внешних воздействий. Нейроны слоя А называются ассоциативными и предназначены для непосредственной обработки входной информации. Нейроны слоя R называются эффекторными. Они служат для передачи сигналов возбуждения к соответствующему объекту, например к мышцам.

Таким образом, персептрон Розенблатта содержит один слой обрабатывающих нейронных элементов, в качестве которых используются нейронные элементы с пороговой функцией активации. Поэтому обучение персептрона происходит путем настройки весовых коэффициентов между слоями S и A.

Математическую формулировку правила обучения Розенблатта можно представить в следующем виде:

,(2.9)

где tj - эталонное значение j-го выхода нейронной сети;

α - коэффициент, характеризующий скорость обучения сети.

Величина скорости обучения характеризуется следующими значениями:

,

.

Процедура обучения Розенблатта состоит из следующих шагов:

1          Весовые коэффициенты W нейронной сети инициализируются случайным образом или устанавливаются в нулевое состояние.

2       На входы сети поочередно подаются входные образы X из обучающей выборки, которые трансформируются в выходные сигналы нейронных элементов Y.

         Если реакция нейронной сети yj совпадает с эталонным значением tj, т.е. если yj=tj, то весовой коэффициент wij не изменяется.

         Если выходная реакция сети yj не совпадает с эталонной, т.е. если yj ≠tj, то производится модификация весовых коэффициентов по правилу (2.9).

         Шаги 2-4 повторяются до тех пор, пока не станет yj=tj, для всех входных образов, или не перестанут изменяться весовые коэффициенты.

Согласно теореме сходимости персептрона, алгоритм сходится за конечное число шагов, если существует решение задачи.

Основные отличия процедуры обучения Розенблатта от правила обучения Хебба заключаются в следующем:

-          В правиле обучения Розенблатта для персептрона присутствует скорость обучения α;

-       Персептрон не изменяет весовые коэффициенты, если выходные сигналы совпадают с эталонными;

-       Входные образы из обучающей выборки в модели персептрона подаются до тех пор, пока не произойдет обучение сети.

-       Персептрон обучается за конечное число шагов, если существует решение задачи.

.5.3 Правило обучения Видроу-Хоффа

Правило обучения Видроу-Хоффа известно под названием дельта-правило. Оно предполагает минимизацию среднеквадратичной ошибки нейронной сети, которая для L входных образов определяется следующим образом:

,(2.10)

где E(k) - среднеквадратичная ошибка сети для k-го образа;

у1k и tk - соответственно выходное и эталонное значение нейронной сети для k-го образа.

Критерий (2.10) характеризуется тем, что при малых ошибках ущерб является также малой величиной, так как Е меньше величины отклонения (y-t). При больших ошибках ущерб возрастает, так как Е возрастает с ростом величины ошибки.

Среднеквадратичная ошибка нейронной сети для одного входного образа определяется по формуле:

.

Правило обучения Видроу-Хоффа базируется на методе градиентного спуска в пространстве весовых коэффициентов и порогов нейронной сети. Согласно этому правилу весовые коэффициенты и пороги нейронной сети необходимо изменять с течением времени по следующим выражениям:

;

,

где ;

α - скорость или шаг обучения.

Найдем производные среднеквадратичной ошибки Е по настраиваемым параметрам сети wj1 и Т:

;

;

где xjk - j-я компонента k-го образа.

Отсюда получаем следующие выражения для обучения нейронный сети по дельта-правилу:

;(2.11)

,(2.12)

где .

Б.Видроу и М.Хофф доказали, что данный закон обучения всегда позволяет находить весовые коэффициенты нейронного элемента таким образом, чтобы минимизировать среднеквадратичную ошибку сети независимо от начальных значений весовых коэффициентов.

В правиле Видроу-Хоффа существует проблема выбора значения шага обучения α. Если шаг α слишком мал, то процесс обучения является очень длительным, если α большой, процесс обучения может оказаться расходящимся, т.е. не привести к решению задачи. Таким образом, сходимость обучения не избавляет от разумного выбора значения шага обучения. В некоторых работах предлагается выбирать значение α, которое уменьшается в процессе обучения следующим образом:

,

где k - номер итерации в процессе обучения.

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

.5.4 Алгоритм обратного распространения ошибки

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

Теорема 3 Для любого скрытого слоя i ошибка i-го нейронного элемента определяется рекурсивным образом через ошибки нейронов следующего слоя j:

,(2.13)

где m - число нейронов следующего слоя по отношению к слою i;

wij - синаптическая связь между i-м и j-м нейронами различных слоев;

Sj - взвешенная сумма j-го нейрона.

Используя результаты этой теоремы, можно определить ошибки нейронов скрытого слоя через ошибки нейронов следующего слоя по отношению к скрытому слою.

Теорема 4 Производные среднеквадратичной ошибки по весовым коэффициентам и порогам нейронных элементов для любых двух слоев i и j многослойной сети определяются следующим образом:

;

.

Следствие 1 Для минимизации среднеквадратичной ошибки сети весовые коэффициенты и пороги нейронных элементов должны изменяться с течением времени следующим образом:

;

,

где α - скорость обучения.

Данное следствие определяет правило обучения многослойных нейронных сетей в общем виде, которое называется обобщенным дельта-правилом.

Рассмотрим сигмоидную функцию активации (2.5), как наиболее распространенную функцию активации нейронных элементов, причем примем с=1.

;

;

,

В результате обобщенное дельта-правило для сигмоидной функции можно представить в виде:

;(2.14)

.

Ошибка для j-го нейрона выходного слоя:

.(2.15)

Из (2.13) ошибка для j-го нейронного элемента скрытого слоя:

,(2.16)

где m - число нейронных элементов следующего слоя по отношению к слою j.

Рисунок 2.15 - Алгоритм обратного распространения ошибки

Используя вышеизложенное, можно определить алгоритм обратного распространения ошибки, рисунок 2.15. В алгоритме приняты следующие обозначения, соответствующие программе, реализующей этот алгоритм:

-          α - шаг обучения;

-       Em - требуемая среднеквадратичная ошибка;

-       epoxa - целое число, равное количеству обучающих образцов;

-       wij - весовой коэффициент связи между i-м и j-м нейронами смежных слоев;

-       stArIN - массив входных значений обучающего образца;

-       stArOUT - массив выходных значений обучающего образца;

-       stAr - объект класса StadyArrays, хранящего stArIN и stArOUT вместе;

-       massivStudy - массив объектов, содержащих объекты класса StadyArrays;

-       STOP - логическая переменная, соответствующая окончанию обучения;

-       layers - целое число, равное количеству всех слоев в нейронной сети;

-       koli4estvo - целое число, равное количеству нейронов в слое;

-       у - значение результата работы нейронного элемента;

-       resultStudy - массив результатов всех нейронов слоя;

-       result - массив целевых значений;

-       γ - ошибка результата работы нейрона;

-       е[i] - сумма квадратов ошибок выходного слоя для i-го образца;

-       Е - среднеквадратичная ошибка сети для всех образцов.

Описание действия алгоритма обратного распространения ошибки.

1       Пользователь вводит желаемые значения шага обучения (α), среднеквадратичной ошибки (Em), и количество образцов для обучения (epoxa).

2       Инициализируются случайным образом весовые коэффициенты (wij) нейронных элементов в пределах от -0,5 до +0,5.

         Начало цикла ввода обучающих образцов.

         Пользователь вводит подаваемый на вход нейронной сети массив данных, stArIN.

         Пользователь вводит массив целевых выходных значений, stArOUT.

         На основании stArIN и stArOUT создается объект класса StadyArrays.

         Созданный объект добавляется в массив massivStudy.

         Значение STOP устанавливается в “Ложь”, подразумевается что сеть не в состоянии правильно решать поставленную задачу, т.е. не обучена.

         Проверка параметра остановки процесса обучения. Если STOP=”Истина”, то цикл прекращается (переход к блоку 30), в противном случае переход к шагу 11.

         Начало цикла обучения всем образцам эпохи.

         Считывается входной вектор значений очередного образца. Задается resultStudy.

         Цикла прямого прохождения информации по нейронной сети. Происходит последовательное прохождение вводимой информации по всем слоям.

         Цикла вычисления реакции каждого нейрона в слое на информацию подаваемую на этот слой.

         Вычисляется результат работы каждого нейрона, исходя из (2.1):

,

где i - индекс, характеризующий нейроны предыдущего слоя по отношению к слою j. Для входного слоя yi берется из заданного в блоке 12 массива resultStudy.

15     Переопределяется массив resultStudy, для представления его как входной информации уже следующему слою.

16     Считывается целевой вектор значений текущего образца. Задается result.

         Цикл вычисления ошибок всех нейронных элементов выходного слоя.

         На основании полученного массива result и вычисленного resultStudy, находятся ошибки по (2.15):

;

где yj - вычисленное значение, т.е. элемент массива resultStudy;

tj - известное целевое значение, элемент массива result.

19     Цикл вычисления ошибок во всех скрытых слоях, начиная с последнего.

20     Цикл вычисления ошибок всех нейронных элементов текущего скрытого слоя.

         На основании полученного вычисленного массива последующего слоя resultStudy, находятся ошибки по (2.16):

;

где индекс i характеризует нейронные элементы следующего слоя;

22     Цикл изменения весовых коэффициентов между всеми смежными слоями.

23     Цикл для текущего соля по всем его нейронным элементам.

         Изменение весовых коэффициентов, согласно (2.14) находится как:

;

25     Вычисляется сумма квадратов ошибок для данного образца обучения:


Далее идет переход к пункту 12, для считывания следующего образца в эпохе обучения. Если это был последний образец, то выполняется блок 27.

26     Находится среднеквадратичная ошибка нейронной сети по всем образцам, (2.10):

,

где L - размерность обучающей выборки.

27     Проверка на достижение среднеквадратичной ошибки допустимого значения. Безусловный дальнейший переход к блоку 10.

28     При истинности блока 28, значение STOP так же устанавливается “Истина”. Безусловный дальнейший переход к блоку 10.

Недостатки алгоритма обратного распространения ошибки. Так как данный алгоритм основывается на методе градиентного спуска в пространстве весовых коэффициентов и порогов нейронной сети, то создается ряд проблем при обучении. К таким проблемам можно отнести следующие:

-          неизвестность выбора числа слоев и количества нейронных элементов в слое для многослойных сетей;

-       медленную сходимость градиентного метода с постоянным шагом обучения;

-       сложность выбора подходящей скорости обучения α. Так, слишком малая скорость обучения увеличивает время обучения и приводит к скатыванию нейронной сети в локальный минимум. Большая скорость обучения может привести к пропуску глобального минимума и сделать процесс обучения расходящимся;

-       невозможность определения точек локального и глобального минимумов, рисунок 2.16, так как градиентный метод их не различает;

-       влияние случайной инициализации весовых коэффициентов нейронной сети на поиск минимума функции среднеквадратичной ошибки.

Последний пункт отражает, что при разной инициализации синоптических связей могут получаться различные рушения задачи. То, что алгоритм обратного распространения ошибки не позволяет в общем случае достичь глобального минимума, не умаляет его достоинств, так как во многих практических задачах достаточно обучить нейронную сеть до требуемой среднеквадратичной ошибки. Является ли при этом найденный минимум локальным или глобальным, не имеет большого значения.

.6 Рекомендации по обучению и архитектуре многослойных нейронных сетей

Эффективность обучения многослойных нейронных сетей зависит от числа слоев, числа элементов в скрытых слоях нейронной сети и начальной инициализации весовых коэффициентов.

Рисунок 2.16 - Функция среднеквадратичной ошибки:

Ел - локальный минимум; Еmin - глобальный минимум.

Как отмечалось выше, разная инициализация весовых коэффициентов может приводить к различным решениям. Важную роль здесь играет размер случайно инициализируемых синаптических связей. Так, для сигмоидной функции активации нейронных элементов, если весовые коэффициенты будут иметь большие значения (положительные или отрицательные). То выходная активность нейронных элементов будет близка к единице или нулю. Тогда значение выражения yj(1-yj) будет близко к нулю и, согласно правилу обучения (2.14), весовые коэффициенты будут изменяться незначительно. Это приведет к тому, что процесс обучения остановится в ближайшем локальном минимуме от стартовой точки. Рекомендуется случайным образом инициализировать весовые коэффициенты и пороговые значения в диапазоне [-0,5; 0,5].

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

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

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

Так же одним из недостатков метода градиентного спуска является застревание в нежелательных локальных минимумах. Для нейтрализации этого недостатка можно использовать метод тяжелого шарика.

Исходя из приведенных рассуждений можно сделать выводы:

-          нейронная сеть с одним скрытым слоем позволяет осуществить любое отображение входных сигналов в выходные;

-       число нейронных элементов в промежуточном слое должно быть меньше числа тренировочных образцов;

-       мощность нейронной сети можно увеличивать как за счет числа нейронов в слое, так и за счет числа слоев. Если на нейронную сеть накладывается ограничения п.2 и она не может решить поставленную задачу, то необходимо увеличивать число скрытых слоев;

-       случайная инициализация весовых коэффициентов нейронной сети должна проходить в достаточно узком диапазоне значений.

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

.1 Выбор инструментария для моделирования

Для дальнейшей работы необходимо определиться с терминологией объектно-ориентированного программирования. Наиболее важным термином является класс. Класс - это шаблон, или проект, по которому будет сделан объект. Обычно класс сравнивается с формой для выпечки печенья. Объект - это самое печенье. Конструирование объекта на основе некоторого класса называется созданием экземпляра этого класса.

Как увидим далее, все коды, которые создаются в языке Java, находятся внутри классов. Стандартная библиотека языка Java содержит несколько тысяч классов, предназначенных для решения разных задач, например, для создания пользовательского интерфейса, календарей и т.д. Несмотря на это, программисты продолжают создавать свои собственные классы на языке Java, чтобы описать объекты, характерные для разрабатываемого приложения, а также адаптировать классы из стандартной библиотеки для своих нужд.

Инкапсуляция - это ключевое понятие при работе с объектами. Формально инкапсуляция - это просто объединение данных и операций над ними в одном пакете и сокрытие данных от пользователя объекта. Данные в объекте называются полями экземпляра, а функции и процедуры, выполняющие операции над данными, - его методами. В указанном объекте, т.е. экземпляре класса, поля экземпляра имеют определенные значения. Множество этих значений называется текущим состоянием объекта. Применение любого метода к какому-нибудь объекту может изменить его состояние.

Рассмотрим различия между объектно-ориентированным программированием и традиционным процедурным. В процедурно-ориентированном программировании сначала формируется задача, а затем

с помощью пошагового уточнения исходная задача разбивается на все более мелкие подзадачи, пока они не станут настолько простыми, что их можно будет реализовать непосредственно (программирование “сверху вниз”)ж

создаются процедуры, предназначенные для решения простых задач; затем эти процедуры объединяются в более сложные, пока программа не станет делать именно то, что требуется (программирование “снизу вверх”).

Большинство программистов, конечно, используют смешанные стратегии “сверху вниз” и “снизу вверх”. При исследовании процедур нужно придерживаться такого же правила, как и при объектно-ориентированном программировании: ищите глаголы, или действия, в описании задачи. Существенное отличие заключается в том, что при объектно-ориентированном программировании (ООП) в проекте сначала выделяются классы, и лишь затем определяются их методы.

Для решения небольших задач разбиение программы на процедуры вполне оправданно. Однако при разработке больших проектов классы и методы имеют два преимущества. Классы предоставляют удобный механизм кластеризации методов. Простенький Web-браузер для своей реализации может потребовать 2000 функций и 100 классов, т.е. в среднем 20 методов в классе. Программисту намного легче понять именно последнюю структуру. Кроме того, ее легче распределить в команде программистов. Этому способствует также инкапсуляция: классы скрывают детали представления данных от любого кода, кроме своих методов. Как показано на рисунке 3.1, это значит, что, если ошибка программирования искажает данные, причину легче найти среди 20 классов, чем среди 200 процедур.

Можно возразить, что это не слишком отличается ор принципа модульности. Процедурные программы могут разбиваться на модули, обменивающиеся друг с другом данными исключительно с помощью вызовов процедур, не прибегая к совместному использованию данных. Если правильно пользоваться этим приемом, можно осуществить инкапсуляцию данных. Однако во многих языках программирования малейшее отклонение от этого подхода открывает доступ к данным из другого модуля - инкапсуляцию легко разрушить.

Есть более серьезная проблема: в то время как на основе класса можно создать несколько объектов с одинаковым поведением, в процедурно-ориентированных языках невозможно получить несколько копий одного модуля. Допустим, мы достигли модульной инкапсуляции, объединив совокупность заказов вместе с прекрасным сбалансированным бинарным деревом, обеспечивающим быстрый доступ. И вдруг выясняется, что нужно иметь две такие совокупности: одну для текущих заказов, а другую - для выполненных. Нельзя просто дважды вызвать модуль, реализующий дерево заказов. Для этого нужно скопировать и переименовать все процедуры! Классы не имеют таких ограничений. Определив однажды класс, легко создать любое количество его экземпляров (в то время как модуль имеет только один экземпляр).

Еще один принцип, обеспечивающий высокую производительность ООП, заключается в том, что каждый объект предназначен для выполнения определенных задач. Если перед объектом стоит задача, для решения которой он не предназначен, у него должен быть доступ к другому объекту, который может эту задачу решить. Затем первый объект просит второго решить эту задачу. Это - обобщенный вариант вызова функций, применяемого в процедурном программировании.

Рисунок 3.1 - Процедурное и объектно-ориентированное программирование

Напомним, что в языке Java это обычно называется вызовом метода.

В частности, объект никогда не должен непосредственно манипулировать внутренними данными другого объекта, а также предоставлять другим объектам прямой доступ к своим данным. Все связи между ними обеспечиваются с помощью вызовов методов. Инкапсуляция данных объекта максимально повышает возможность его повторного использования, уменьшает их взаимозависимость и минимизирует время отладки программы.

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

Одно из основных преимуществ языка Java - независимость от платформы, на которой выполняется программа: один и тот же код можно запустить под управлением операционных систем Windows, Solaris, Linux, Macintosh и др.

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

Кроме того, Java - полностью объектно-ориентированный язык, даже в большей степени, чем С++. Все сущности в языке Java являются объектами, за исключением немногих основных типов, например чисел. Однако, иметь еще один, слегка улучшенный, диалект языка С++ недостаточно, принципиально важно, что разрабатывать программы, не содержащие ошибок, на языке Java легче, чем на языке С++.

Почему? Разработчики языка Java долго размышляли о том, отчего программы, написанные на язык С++, так подвержены ошибкам. Они снабдили язык Java средствами,. Позволяющими исключить саму возможность создавать программы, в которых были бы скрыты наиболее распространенные ошибки. Для этого в языке Java сделано следующее.

-       Исключена возможность явного выделения и освобождения памяти. Память в языке Java освобождается автоматически с помощью механизма сборки мусора. Программист гарантирован от ошибок, связанных с неправильным использованием памяти.

-       Введены истинные массивы и запрещена арифметика указателей. Теперь программист в принципе не может стереть данные из памяти вследствие неправильного использования указателей.

-       Исключена возможность перепутать операторы присваивания с оператором сравнения на равенство. Теперь нельзя даже скомпилировать выражение if (ntries = 3)… (программисты на языке Visual Basic могут вообще не заметить здесь никакой проблемы, поскольку эта ошибка - источник большинства недоразумений в языках С и С++).

-       Исключено множественное наследование. Оно заменено новым понятием - интерфейсом, позаимствованным из языка Objectiv C. Интерфейс дает программисту почти все, что тот может получить от множественного наследования, избегая при этом сложностей, возникающих при управлении иерархиями классов.

Авторы языка Java написали руководство, в котором объяснялись цели его разработки и достоинства языка. В этом документе приведено одиннадцать характерных особенностей языка Java. Рассмотрим некоторые из них.

Простота. Java - это система, с помощью которой легко программируется, причем не требуется дополнительного обучения и учитывается сложившаяся практика и стандарты программирования. Поэтому язык Java был разработан максимально похожим на язык С++, несмотря на то, что сами разработчики считали язык С++ неподходящим для этих целей. Другой аспект простоты - краткость. Одна из целей языка Java - обеспечить разработку программ, которые можно было бы совершенно самостоятельно выполнять на небольших машинах. Размер основного интерпретатора и средств поддержки классов составляет около 40 Кбайт; стандартные библиотеки и средства поддержки потоков занимают еще 175 Кбайт.

Надежный. Язык Java предназначен для создания программ, которые должны надежно работать в любых ситуациях. Основное внимание в языке Java уделяется раннему обнаружению возможных ошибок, динамической проверке, а также исключению ситуаций, подверженных ошибкам.

Не зависящий от архитектуры. Компилятор генерирует объектный файл, формат которого не зависит от архитектуры компьютера, - скомпилированная программа может выполняться на любых процессорах под управлением системы выполнения программ языка Java. Для этого компилятор языка Java генерирует команды байт-кода. Байт-код разработан таким образом, чтобы на любой машине его можно было легко интерпретировать либо на лету перевести в машинно-зависимый код.

Распределенный. Язык Java обладает большой библиотекой программ для передачи данных на основе таких протоколов как TCP/IP, HTTP или FTP. Приложения, написанные на языке Java, могут открывать объекты и получать к ним доступ через сеть с помощью URL-адресов так же легко, как и в локальной сети.

Безопасный. Язык Java предназначен для использования в сетевой или распределенной среде. По этой причине большое внимание было уделено безопасности. Язык Java позволяет создавать системы, защищенные от вирусов и постороннего вмешательства.

Многопоточный. Многопоточность обеспечивает лучшую интерактивность и выполнение программ.

.2 Разработка объектов, представляющих нейронную сеть

.2.1 Разработка модуля нейрона

Согласно пункту 2.2 формальный нейрон состоит из адаптивного сумматора и преобразователя взвешенной суммы. Еще в составе нейронного элемента может присутствовать точка ветвления. Соответственно, каждый нейронный элемент характеризуется количеством входов и выходов. Конструктор класса нейрона отражает эти особенности, листинг 3.1.

Листинг 3.1 - Конструктор класса нейронного элемента

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

{= OUT;(type == "in")

{= 1;_koef = new float [vxodi];(int i = 0; i < vxodi; i++)

{_koef[i]=1.0F;

}

}

{= IN+1;_koef = new float [vxodi];(int i = 0; i < vxodi; i++)

{= Math.random();(vk<=0.45) { ves_koef[i]= (float)vk;}_koef[i]=(float)(0.45-vk);

}

}

}

Для создания объекта нейрона требуется указать параметры: IN, который хранит количество входов в данный нейрон; OUT, который хранит количество выходов из данного нейрона; а также type, который хранит тип нейрона. Нейронный элемент может быть входным, скрытым или выходным, в соответствии с тем, к какому слою нейронной сети он принадлежит.

В каждом нейронном объекте нейронного элемента хранится массив весовых коэффициентов всех входящих в него связей. Порог нейронного элемента в данной программе учитывается согласно рисунку 2.9, т.е. соответствует весовому коэффициенту связи, от элемента с постоянным значением выхода равного 1. Для всех нейронов не входного слоя количество входов, а значит и количество элементов в массиве весовых коэффициентов, равно количеству нейронов в предыдущем слое, увеличенном на 1. Эти весовые коэффициенты задаются случайным образом, используя метод Math.random(), в пределах [-0,45; 0,45]. Для различия входного нейрона от остальных в конструкторе и предусмотрен третий параметр type.

Если параметр type указывает на то, что нейронный элемент является частью входного слоя, то количество его входов равно 1, и весовой коэффициент этого входа равен 1.

После создания нейронного элемента, необходимо предусмотреть его функционирование, иными словами реализацию адаптивного сумматора и преобразователя, в соответствии с (2.1).

Эти методы описаны в зависимости от того, является ли нейронный элемент входным или нет. Для входного нейрона методы приведены в листинге 3.2, для элементов скрытых и выходного слоев в - листинге 3.3.

Листинг 3.2 - Методы функционирования входного нейрона

public double getINResult (double tempResult)

{= 0.0;= sum + ves_koef[0]*tempResult;= getINResultat(sum);result;

}double getINResultat (double param)

{res = param;res;

}

Листинг 3.3 - Методы функционирования невходного нейронаdouble getResult (double [] tempResult)

{= 0.0;(int i=0; i < vxodi; i++)

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

}= getResultat (sum);result;

}double getResultat (double param)

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

return res;

}

В обоих случаях, листинги 3.2 и 3.3, метод getResult возвращает взвешенную сумму, причем параметром является результат функционирования предыдущего слоя, в случае входного слоя - это данные вводимые пользователем. Метод getResultat возвращает результат преобразования взвешенной суммы в соответствии с функцией активации. Как указывалось в разделе 2, для входных элементов это линейная функция, а для всех остальных - это наиболее распространенная из нелинейных - сигмовидная функция.

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

Листинг 3.4 - Изменение весового коэффициета нейрона

public void setVesKoef (int j, double tmp)

{temp = ves_koef [j] + tmp;_koef[j] = (float)temp;

}

Остальные методы, приведенные в полном листинге в приложении В, необходимы для правильной работы нейронной сети в целом.

.2.2 Разработка модуля слоя нейронной сети

В любой нейронной сети есть входной слой и выходной слой, может быть и несколько скрытых слоев, может быть и один скрытый слой, а может и не быть вовсе. Согласно этому, каждый слой создается с параметром tip, который в дальнейшем накладывает ограничения в функционировании данного слоя и всех нейронных элементов слоя. В листинге 3.5 приведен конструктор объекта класса описывающего слой нейронной сети. Кроме параметра tip, необходимо и достаточно указать количество нейронных элементов в данном слое - capacityNeironov, и vxodi - количество элементов в предыдущем слое. Последний параметр нужен для правильного создания объектов нейронных элементов для текущего слоя, поскольку он соответствует количеству входов в каждый нейрон. Но для входного слоя, этот параметр не учитывается, поскольку не существует предыдущего слоя по отношению к входному слою.

Листинг 3.5 - Конструктор класса Слой нейронной сети

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

{estvo = capacityNeironov;= new ArrayList(koli4estvo);.toLowerCase();(tip == "in")

{= koli4estvo;= 1;(int i=0; i<koli4estvo; i++)

{neiron1 = new Neiron (1, output, "in");.add(neiron1);

}.trimToSize();

}

{(tip == "out")

{= vxodi;= koli4estvo;(int i=0; i<koli4estvo; i++)

{neiron1 = new Neiron (input , 1, "out");.add(neiron1);

}.trimToSize();

}

{(tip == "sub")

{= vxodi;= 1;(int i = 0; i < koli4estvo; i++)

{neiron1 = new Neiron (input, output, "sub");.add(neiron1);

}.trimToSize();

}

}

}

}

Кроме вышеперечисленного, каждый слой имеет такие поля как: список массивов massivNeironov, содержащий объекты нейронных элементов; массив massivRas4et - массив результатов функционирования слоя, т.е. значения функции активации каждого нейронного элемента слоя; массив massivOshibok - массив ошибок всех нейронных элементов слоя в процессе обучения. Список массивов massivNeironov заполняется элементами во время создания объекта слоя нейронной сети, два последних массива изначально инициализируются и устанавливаются равными null. Массив massivRas4et используется как при обучении, так и при дальнейшем функционировании нейронной сети, а massivOshibok необходим только на стадии обучения.

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

Листинг 3.6 - Метод вычисляющий значения на выходе всех нейронов слоя

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

{et = new double[koli4estvo];(int i =0; i<koli4estvo; i++)

{n = (Neiron) massivNeironov.get(i);(thisSloi==0)

{= lastSloiResult[i];= n.getINResult (temp);

}

{= n.getResult (lastSloiResult);

}et[i]=temp;

}

return massivRas4et;

}

В процессе обучения, согласно алгоритму обратного распространения ошибки, необходимо скорректировать весовые коэффициенты в соответствии с (2.6).

Листинг 3.7 - Метод корректирующий весовые коэффициенты нейронов слоя

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

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

{n = (Neiron) massivNeironov.get(i);(int j =0; j<=resultPreL.length; j++)

{(j!=resultPreL.length)

{= oshibki[i] * normaObu4 * resultPreL[j];.setVesKoef(j, temp);

}

{= oshibki[i] * normaObu4 * 1;.setVesKoef(j, temp);

}

}

}

}

Остальные методы, данного класса, приведенные в приложении Б, необходимы для правильной реализации вышеперечисленных методов.

3.3 Объединение модулей в нейронную сеть

Фактически, объединение вышеописанных модулей в нейронную сеть равносильно созданию объекта класса нейронной сети. Создание объекта класса нейронной сети происходит на основании схематичного изображения всех слоев в окне программы, с точным указанием количества нейронных элементов в каждом слое. Среди параметров конструктора класса нейронной сети, приведенном в листинге 3.8, следует отметить следующие:

-       aIn - целое число, равное числу нейронов во входном слое;

-       aSubS - целое число, равное количеству скрытых слоев;

-       aSub - целочисленный массив, элементами которого являются значения количества нейронных элементов в каждом из скрытых слоев;

-       aOut - целое число, равное числу нейронов в выходном слое;

Листинг 3.8 - Конструктор класса нейронная сетьNet (Frame owner, int aIn, int aSubS, int [] aSub, int aOut)

{= aIn;= aSubS;= new int [subS];(int i =0; i<subS; i++)

{[i] = aSub[i];

}= aOut;= 2 + subS;= new ArrayList ();(int i =0; i<layers; i++)

{(i == 0)

{= new Layer ("in", in, in);.add(l);

}

{(i != layers-1)

{preL = (Layer)massivLayers.get(i-1);v = sub[i-1];.setVIxodi(v);= new Layer ("sub", sub[i-1], preL.getVIxodi());.add(l);

}

{preL = (Layer)massivLayers.get(i-1);.setVIxodi(out);= new Layer ("out", out, preL.getVIxodi());.add(l);

}

}

}= new VvodKartinki (owner, in);

}

При работе конструктора класса, присваиваются значения таким полям объекта как количество нейронов во входном, выходном и, если таковые существуют, скрытых слоях, заполняется список массивов massivLayers - это массив в котором хранятся все объекты класса слоя нейронной сети, и создается объект диалогового окна VvodKartinki для ввода пользователем информации, на основании которой нейронная сеть будет либо обучаться либо производить расчет.

Для сохранения модели нейронной сети в файл, предусмотрен метод, листинг 3.9, который сохраняет нейронную сеть как набор массивов: количество слоев, количество нейронов в каждом слое, каждый слой как массив нейронов.

Листинг 3.9 - Метод сохранения нейронной сети

public void SaveNet (String fileToSave)

{fileName = fileToSave;.toLowerCase();(!fileName.endsWith(".net"))

{n = fileName.length();= fileName.substring(0,n) + ".net";

}[] sloi = new int [layers+1];[0] = in;[1] = subS;(int i = 0; i < subS; i++)

{[i+2] = sub[i];

}[2+subS] = out;

{outNet = new ObjectOutputStream (new FileOutputStream(fileName));.writeObject (sloi);(int i=0; i < layers; i++)

{= (Layer) massivLayers.get (i);.writeObject (l);

}.close ();

}(Exception e)

{.printStackTrace ();

}

}

Параметром этого метода является строка fileToSave, описывающая путь к файлу в который пользователь хочет сохранить нейронную сеть.

Для загрузки модели нейронной сети из файла в классе нейронной сети есть конструктор, который заполняет те же поля что и конструктор приведенный в листинге 3.8, но только присваиваемые значения программа считывает из файла, путь к которому задан параметром данного конструктора в строке fileToOpen.

Листинг 3.10 - Конструктор класса нейронной сети, вызываемый при открытии нейронной сети из файла

public Net (Frame owner, String fileToOpen)

{

{inNet = new ObjectInputStream (new FileInputStream(fileToOpen));[] newSloi = (int[]) inNet.readObject();= newSloi[0];= newSloi[1];= new int [subS];(int i=0; i < subS; i++)

{[i] = newSloi[i+2];

}= newSloi[2+subS];= subS+2;= new ArrayList (layers);(int i=0; i<layers; i++)

{= (Layer) inNet.readObject();.add(l);

}.close();

}(Exception e)

{.printStackTrace();

}= new VvodKartinki (owner, in);

}

При выполнении какого-либо из конструкторов вся информация о предыдущем объекте класса нейронной сети удаляется, т.к. программа рассчитана на работу только с одной моделью нейронной сети.

К объекту класса нейронной сети применимы методы обучения (этот метод будет подробнее описан ниже), расчета сетью некоторой задачи, а также отображение информации об объекте в текстовой области окна программы. Все эти методы приведены в приложении Б.

3.3.1 Разработка модуля обучения нейронной сети с использованием алгоритма обратного распространения ошибки

Алгоритм обратного распространения ошибки был подробно описан в пункте 2.5.4. В соответствии с ним был написан метод для объекта нейронной сети. Полностью этот метод приведен в описании класса нейронной сети в приложении Б. Сама реализация алгоритма обратного распространения ошибки представлена в листинге 3.11.

Листинг 3.11 - Реализация алгоритма обратного распространения ошибки

public void Study (JTextArea txtArea)

{.append ("\n\n Будет обучение сети\n"); = JOptionPane.showInputDialog ("Введите величину допустимой среднеквадратичной ошибки");

Em = Double.parseDouble (input);

input = JOptionPane.showInputDialog ("Введите норму обучения, в пределах от 0 до 1");

normaObu4eniya = Double.parseDouble (input);

input = JOptionPane.showInputDialog ("Сколько будет образцов в эпохе?");

int epoxa = Integer.parseInt (input);

massivStudy = new ArrayList ();= (Layer) massivLayers.get (0);= l.getVIxodi();= (Layer) massivLayers.get (massivLayers.size()-1);= l.getVIxodi();(int j = 0; j < epoxa; j++)

{= new double [stIn];(vvod.showIt())

{= vvod.getMassiv();

}

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

}= new double [stOut];.setMessage("Что на выходе нейронной сети");

if(vvodCifr.showIt())

{= vvodCifr.getMassiv();

}

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

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

}.trimToSize();(!STOP)

{= new double [epoxa];(int i =0; i < epoxa; i++)

{s = (StudyArrays)massivStudy.get(i);= new double [s.getIN()];= s.getArrayIn();(int j =0; j<layers; j++)

{= (Layer) massivLayers.get (j);(j==0)

{= new double[l.getVIxodi()];= l.makeRas4et (j, tempArray);

}

{= new double[l.getVIxodi()];= l.makeRas4et (j, resultStudy);= new double[l.getVIxodi()];(int ij = 0; ij<resultStudy.length; ij++)

{[ij] = tempArray[ij];

}

}

}= new double [s.getOUT()];= s.getArrayOut();(int j =layers-1; j>0; j--)

{= (Layer) massivLayers.get (j);(j == (layers-1))

{.ras4etOshibki (result, resultStudy);

}

{= (Layer) massivLayers.get (j+1);= new double [l.getVIxodi()];= l.getMassivRas4et();.ras4etOshibki (l1, resultStudy);

}

}

//вычисление квадрата ошибок= new double [s.getOUT()];= s.getArrayOut();= (Layer) massivLayers.get (massivLayers.size()-1);= new double [l.getVIxodi()];= l.getMassivRas4et();last = true;= 0;(int j=0; j < l.getVIxodi(); j++)

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

}

e[i]=temp;

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

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

{= (Layer) massivLayers.get (j);= new double[l.getVIxodi()];= l.getMassivOshibok ();= (Layer) massivLayers.get (j-1);= new double [l1.getVIxodi()];= l1.getMassivRas4et();.izmenenieVesov (normaObu4eniya, resultStudy, tempArray);

}

}

//проверка на достоверность=0;(int i = 0; i< epoxa; i++)

{=temp+e[i];

}=temp/2;(temp<Em) STOP = true;

++;(counter==10)

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

}

}

При реализации данного метода используются объекты класса StudyArrays. Каждый объект этого класса - это два массива, массив входных значений и массив целевого выхода. Количество этих объектов соответствует обучающим образцам, и определяется пользователем перед началом процесса обучения нейронной сети.

4. Разработка документации по использованию программы

.1 Инсталляция программного продукта

Как отмечалось в разделе 3, язык Java является полностью машинно-независимым, и для успешного выполнения предлагаемой программы необходимо чтобы на ПЭВМ был установлен набор инструментальных средств Java Runtime Environment. Если это приложение установлено, то достаточно переписать в рабочую директорию файл NeiroNet.jar и запустить его выполнение из командной строки следующей командой java -jar NeiroNet.jar. Либо переписать в туже директорию где расположении файл NeiroNet.jar файл run.bat, и выполнить его посредством двойного нажатия на него левой кнопкой мыши, или после выделения его нажатия кнопки “Enter” (Ввод).

Дальнейшие действия с приложением будут описываться на примере создания и обучения конкретной нейронной сети.

Постановка задачи. Необходимо создать, сохранить и обучить нейронную сеть, которая будет способна распознавать изображение любой цифры. Цифра представлена в виде бинарного массива, отображаемого на экране как темные (соответствующие значению 1) и светлые (соответствующие значению 0) области или пиксели. Пусть изображение каждой цифры состоит из 35 пикселей, т.е. помещается в прямоугольнике размером 5×7 пикселей, рисунок 4.1.

нейронный сеть искусственный обучение

4.2 Создание модели нейронной сети

После запуска программы на экране появляется окно, как показано на рисунке 4.2. Пользователь, для создания нейронной сети должен отобразить на рабочей области окна все необходимые ему слои нейронной сети. Это делается следующим образом. Нажимается кнопка соответствующая нужному слою (входной, скрытый или выходной). Затем щелчком левой кнопки мыши пользователь указывает в каком месте должен располагаться этот слой. При необходимости изменения местоположения изображения слоя, в графическом интерфейсе реализован механизм drug-and-drop (приложение Г). После указания местоположения слоя пользователю предлагается ввести количество нейронных элементов в создаваемом слое, рисунок 4.3. В программе исключена ситуация создания более одного входного и более одного выходного слоя.

Для решения поставленной задачи необходимо чтобы каждому пикселю в соответствие был поставлен нейронный элемент входного слоя. Получается, во входном слое будет 35 нейронов. Согласно рекомендациям по обучению и архитектуре многослойных сетей, приведенных в п.2.6, число нейронов скрытого слоя должно быть меньше обучающих образцов. Примем это количество равное 6. Для разбиения входных образов на 10 выходных областей, так как число цифр десять, можно использовать только 9 нейронов. Для цифры 1 значение на выходе первого нейрона будет максимальным, равным 1, а на всех остальных минимальным, равным 0 для бинарной сигмоидной функции. Для цифры 2 значение на выходе второго нейрона будет максимальным, а на всех остальных минимальным. И так далее для всех цифр до 9. Для цифры 0, примем значение всех нейронов выходного слоя равным нулю.

Итак, располагаем три слоя. Входной из 35 нейронов, скрытый, из 6 нейронов и выходной слой из 9 нейронов. Когда все слои расположены на рабочей области, необходимо нажать кнопку “Далее”. При этом создастся модель нейронной сети. В процессе инициализации модели нейронной сети, т.е. объекта класса Net, у пользователя спрашивается какая функция активации будет использоваться в нейронах обрабатывающих слоев. Для рассматриваемого примера следует выбрать бинарную сигмоидальную. Так же необходимо задать размер вводимого образца, т.е. размеры прямоугольной области которая будет вводиться пользователем как входное воздействие для сети. В нашем примере это будет 5 столбцов, 7 строк.

Когда создастся модель нейронной сети, пункты меню связанные с функционированием нейронной сети становятся активными. И пользователь может просмотреть свойства сети, т.е. количество слоев, количество нейронов в каждом слое, и все весовые коэффициенты каждого нейронного элемента. Так же появляется возможность запуска механизмов обучения нейронной сети, и расчета результата на основе вводимых данных.

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

При необходимости сохранить модель нейронной сети, следует выбрать пункт меню “Сохранить как”. В предложенном диалоговом окне пользователь выбирает директорию где будет храниться файл модели сети, а также вводит имя файла. Расширение сохраняемых файлов должно быть .net, если расширение не указано, или указано другое, то программа добавляет в конце имени самостоятельно нужное расширение. Для рассматриваемого примера укажем корневую директорию и имя файла cifri.net.

В случае когда пользователю необходимо открыть уже существующую модель нейронной сети, следует выбрать пункт меню “Открыть”. В диалоговом окне выбрать путь к директории где хранится требуемый файл и выбрать его. После открытия файла также становятся активными пункты меню для работы с нейронной сетью.

.3 Обучение нейронной сети

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

При созданной или открытой нейронной сети, следует выбрать в меню пункт “Обучение”. Далее в режиме диалога пользователь сообщает программе все необходимые данные. А именно количество обучающих образцов в одной эпохе, значение требуемой среднеквадратичной ошибки и значение скорости обучения. Затем вводятся описания каждого образца, т.е. входные и целевые выходные значения. Входные данные должны соответствовать массивам, приведенным на рисунке 4.1. Целевые выходные значения ставятся согласно методике указанной в п.4.2, эти значения выглядят как показано на рисунке 4.5. После ввода последнего образца, программа без дополнительных действий пользователя начинает обучение нейронной сети. По окончании обучения выдается сообщение о завершении процесса.

.4 Получение результата функционирования нейронной сети

При созданной или открытой нейронной сети, следует выбрать в меню пункт “Расчет”. Далее в режиме диалога пользователь сообщает программе что именно подается на вход сети. В нашем примере, это изображение цифры, одно из представленных, на рисунке 4.1. Далее нейронная сеть осуществляет расчет и выдает результат На рисунке 4.6 показан результат расчета сетью опытного образца, представляющего цифру три. Как видно, значение на выходе третьего нейронного элемента максимально, все другие близки к нулю. Эти значения, максимумы и минимумы не совпадают с 1 и с 0, поскольку сигмоидальная функция никогда не достигает этих значений. Но значение третьего выходного нейронного элемента, равное 0,93 достаточно убедительно указывает на то, что на вход нейронной сети действительно подавалось изображение цифры три.

В окне результата предусмотрено, что функция активации может быть бинарной и биполярной.

  

  

  

Рисунок 4.1 - Пиксельное изображение цифр

Рисунок 4.2 - Окно программы моделирования нейронной сети

Рисунок 4.3 - Диалоговое окно при создании слоя нейронной сети

Рисунок 4.4- Схема нейронной сети

Рисунок 4.5 - Ввод целевых значений

Рисунок 4.6 - Результат работы нейронной сети

5. Вопросы обеспечения безопасности жизнедеятельности

.1 Общая характеристика условий применения

Безопасность жизнедеятельности - система законодательных, социально-экономических, организационных, технических, санитарно-технических и лечебно-профилактических мероприятий и средств, обеспечивающих безопасность, сохранения здоровья и работоспособности человека в процессе труда.

Длительная работа с ЭВМ приводит к отрицательному влиянию на здоровье людей.

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

Вторая группа вредных воздействий связана с излучением ЭВМ, которые распространяются практически во все стороны. Образуется электростатическое поле перед экраном и переменное электромагнитное поле в широком диапазоне частот.

Помещение с ЭВМ должны иметь естественное и искусственное освещение в 300 люкс, в качестве источников света при искусственном освещении должны применяться преимущественно люминесцентные лампы. Оконные проемы в помещениях должны быть оборудованы регулируемыми устройствами типа: жалюзи, занавеси.

Рабочие места с ПЭВМ по отношению к световым проемам должны располагаться так, чтобы естественный свет падал с боку, преимущественно слева.

В помещении ежедневно должно проводиться влажная уборка, должны иметься аптечка первой помощи и углекислотные огнетушители.

Общие требования, предъявляемые к организации режима труда и отдыха при работе с ЭВМ:

продолжительность работы с ЭВМ для инженеров и операторов не должна превышать 6 часов в день;

уровень нагрузки за рабочую смену - до 40000 знаков;

суммарное время регламентированных перерывов при 8 - часовой смене - 50 минут;

продолжительность непрерывной работы с ЭВМ без регламентированных перерывов не должна превышать 2 часов;

при 8-часовом рабочем дне перерывы следует устанавливать через 2 час от начала рабочей смены и через 1,5 - 2 час после обеденного перерыва продолжительностью 15 минут каждый или продолжительность 10 минут через каждый час работы.

.2 Требования к ВДТ и персональным ЭВМ

Согласно СанПиН 2.2.2/2.4.1340-03 от 03.06.2003г., №118 должны выполнятся следующие требования к видеодисплейным терминалам и персональным электронно-вычислительным машинам:

визуальные эргономические параметры ВДТ являются параметрами безопасности и их неправильный выбор приводит к ухудшению здоровья пользователя. Все ВДТ должны иметь гигиенический сертификат, включающий в том числе оценку визуальных параметров;

конструкция ВДТ, его дизайн и совокупность эргономических параметров должны обеспечить надежное и комфортное считывание отображаемой информации в условиях эксплуатации;

конструкция ВДТ должна обеспечивать возможность горизонтального наблюдения экрана путем поворота корпуса в горизонтальной плоскости вокруг вертикальной оси в пределах 90° и в вертикальной плоскости вокруг горизонтальной оси в пределах 30° с фиксацией в заданном положении. Дизайн ВДТ должен предусматривать окраску корпуса в мягкие тона с диффузным рассеянием света. Корпус ПЭВМ, клавиатура и другие блоки и устройства ПЭВМ должны иметь матовую поверхность одного цвета с коэффициентом отражения 0.6 и не иметь блестящих деталей, способных создавать блики. На лицевой стороне корпуса ВДТ не рекомендуется размещать органы управления, маркировку, какие либо вспомогательные устройства и обозначения. При необходимости расположения органов управления на лицевой панели они должны закрываться крышкой или располагаться в корпусе;

для обеспечения надежного считывания информации соответствующей степени комфортности ее восприятия, должны быть определены оптимальные и допустимые диапазоны визуальных и технических параметров. Минимальная яркость знака (яркость фона) измеренная в темноте составляет 35 кд/м , максимальная 120 кд/м.;

конструкция ВДТ должна предусматривать наличие ручек регулировки яркости и контраста, обеспечивающие возможность регулировки этих параметров от минимального до максимального значений;

в технической документации на ВДТ должны быть установлены требования на визуальные параметры;

а)                   неравномерность яркости элементов знаков не более 25;

б)      размер минимального элемента отображения (пикселя) для ВДТ: 0.3мм.

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

конструкция ВДТ и ПЭВМ должна обеспечивать мощность экспозиционной дозы рентгеновского излучения в любой точке на расстоянии 0.05м. от экрана и корпуса ВДТ при любых положениях регулировочных устройств не должна превышать 7.74Е-12 А/кг, что соответствует эквивалентной дозе, равной 0.1 мбэр/час (100 мкр/час);

для обеспечения надежного считывания информации при соответствующей степени комфортности ее восприятия должны быть разделены оптимальные и допустимые диапазоны визуальных эргономических параметров. Визуальные эргономические параметры ВДТ и пределы их изменений, в которых должны быть установлены оптимальные и допустимы диапазоны значений.

При любых положениях регулировочных устройств мощность эксплуатационной дозы рентгеновского излучения в любой точке на расстоянии 0,05 м, от экрана и корпуса ВДТ не должна превышать 7,74*10 А/кг, что соответствует эквивалентной дозе, равной 0,1 мбэр/ч (100 мкР/час).

.3 Требования к помещениям для эксплуатации ВДТ и ПЭВМ

Помещения с ВДТ и ПЭВМ должны иметь естественное и искусственное освещение.

Естественное освещение должно обеспечивать коэффициент естественной освещенности (КЕО) не ниже 1.2% в зонах с устойчивым снежным покровом и не ниже 1,5% на остальной территории.

Площадь на одно рабочее место с ВДТ или ПЭВМ для взрослых пользователей должна составлять не менее 6.0 м2, объем - не менее 20 м3.

Производственные помещения, в которых для работы используются преимущественно ВДТ и ПЭВМ (диспетчерские, операторские, расчетные и др.), учебные помещения (аудитории вычислительной техники, дисплейные классы и др.), не должны граничить с помещениями, в которых уровни шума и вибрации превышают нормируемые значения (механические цеха, мастерские, гимнастические залы и т.п.).

Для внутренней отделки интерьера помещений с ВДТ и ПЭВМ, должны использоваться диффузно-отражающие материалы с коэффициентом отражения для потолка - 0,7-0,8; для стен - 0,5-0,6; для пола - 0,3-0,5.

Поверхность пола в помещениях эксплуатации ВДТ и ПЭВМ должна быть ровной, без выбоин, нескользкой, удобной для очистки и влажной уборки, обладать антистатическими свойствами.

.4 Требования к шуму и вибрации

При выполнении основной работы на ВДТ и ПЭВМ (диспетчерские, операторские, расчетные, кабинеты и посты управления, залы вычислительной техники и др.), во всех учебных и дошкольных помещениях с ВДТ и ПЭВМ уровень шума на рабочем месте не должен превышать 50 дБ.

В производственных помещениях, в которых работа с ВДТ и ПЭВМ не является основной, а также во всех учебных и дошкольных помещениях с ВДТ и ПЭВМ вибрация на рабочих местах не должна превышать допустимые нормы вибрации.

Шумящее оборудование (АЦПУ, принтеры и т.п.), уровни шума которого превышают нормированные, должно находиться вне помещений с ВДТ и ПЭВМ.

.5 Требования к освещению помещений и рабочих мест ВДТ и ПЭВМ

Освещенность на поверхности стола в зоне размещения рабочего документа должна быть 300-500 лк.

Следует ограничивать прямую блесткость от источников освещения, при этом яркость светящихся поверхностей (окна, светильники и др.), находящихся в поле зрения, должна быть не более 200 кд/м2.

Следует ограничивать отраженную блесткость на рабочих поверхностях (экран, стол, клавиатура и др.) за счет правильного выбора светильников и расположения рабочих мест по отношению к источникам естественного и искусственного освещения, при этом яркость бликов на экране ВДТ и ПЭВМ не должна превышать 40 кд/м2 и яркость потолка, при применении системы отраженного освещения, не должна превышать 200 кд/м2.

Показатель ослепленности для источников общего искусственного освещения в производственных помещениях должен быть не более 40, в дошкольных и учебных помещениях не более 25.

Следует ограничивать неравномерность распределения яркости в поле зрения пользователя ВДТ и ПЭВМ, при этом соотношение яркости между рабочими поверхностями не должно превышать 3:1 - 5:1, а между рабочими поверхностями и поверхностями стен и оборудования 10:1.

Яркость светильников общего освещения в зоне углов излучения от 50 до 90 градусов с вертикалью в продольной и поперечной плоскостях должна составлять не более 200 кд/м2, защитный угол светильников должен быть не менее 40 градусов.

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

Коэффициент пульсации не должен превышать 5%, что должно обеспечиваться применением газоразрядных ламп в светильниках общего и местного освещения с высокочастотными пускорегулирующими аппаратами (ВЧ ПРА) для любых типов светильников.

.6 Требования к организации и оборудованию рабочих мест с ВДТ и ПЭВМ

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

Экран видеомонитора должен находиться от глаз пользователя на оптимальном расстоянии 600-700 мм, но не ближе 500 мм с учетом размеров алфавитно-цифровых знаков и символов.

Высота рабочей поверхности стола для взрослых пользователей должна регулироваться в пределах 680-800 мм; при отсутствии такой возможности высота рабочей поверхности стола должна составлять 725 мм.

Модульными размерами рабочей поверхности стола для ВДТ и ПЭВМ, на основании которых должны рассчитываться конструктивные размеры, следует считать: ширину 800, 1000, 1200 и 1400 мм, глубину 800 и 1000 мм при регулируемой его высоте, равной 725 мм.

Конструкция стула должна обеспечивать:

ширину и глубину поверхности сиденья не менее 400 мм;

поверхности сиденья с закругленным передним краем;

регулировку высоты поверхности сиденья в пределах 400-550 мм и углам наклона вперед до 15 град. и назад до 5 град.;

высоту опорной поверхности спинки 300 ± 20 мм, ширину - не менее 380 мм и радиус кривизны горизонтальной плоскости 400 мм.

Клавиатуру следует располагать на поверхности стола на расстоянии 100-300 мм от края, обращенного к пользователю или специальной, регулируемой по высоте рабочей поверхности, отделенной от основной поверхности.

Конструкция клавиатуры должна предусматривать:

-         исполнение в виде отдельного устройства с возможностью свободного перемещения;

-       опорное приспособление, позволяющее изменять угол наклона поверхности клавиатуры в пределах 5-15 градусов;

-       высоту среднего ряда клавиш не более 30 мм;

-       расположение часто используемых клавиш в центре, внизу и справа, редко используемых - вверху и слева;

-       выделение цветом, размером, формой и местом расположения функциональных групп клавиш;

-       минимальный размер клавиш 13 мм, оптимальный - 15 мм;

-       клавиши с углублением в центре и шагом 19 плюс-минус 1 мм;

-       расстояние между клавишами не менее 3 мм;

-       одинаковый ход для всех клавиш с минимальным сопротивлением нажатию 0.25 Н и максимальным - не более 1.5 Н.

.7 Требования к организации режима труда и отдыха при работе с ВДТ и ПЭВМ

Виды трудовой деятельности разделяются на 3 группы:

-         группа А - работа по считыванию информации с экрана ВДТ или ПЭВМ с предварительным запросом;

-       группа Б - работа по вводу информации;

-       группа В - творческая работа в режиме диалога с ЭВМ.

Для обеспечения оптимальной работоспособности и сохранения здоровья профессиональных пользователей, на протяжении рабочей смены должны устанавливаться регламентированные перерывы.

Продолжительность непрерывной работы с ВДТ без регламентированного перерыва не должна превышать 2 часов.

С целью уменьшения отрицательного влияния монотонии целесообразно применять чередование операций осмысленного текста и числовых данных (изменение содержания работ), чередование редактирования текстов и ввода данных (изменение содержания работы).

.8 Вопросы электробезопасности при работе с ВДТ и ПЭВМ

В ЭВМ источником опасности является электрическая часть, а именно входные цепи блока питания, который может быть подключен к сети промышленного тока напряжением 220В. частотой 50 Гц, с изолированной нейтралью. Выходные цепи блока питания составляют ±15, ±5 В. Следовательно, согласно ПЭУ 1.1.3 устройство относится к установкам с рабочим напряжением до 1000 В.

Использовавшееся помещение с ЭВМ относится к классу помещений без повышенной опасности с точки зрения поражения электрическим током. Температура окружающей среды +20±5°С, относительная влажность воздуха 60±20%. В помещении должны быть непроводящие полы, отсутствовать токопроводящая пыль, отсутствовать электрически активная среда, отсутствовать возможность одновременного прикосновения к металлическим частям прибора и заземляющему устройству, отсутствовать высокая температура и сырость (ПУЭ 1.1.13).

Для защиты от поражения электрическим током все токоведущие части должны быть защищены от случайных прикосновений кожухами (ПУЭ 1.1.32), корпус устройства должен быть заземлен. Заземление выполняется изолированным медным проводом сечением 1.5 мм2 (ПУЭ 1.7.78), который присоединяется к общей шине заземления с общим сечением 48 м2 при помощи сварки. Общая шина присоединяется к заземлению, сопротивление которого не должно превышать 4 Ом (ПУЭ 1.7.65). Питание устройства должно осуществляться от силового щита через автоматический предохранитель, срабатывающий при коротком замыкании нагрузки.

Эксплуатация устройства должна производиться персоналом, имеющим квалификацию по ТБ II (согласно ПТЭ). Работа по устранению неисправностей и наладка должна производиться персоналом с квалификационной группой по ТБ не ниже III (согласно ПТЭ) и только после снятия напряжения питания с устройства.

Для предотвращения возникновения опасных ситуаций должно быть предусмотрено:

-         автоматический выключатель по входному напряжению (защита от короткого замыкания и всплесков входного напряжения, тепловая защита от длительного воздействия повышенного входного напряжения). Этот же выключатель используется как средство аварийного ручного отключения;

-       плавкий предохранитель, дублирующий функции автоматического выключателя, но имеющий более высокое быстродействие;

-       фильтры от гармоник;


.9 Требования к пожарной безопасности

Помещения, в которых установлены персональные ЭВМ, по пожарной опасности относятся к категории Д, и должны удовлетворять требованиям по предотвращению и тушению пожара по ГОСТ 18.06.2003 №313. Обязательно наличие телефонной связи и пожарной сигнализации.

Материалы, применяемые для ограждающих конструкций и отделки рабочих помещений должны быть огнестойкими. Для предотвращения возгорания в зоне расположения ЭВМ обычных горючих материалов (бумага) и электрооборудования, необходимо принять следующие меры:

-         в машинном зале должны быть размещены углекислотные огнетушители типов ОУ-2, ОУ-5, ОУ-8. Согласно типовым правилам пожарной безопасности на каждые 100 кв. метров площади помещения ВЦ должен приходиться один огнетушитель;

-       в качестве вспомогательного средства тушения пожара могут использоваться гидрант или устройства с гибкими шлангами;

-       для непрерывного контроля машинного зала и зоны хранения носителей информации необходимо установить систему обнаружения пожаров, для этого можно использовать комбинированные извещатели типа КИ-1 из расчета один извещатель на 100 м2 помещения. Меры пожарной безопасности определены в ГОСТ 18.06.2003 №313.

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

Заключение

В данном дипломном проекте были изложены математические и алгоритмические аспекты функционирования нейронных сетей. Успешно была решена поставленная задача реализации программного продукта для проектирования нейронных сетей.

Хотя решение на основе нейронной сети может выглядеть и вести себя как обычное программное обеспечение, они различны в принципе, поскольку большинство реализаций на основе нейронных сетей “обучается”, а не программируется: сеть учится выполнять задачу, а не программируется непосредственно. Решения на основе нейронных сетей становятся все более совершенными и, несомненно, в будущем наши возможности по разработке соответствующих устройств возрастут за счет лучшего понимания их основополагающих принципов. Но уже сегодня имеется немало впечатляющих разработок. База приложений нейронных сетей просто огромна: выявление фальшивых кредитных карточек, прогнозирование изменений на фондовой бирже, оптическое распознавание символов, наблюдение за техническим состоянием механизмов, профилактика и диагностика заболеваний человека, автоматическое управление движением автомобиля и т.д. Дальнейшие успехи в разработке искусственных нейронных сетей будут зависеть от дальнейшего понимания принципов работы человеческого мозга, но здесь имеется и обратная связь: искусственные нейронные сети являются одним из средств, с помощью которых совершенствуется наше представление о процессах, происходящих в нервной системе человека.

Будущее нейронных сетей кажется вполне ясным, и сегодня это та область знаний, о которой должны иметь определенное представление все научные специалисты, работающие в области компьютерных технологий, равно как и многие инженеры и научные работники смежных специальностей.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Р. Каллан. Основные концепции нейронных сетей. - Москва: «Вильямс», 2001г.

. В.А.Головко Нейронные сети: обучение, организация и применение. - Москва: «Радиотехника», 2001г.

. А.Н. Горбань, Д.А. Россиев Нейронные сети на персональном компьютере. - Новосибирск: «Наука», 1996г.

. К.С. Хорстман, Г. Корнелл Java2: пер. с англ. - Москва : «Вильямс», 2004г.

. Санитарно-эпидемиологические правила и нормативы. СанПиН 2.2.2/2.4.1340 - 03.

ПРИЛОЖЕНИЕ А

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

/**

* Класс <code> main</code> является главным классом, в которм

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

* в других классах

*/classWindow.*;

import java.awt.*;java.awt.event.*;javax.swing.*;javax.swing.event.*;class main

{

/**

Конструктор класса <code> main</code>

@param String[] args параметры в командной строке при запуске приложения /не используются/

*/static void main (String[] args)

{frame1 = new MainFrame ();.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);.show();

}

}

/**

Класс <code> MainFrame</code> создает окно, с предопределнными

параметрами (размеры, положение при первом запуске, расположение

компонентов внутри)

*/MainFrame extends JFrame

{MainFrame ()

{kit = Toolkit.getDefaultToolkit();screenSize = kit.getScreenSize();screenHeight = screenSize.height;screenWidth = screenSize.width;(screenWidth/3, screenHeight/3);(800, 600);("Neiron Frame");(false);contentPane = getContentPane ();menuBar = new JMenuBar ();menu = new MyMenu (description, menuBar);(menuBar);drPanel = new DrawPanel (description, menu);butPanel = new ButonPanel (drPanel);= new JScrollPane (description);layout = new GridBagLayout ();.setLayout (layout);constraints = new GridBagConstraints ();.fill = GridBagConstraints.BOTH;ins = new Insets (5,5,5,5);.insets = ins;.weightx = 20;.weighty = 100;.gridx = 0;.gridy = 0;.gridwidth = 1;.gridheight = 1;.add(butPanel, constraints);.weightx = 100;.weighty = 100;.gridx = 1;.gridy = 0;.gridwidth = 1;.gridheight = 1;.add(drPanel, constraints);.weightx = 100;.weighty = 30;.gridx = 0;.gridy = 1;.gridwidth = GridBagConstraints.REMAINDER;.gridheight = GridBagConstraints.REMAINDER;.add(scrollPane, constraints);

}final JTextArea description = new JTextArea ();

private JScrollPane scrollPane;

}

ПРИЛОЖЕНИЕ Б

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

/**

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

Сеть состоит из некоторого количества слоев, но как минимум

должны присутствовать входной и выходной слои.

*/classNet;classWindow.*;classNet.classLayer.*;java.util.*;javax.swing.*;classNeiron.*;java.awt.*;java.io.*;class Net

{

/**

Конструктор класса Net вызываемый при открытии Н.сети из файла

@param Frame owner - родительский компонент

@param String fileToOpen путь к файлу

*/Net (Frame owner, String fileToOpen)

{

{inNet = new ObjectInputStream (new FileInputStream(fileToOpen));[] newSloi = (int[]) inNet.readObject();= newSloi[0];= newSloi[1];= new int [subS];(int i=0; i < subS; i++)

{[i] = newSloi[i+2];

}= newSloi[2+subS];= newSloi[3+subS];= newSloi[4+subS];= newSloi[5+subS];= new VvodKartinki (owner, stolbcov, strok);= new VvodCifr ( owner, out);= subS+2;= new ArrayList (layers);(int i=0; i<layers; i++)

{= (Layer) inNet.readObject();.add(l);

}.close();

}(Exception e)

{.printStackTrace();

}

}

/**

Конструктор класса Net вызываемый при создании сети по рисунку

@param Frame owner - родительский компонент

@param int aIn количество нейронов во входном слое

@param int aSubS количество скрытых слоев

@param int [] aSub количество нейронов в каждом из скрытых слоев

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

*/Net (Frame owner, int aIn, int aSubS, int [] aSub, int aOut)

{= JOptionPane.showOptionDialog (null,

"Выберите функцию активации\nесли окно будет просто закрыто, то будет установлена *Бинарная сигмоидальная*",

"Диалог",.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, new String[]

{"Бинарная\n сигмоидальная",

"Биполярная\n сигмоидальная"},"Бинарная\n сигмоидальная");

if (funkciya == JOptionPane.CLOSED_OPTION) funkciya = 0;= aIn;= aSubS;= new int [subS];(int i =0; i<subS; i++)

{[i] = aSub[i];

}= aOut;

= 2 + subS;= new ArrayList ();(int i =0; i<layers; i++)

{(i == 0)

{= new Layer ("in", in, in, funkciya);.add(l);

}

{(i != layers-1)

{preL = (Layer)massivLayers.get(i-1);v = sub[i-1];.setVIxodi(v);= new Layer ("sub", sub[i-1], preL.getVIxodi(), funkciya);.add(l);

}

{preL = (Layer)massivLayers.get(i-1);.setVIxodi(out);= new Layer ("out", out, preL.getVIxodi(), funkciya);.add(l);

}

}

}(strok*stolbcov != in)

{= JOptionPane.showInputDialog ("Всего нейронов на входе "+in+"\nСколько будет столбцов?");= Integer.parseInt (input);= JOptionPane.showInputDialog ("Всего нейронов на входе "+in+"\nСколько будет строк?");= Integer.parseInt (input);

}= new VvodKartinki (owner, stolbcov, strok);= new VvodCifr ( owner, out);

}

/**

Отображает информацию о нейронной сети (количество слоев, количество нейронов

в каждом слое, а так же свойства каждого нейрона

@param JTextArea txtArea - текстовая область для отображения информации

*/void ShowNetInfo (JTextArea txtArea)

{(int i=0; i < layers; i++)

{= (Layer) massivLayers.get (i);(i == 0)

{.append (" ВХОДНОЙ СЛОЙ \n");.append (l.getInfo());

}

{(i != layers-1)

{.append ("\n СКРЫТЫЙ СЛОЙ \n");.append (l.getInfo());

}

{

txtArea.append ("\n ВЫХОДНОЙ СЛОЙ \n");

txtArea.append (l.getInfo());

}

}

}.append ("\n");

}

/**

Сохраняет нейронную сеть как набор массивов: количество слоев

количество нейронов в каждом слое

каждый слой как массив нейронов

@param String fileToSave - путь к файлу, расширение которого net

*/void SaveNet (String fileToSave)

{fileName = fileToSave;.toLowerCase();(!fileName.endsWith(".net"))

{n = fileName.length();= fileName.substring(0,n) + ".net";

}[] sloi = new int [layers+6];[0] = in;[1] = subS;(int i = 0; i < subS; i++)

{[i+2] = sub[i];

}[2+subS] = out;[3+subS] = stolbcov;[4+subS] = strok;[5+subS] = funkciya;

{outNet = new ObjectOutputStream (new FileOutputStream(fileName));.writeObject (sloi);(int i=0; i < layers; i++)

{= (Layer) massivLayers.get (i);.writeObject (l);

}.close ();

}(Exception e)

{.printStackTrace ();

}

}

/**

Отображает информацию о количестве нейронов во воходном слое

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

*/int getInputLayer ()

{= (Layer) massivLayers.get(0);tmp = l.getVIxodi();

return tmp;

}

/**

Выясняет реакцию сети на входное воздействие

@see classWindow.VvodKartinki#showIt ()

@see classWindow.VvodKartinki#getMassiv ()

@param JTextArea txtArea - текстовая область для вывода результатов

*/void MakeRas4et (JTextArea txtArea)

{.append ("\n\n Будет расчет сети\n");(int i =0; i < layers; i++)

{= (Layer) massivLayers.get (i);= new double[l.getVIxodi()];(i==0)

{(vvod.showIt())

{= vvod.getMassiv();

}

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

}= new double[l.getVIxodi()];= l.makeRas4et (i, tempArray);

}

{= l.makeRas4et (i, result);= new double[l.getVIxodi()];(int j = 0; j<result.length; j++)

{[j] = tempArray[j];

}

}(int j=0; j<result.length; j++)

{.append ("\nНА ВЫХОДЕ нейрнона "+(j+1)+" результат= "+result[j]+"\n");

}

}= new VivodRez (result);

}

/**

Процесс обучения сети на основе вводимых далее пользователем данных @see

@param JTextArea txtArea - текстовая область для вывода результатов и критических сообщений

*/void Study (JTextArea txtArea)

{.append ("\n\n Будет обучение сети\n");

input = JOptionPane.showInputDialog ("Введите величину допустимой среднеквадратичной ошибки");= Double.parseDouble (input);= JOptionPane.showInputDialog ("Введите норму обучения, в пределах от 0 до 1");eniya = Double.parseDouble (input);= JOptionPane.showInputDialog ("Сколько будет образцов в эпохе?");

int epoxa = Integer.parseInt (input);

massivStudy = new ArrayList ();= (Layer) massivLayers.get (0);= l.getVIxodi();= (Layer) massivLayers.get (massivLayers.size()-1);= l.getVIxodi();(int j = 0; j < epoxa; j++)

{= new double [stIn];(vvod.showIt())

{= vvod.getMassiv();

}

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

}= new double [stOut];

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

if(vvodCifr.showIt())

{= vvodCifr.getMassiv();

}

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

return;

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

}.trimToSize();(!STOP)

{= new double [epoxa];(int i =0; i < epoxa; i++)

{s = (StudyArrays)massivStudy.get(i);= new double [s.getIN()];= s.getArrayIn();(int j =0; j<layers; j++)

{= (Layer) massivLayers.get (j);(j==0)

{= new double[l.getVIxodi()];= l.makeRas4et (j, tempArray);

}

{= new double[l.getVIxodi()];= l.makeRas4et (j, resultStudy);= new double[l.getVIxodi()];(int ij = 0; ij<resultStudy.length; ij++)

{[ij] = tempArray[ij];

}

}

}= new double [s.getOUT()];= s.getArrayOut();(int j =layers-1; j>0; j--)

{= (Layer) massivLayers.get (j);(j == (layers-1))

{.ras4etOshibki (result, resultStudy);

}

{= (Layer) massivLayers.get (j+1);= new double [l.getVIxodi()];= l.getMassivRas4et();.ras4etOshibki (l1, resultStudy);

}

}

//вычисление квадрата ошибок= new double [s.getOUT()];= s.getArrayOut();= (Layer) massivLayers.get (massivLayers.size()-1);= new double [l.getVIxodi()];= l.getMassivRas4et();last = true;= 0;(int j=0; j < l.getVIxodi(); j++)

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

}[i]=temp;

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

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

{= (Layer) massivLayers.get (j);= new double[l.getVIxodi()];= l.getMassivOshibok ();= (Layer) massivLayers.get (j-1);= new double [l1.getVIxodi()];= l1.getMassivRas4et();.izmenenieVesov (normaObu4eniya, resultStudy, tempArray);

}

}

//проверка на достоверность=0;(int i = 0; i< epoxa; i++)

{=temp+e[i];

}=temp/2;(temp<Em) STOP = true;++;(counter==10) {JOptionPane.showMessageDialog(null,"Прошло "+(count2*10)+" эпох обучения");2++; counter=1;}

}

}

/**

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

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

*/class StudyArrays

{

/**

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

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

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

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

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

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

{= input;= new double [in];(int i =0; i<in; i++)

{[i]= array1[i];

}= output;= new double [out];(int i =0; i<out; i++)

{[i]= array2[i];

}

}

/**

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

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

*/int getIN ()

{in;

}

/**

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

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

*/int getOUT ()

{out;

}

/**

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

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

*/double[] getArrayIn ()

{arrayInput;

}

/**

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

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

*/double[] getArrayOut ()

{arrayOutput;

}double [] arrayInput;int in;double [] arrayOutput;int out;

}int getIn ()

{in;

}int getsubS ()

{subS;

}int getout ()

{out;

}int[] getsub ()

{sub;

}int count2 = 1;int counter=1;VvodCifr vvodCifr= null;int funkciya;VivodRez VIvod = null;int strok=0;int stolbcov=0;VvodKartinki vvod= null;double [] e;boolean STOP = false;static double Em;static double normaObu4eniya;double [] resultStudy;Layer l;Layer l1;ArrayList massivStudy;ArrayList massivLayers;static int layers;double temp;double [] tempArray;double [] tempArray2;double [] studyArrayIN;int stIn;double [] studyArrayOUT;int stOut;double [] result;String input;int in;int subS;int[] sub;

private int out;

}

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

/**

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

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

*/classNet.classLayer;

import classNeiron.*;java.util.*;java.io.*;javax.swing.*;class Layer implements Serializable

{

/**

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

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

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

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

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

*/Layer (String tip, int capacityNeironov, int vxodi, int fun)

{estvo = capacityNeironov;= fun;= new ArrayList(koli4estvo);.toLowerCase();(tip == "in")

{= koli4estvo;= 1;(int i=0; i<koli4estvo; i++)

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

}.trimToSize();

}

{(tip == "out")

{= vxodi;= koli4estvo;(int i=0; i<koli4estvo; i++)

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

}.trimToSize();

}

{(tip == "sub")

{= vxodi;= 1;(int i = 0; i < koli4estvo; i++)

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

}.trimToSize();

}

}

}

}

/**

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

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

*/int getVIxodi ()

{koli4estvo;

}

/**

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

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

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

*/void setVIxodi (int VIxodi)

{= VIxodi;(int i = 0; i < koli4estvo; i++)

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

n.setVIxodi(output);

}

}

/**

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

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

public String getInfo ()

{infoString = "";(int i=0; i<koli4estvo; i++)

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

}infoString;

}

/**

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

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

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

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

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

*/double[] makeRas4et (int thisSloi, double [] lastSloiResult)

{et = new double[koli4estvo];(int i =0; i<koli4estvo; i++)

{n = (Neiron) massivNeironov.get(i);(thisSloi==0)

{= lastSloiResult[i];= n.getINResult (temp);

}

{= n.getResult (lastSloiResult);

}et[i]=temp;

}massivRas4et;

}

/**

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

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

*/double[] getMassivRas4et ()

{massivRas4et;

}

/**

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

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

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

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

*/double getDeltaW (int I, int J)

{n = (Neiron) massivNeironov.get(J);tmp = n.getVesKoef (I);= tmp * massivOshibok[J];tmp;

}

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

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

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

*/void ras4etOshibki (double [] obrazecResult, double [] realniiResult)

{= new double [koli4estvo];(int i =0; i < koli4estvo ; i++)

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

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

}

}

/**

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

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

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

*/void ras4etOshibki (Layer preL, double [] realniiResult)

{= new double [koli4estvo];= new double [preL.getVIxodi()];= preL.getMassivRas4et();(int i =0; i < koli4estvo ; i++)

{= 0;(funkciya==0)

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

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

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

}(funkciya==1)

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

{= preL.getDeltaW(i, j)*(1-tempArray[j]*tempArray[j]);= sum + temp/2;

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

}[i] = delta;

}

}

/**

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

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

*/double[] getMassivOshibok ()

{massivOshibok;

}

/**

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

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

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

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

*/void izmenenieVesov (double normaObu4, double [] resultPreL, double [] oshibki)

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

{n = (Neiron) massivNeironov.get(i);(int j =0; j<=resultPreL.length; j++)

{(j!=resultPreL.length)

{(funkciya==0) temp = oshibki[i] * normaObu4 * resultPreL[j];(funkciya==1) temp = 0.5*oshibki[i] * normaObu4 * resultPreL[j];.setVesKoef(j, temp);

}

{(funkciya==0) temp = oshibki[i] * normaObu4 * 1;(funkciya==1) temp = 0.5*oshibki[i] * normaObu4 * 1;.setVesKoef(j, temp);

}

}

}

}int funkciya;double sum;double delta;double temp;ArrayList massivNeironov;double [] massivRas4et;double [] massivOshibok;double [] tempArray;int input;int output;int koli4estvo;

}

ПРИЛОЖЕНИЕ В

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

/**

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

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

*/classNeiron;java.awt.*;javax.swing.*;java.io.*;java.util.*;class Neiron implements Serializable

{

/**

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

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

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

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

*/Neiron (int IN, int OUT, String type, int fun)

{= fun;= OUT;(type == "in")

{= 1;_koef = new float [vxodi];(int i = 0; i < vxodi; i++)

{_koef[i]=1.0F;

}

}

{= IN+1;_koef = new float [vxodi];(int i = 0; i < vxodi; i++)

{= Math.random();(vk<=0.45) { ves_koef[i]= (float)vk;}_koef[i]=(float)(0.45-vk);

}

}

}

/**

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

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

*/void setVIxodi (int out)

{= out;

}

/**

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

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

*/int get_vxodi ()

{vxodi;

}

/**

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

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

*/int get_VIxodi ()

{VIxodi;

}

/**

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

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

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

*/float getVesKoef (int nomer_koef)

{ves_koef[nomer_koef];

}

/**

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

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

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

*/

public String toString ()

{str = "входов="+vxodi;(int i=0; i<vxodi; i++)

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

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

return str;

}

/**

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

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

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

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

*/double getResult (double [] tempResult)

{= 0.0;(int i=0; i < vxodi; i++)

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

}= getResultat (sum);result;

}

/**

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

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

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

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

*/double getINResult (double tempResult)

{= 0.0;= sum + ves_koef[0]*tempResult;= getINResultat(sum);result;

}

/**

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

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

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

*/double getResultat (double param)

{(funkciya==0)

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

}(funkciya==1)

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

}res;

}

/**

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

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

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

*/double getINResultat (double param)

{res = param;res;

}

/**

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

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

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

*/void setVesKoef (int j, double tmp)

{temp = ves_koef [j] + tmp;_koef[j] = (float)temp;

}double res;int funkciya;double result;double sum;String input;int inp;double vk;int n;int vxodi;int VIxodi;float [] ves_koef;

}

ПРИЛОЖЕНИЕ Г

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

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

package classWindow;java.awt.*;java.awt.event.*;javax.swing.*;class ButonPanel extends JPanel

{ButonPanel (DrawPanel panelDraw)

{(layout);nextButton = new JButton ("Далее");nextAction = new NextAction (panelDraw, "drawLines");.addActionListener (nextAction);(nextButton);.putConstraint(SpringLayout.WEST, nextButton, strut, SpringLayout.WEST, this);.putConstraint(SpringLayout.SOUTH, nextButton, strut2, SpringLayout.SOUTH, this);= rast -35;= Spring.constant (rast);("выходной слой", "classWindow\\outSloy.gif", this, panelDraw);("скрытый слой", "classWindow\\subSloy.gif", this, panelDraw);("входной слой", "classWindow\\inSloy.gif", this, panelDraw);

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

{podpis = new JLabel (labl);.add(podpis);.putConstraint(SpringLayout.WEST, podpis, strut, SpringLayout.WEST, parent);.putConstraint(SpringLayout.SOUTH, podpis, strut2, SpringLayout.SOUTH, parent);= rast -15;= Spring.constant (rast);button = new JButton (new ImageIcon (icn));.setVerticalTextPosition(SwingConstants.TOP);probaAction = new NextAction (panDr, icn);.addActionListener (probaAction);.add(button);.putConstraint(SpringLayout.WEST, button, strut, SpringLayout.WEST, parent);.putConstraint(SpringLayout.SOUTH, button, strut2, SpringLayout.SOUTH, parent);= rast -85;= Spring.constant (rast);

}class NextAction implements ActionListener

{NextAction (DrawPanel drPan, String nameSloy)

{= drPan;= nameSloy;

}void actionPerformed (ActionEvent event)

{(panDraw.setSloy(sloy));

}String sloy;DrawPanel panDraw;

}int rast=-5;Spring strut2 = Spring.constant (rast);SpringLayout layout = new SpringLayout ();Spring strut = Spring.constant (25);

}

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

package classWindow;java.awt.*;java.awt.event.*;java.util.*;java.awt.geom.*;javax.swing.*;classNet.*;classWindow.ImagePanel;class DrawPanel extends JPanel

{DrawPanel (JTextArea textArea, MyMenu mM)

{= textArea;= mM;= (Frame)SwingUtilities.getAncestorOfClass(DrawPanel.class, this);= new ArrayList ();= null;(new MouseHandler ());(new MouseMotionHandler ());= new JPopupMenu();deleteItem = new JMenuItem ("удалить");.addActionListener (new()

{void actionPerformed (ActionEvent evt)

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

}

});.add(deleteItem);

}boolean setSloy (String sloy)

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

{=false; sSloy=false; oSloy=true; return true;

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

{=false; sSloy=true; oSloy=false; return true;

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

{=true; sSloy=false; oSloy=false; return true;

}(sloy == "drawLines")

{(iSloyExist && oSloyExist)

{= new Net (owner, ain, asubS, asub, aout);imPanel = new ImagePanel (net1);.setNet (net1);(false);false;

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

return true;

}true;

}void paintComponent (Graphics g)

{.paintComponent (g);D g2 = (Graphics2D) g;(int i = 0; i < squares.size (); i++).draw ((Rectangle2D)squares.get(i));

}Rectangle2D find (Point2D p)

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

{D r = (Rectangle2D) squares.get (i);(r.contains (p)) return r;

}null;

}void add (Point2D p)

{x = p.getX ();y = p.getY ();(iSloy)

{= JOptionPane.showInputDialog ("Количество нейронов в слое");= Integer.parseInt (ainput);= true;= new Rectangle2D.Double (x-SIDELENGTH/2, y-SIDELENGTH/2, SIDELENGTH/2, SIDELENGTH);.add (0, current);

}(sSloy)

{= JOptionPane.showInputDialog ("Количество нейронов в слое");= Integer.parseInt (ainput);++;(asubS==1)

{= new int [asubS];[0] = atemp;

}

{[] tempSub = new int [asubS-1];.arraycopy(asub, 0, tempSub, 0, asub.length);= new int [asubS];.arraycopy(tempSub, 0, asub, 0, tempSub.length);[asubS-1] = atemp;

}= true;= new Rectangle2D.Double (x-SIDELENGTH/2, y-SIDELENGTH/2, SIDELENGTH, SIDELENGTH);= squares.size();(atemp == 0) squares.add (current);if (oSloyExist) squares.add (squares.size()-1, current);squares.add (squares.size(), current);

}(oSloy)

{= JOptionPane.showInputDialog ("Количество нейронов в слое");= Integer.parseInt (ainput);= true;= new Rectangle2D.Double (x-SIDELENGTH/2, y-SIDELENGTH/2, SIDELENGTH*2, SIDELENGTH);= squares.size();(atemp == 0) squares.add (current);squares.add (squares.size(), current);

}=false;=false;=false;();

}void remove (Rectangle2D s)

{(s == null) return;(s == current)

{st = current.getWidth ();(st == SIDELENGTH*2) oSloyExist = false;(st == SIDELENGTH ) sSloyExist = false;(st == SIDELENGTH/2) iSloyExist = false;= null;

}.remove (s);();

}class MouseHandler extends MouseAdapter

{void mousePressed (MouseEvent event)

{= find (event.getPoint ());

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

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

{

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

}

{(event.getPoint ());

}

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

{last_x = (int)current.getX() - event.getX();last_y = (int)current.getY() - event.getY();

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

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

}

}void mouseClicked (MouseEvent event)

{= find (event.getPoint ());(event.isPopupTrigger() && current != null)

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

}

}void mouseReleased (MouseEvent event)

{= find (event.getPoint ());(event.isPopupTrigger() && current != null)

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

}

}

}class MouseMotionHandler implements MouseMotionListener

{void mouseMoved (MouseEvent event)

{(find(event.getPoint())==null) setCursor(Cursor.getDefaultCursor());setCursor (Cursor.getPredefinedCursor (Cursor.CROSSHAIR_CURSOR));

}void mouseDragged (MouseEvent event)

{(current != null)

{= getSize();sideHeight = current.getHeight();sideWidth = current.getWidth();((current.getY() + sideHeight) > dim.getHeight())

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

}

{(current.getY() < 0)

{_y = 1+sideHeight/2;

}

{_y = event.getY();

}

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

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

}

{(current.getX() < 0)

{_x = sideWidth/2+1;

}

{_x = event.getX();

}

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

}

}

}Frame owner;double new_x;double new_y;Dimension dim;MyMenu mMenu;boolean iSloyExist=false;boolean sSloyExist=false;boolean oSloyExist=false;boolean iSloy=false;boolean sSloy=false;boolean oSloy=false;JTextArea txtArea;JPopupMenu popup;static final int SIDELENGTH = 50;ArrayList squares;Rectangle2D current;Net net1;String ainput;int ain;int asubS;int[] asub = new int [0];int aout;int atemp;

}

Листинги класса менюclassWindow;classNet.*;classNet.classLayer.*;classWindow.ImagePanel;java.awt.*;java.awt.event.*;javax.swing.*;javax.swing.event.*;javax.swing.filechooser.FileFilter;java.io.*;java.util.*;class MyMenu extends JMenu

{MyMenu (JTextArea textArea, JMenuBar menuBar)

{= (Frame)SwingUtilities.getAncestorOfClass(MyMenu.class, this);= textArea;= new JFileChooser();.setMultiSelectionEnabled (false);.setFileSelectionMode (JFileChooser.FILES_AND_DIRECTORIES);.setAcceptAllFileFilterUsed (false);filter = new NetFileFilter ();.setDescription ("Net Files");.setFileFilter (filter);showNet = new ShowNet ();saveNet = new SaveNetAction ();openNet = new OpenNetAction ();ras4etNet = new Ras4etNetAction ();studyNet = new StudyNetAction ();showNetImage = new ShowNetImageAction ();fileMenu = new JMenu ("Файл");.add (fileMenu);openNetItem = new JMenuItem ("Открыть..");.addActionListener (openNet);.add (openNetItem);= new JMenuItem ("Сохранить как");.addActionListener (saveNet);.add (saveNetItem);.setEnabled (false);.addSeparator();exitItem = new JMenuItem ("Выход");.addActionListener (new()

{void actionPerformed (ActionEvent event)

{.exit (0);

}

});.add (exitItem);netMenu = new JMenu ("Нейро-сеть");.add (netMenu);etNetItem = new JMenuItem ("Расчет");etNetItem.addActionListener (ras4etNet);.add (ras4etNetItem);etNetItem.setEnabled (false);= new JMenuItem ("Обучение");.addActionListener (studyNet);.add (studyNetItem);.setEnabled (false);.addSeparator();= new JMenuItem ("параметры сети");.addActionListener (showNet);.add (aboutNetItem);.setEnabled (false);= new JMenuItem ("схема сети");.addActionListener (showNetImage);.add (showNetImageItem);.setEnabled (false);

}void setNet (Net n)

{= n;.setEnabled (true);.setEnabled (true);etNetItem.setEnabled (true);.setEnabled (true);.setEnabled (true);

}class ShowNetImageAction implements ActionListener

{void actionPerformed (ActionEvent event)

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

}

}class SaveNetAction implements ActionListener

{void actionPerformed (ActionEvent event)

{.setCurrentDirectory (new File ("."));result = chooser.showSaveDialog (null);filename = chooser.getSelectedFile().getPath();.SaveNet(filename);

}

}class Ras4etNetAction implements ActionListener

{void actionPerformed (ActionEvent event)

{.MakeRas4et(txtArea);

}

}class StudyNetAction implements ActionListener

{void actionPerformed (ActionEvent event)

{.Study(txtArea);

}

}class OpenNetAction implements ActionListener

{void actionPerformed (ActionEvent event)

{.setCurrentDirectory (new File ("."));result = chooser.showOpenDialog (null);(result ==JFileChooser.APPROVE_OPTION)

{filename = chooser.getSelectedFile().getPath();= new Net(owner, filename);(imPanel != null)

{.setVisible(false);

}= new ImagePanel (net2);.setEnabled (true);.setEnabled (true);etNetItem.setEnabled (true);.setEnabled (true);.setEnabled (true);

}

}

}class ShowNet implements ActionListener

{void actionPerformed (ActionEvent event)

{.ShowNetInfo(txtArea);

}

}ImagePanel imPanel;Frame owner;JMenuItem showNetImageItem;JMenuItem studyNetItem;JMenuItem ras4etNetItem;JMenuItem saveNetItem;JMenuItem aboutNetItem;JFileChooser chooser;Net net2;JTextArea txtArea;

}NetFileFilter extends FileFilter

{void setDescription (String aDescription)

{= aDescription;

}String getDescription()

{description;

}boolean accept (File f)

{(f.isDirectory()) return true;name = f.getName().toLowerCase();(name.endsWith(".net")) return true;false;

}String description = "";

}

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

package classWindow;java.awt.*;java.awt.event.*;java.util.*;javax.swing.*;class VvodKartinki extends JDialog

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

{

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

stolbcov = aStolbcov;= aStrok;= strok*stolbcov;= new ArrayList (kN);= new double [kN];contentPane = getContentPane();(stolbcov*40,(strok+1)*40);panel = new InpPanel(VvodKartinki.this);.add(panel, BorderLayout.CENTER);(false);

}class InpPanel extends JPanel

{InpPanel (final JDialog owner)

{layout = new GridBagLayout ();(layout);constraints = new GridBagConstraints ();(int i = 0; i<strok; i++)

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

{= getConstr(j, i, 1, 1);sb = new SmallButton ();(sb, constraints);.add(sb);

}

}panel22 = new UprPanel (owner);= getConstr(0, strok+1, stolbcov, 1);(panel22, constraints);

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

{constraint = new GridBagConstraints ();.fill = GridBagConstraints.BOTH;ins = new Insets (1,1,1,1);.insets = ins;.weightx = 100;.weighty = 100;.gridx = x;.gridy = y;.gridwidth = w;.gridheight = h;constraint;

}class SmallButton extends JButton

{SmallButton ()

{(color0);(new MouseHandler ());

}class MouseHandler extends MouseAdapter

{void mousePressed (MouseEvent event){}void mouseReleased (MouseEvent event){}void mouseClicked (MouseEvent event)

{c = getBackground();(c == color0) setBackground(color1);(c == color1) setBackground(color0);

}

}

}class UprPanel extends JPanel

{UprPanel (final JDialog owner)

{okButton = new JButton ("ok");.addActionListener (new()

{void actionPerformed(ActionEvent event)

{= true;(int i = 0; i<kN; i++)

{s = (SmallButton)kartinka.get(i);c = s.getBackground();(c == color0) massiv[i]=0;(c == color1) massiv[i]=1;

}.setVisible (false);

}

});cancelButton = new JButton ("Cancel");.addActionListener(new()

{void actionPerformed (ActionEvent event)

{.setVisible (false);

}

});(okButton);(cancelButton);

}

}

}boolean showIt ()

{= false;(true);ok;

}double[] getMassiv ()

{massiv;

}

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

package classWindow;java.awt.*;java.awt.geom.*;java.util.*;javax.swing.*;classNet.*;class ImagePanel extends JDialog

{ImagePanel (Net net1)

{contentPane = getContentPane();("Схема нейронной сети");(false);(false);=net1.getIn();=net1.getsubS();= new int [asubS];= net1.getsub();=net1.getout();= 2+asubS;= ain;(int i=0; i<asubS; i++)

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

}(temp<aout) temp = aout;= 500/temp;( temp/3 < 25) r=temp/3;r=25;=700/kL;(width, height);panel = new DrPanel();.add(panel, BorderLayout.CENTER);(true);

}class DrPanel extends JPanel

{void paintComponent (Graphics g)

{.paintComponent (g);D g2 = (Graphics2D)g;= dX/2;= height/(1+ain);= dY/2;= new ArrayList();= new ArrayList();(int i =0; i< ain; i++)

{= new Ellipse2D.Double();.setFrameFromCenter(centerX,centerY,centerX+r,centerY+r);.setStroke(new BasicStroke(1.0F));.draw(neiron);= new Point2D.Double(centerX+r,centerY);.add(p);.setStroke(new BasicStroke(2.0F));.draw(new Line2D.Double(centerX-r,centerY,centerX-r-dX/3,centerY));.draw(new Line2D.Double(centerX-r,centerY,centerX-r-10,centerY-4));.draw(new Line2D.Double(centerX-r,centerY,centerX-r-10,centerY+4));= centerY+ dY;

}= new Ellipse2D.Double();.setFrameFromCenter(centerX+dX/2,520-4*r,centerX+dX/2+r,520-4*r+r);.setStroke(new BasicStroke(2.0F));.draw(neiron);= new Point2D.Double(centerX+dX/2+r,520-4*r);.add(p);(int j =0 ; j<asubS; j++)

{= centerX + dX;= height/(1+asub[j]);= dY/2;(int i =0; i< asub[j]; i++)

{= new Ellipse2D.Double();.setFrameFromCenter(centerX,centerY,centerX+r,centerY+r);.setStroke(new BasicStroke(1.0F));.draw(neiron);= new Point2D.Double(centerX-r,centerY);(int k=0; k< massivPoint.size(); k++)

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

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

}= new Ellipse2D.Double();.setFrameFromCenter(centerX+dX/2,520-4*r,centerX+dX/2+r,520-4*r+r);.setStroke(new BasicStroke(2.0F));.draw(neiron);= new Point2D.Double(centerX+dX/2+r,520-4*r);.add(p);.clear();(int k=0; k< tempMassivPoint.size(); k++)

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

}.clear();

}= centerX + dX;= height/(1+aout);= dY/2;(int i =0; i< aout; i++)

{= new Ellipse2D.Double();.setFrameFromCenter(centerX,centerY,centerX+r,centerY+r);.setStroke(new BasicStroke(1.0F));.draw(neiron);= new Point2D.Double(centerX-r,centerY);(int k=0; k< massivPoint.size(); k++)

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

}.setStroke(new BasicStroke(2.0F));.draw(new Line2D.Double(centerX+r,centerY,centerX+r+dX/3,centerY));.draw(new Line2D.Double(centerX+r+dX/3,centerY,centerX+r+dX/3-10,centerY-4));.draw(new Line2D.Double(centerX+r+dX/3,centerY,centerX+r+dX/3-10,centerY+4));= centerY+ dY;

}

}

}Ellipse2D neiron;Point2D p;ArrayList massivPoint;ArrayList tempMassivPoint;int temp;int;int height=550;double dX;double dY;double centerX;double centerY;int kL;double r;int ain;int asubS;int[] asub = new int [0];

private int aout;

}

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

package classWindow;java.awt.*;java.awt.geom.*;java.util.*;javax.swing.*;class VivodRez extends JDialog

{VivodRez (double [] massiv2)

{= massiv2;contentPane = getContentPane();((massivVivod.length*25+200), 250);

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

setResizable(false);(true);= new JScrollPane (rezultat);.add(scrollPane2, BorderLayout.EAST);(int i =0 ; i< massivVivod.length; i++)

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

}panel = new DrPanel();.add(panel, BorderLayout.CENTER);(true);

}class DrPanel extends JPanel

{void paintComponent (Graphics g)

{.paintComponent (g);D g2 = (Graphics2D)g;.setPaint (new Color(180, 120, 180));(int i=0; i< massivVivod.length; i++)

{(massivVivod[i] >=0)

{= massivVivod[i]*100;= 109 - height;

}

{= -(massivVivod[i]*100);= 111;

}D rect = new Rectangle2D.Double (leftX, topY, width, height);.draw(rect);.fill(rect);.drawString(""+(i+1), messageX, messageY);= leftX+25;= messageX + 25;

}.setPaint (new Color(90, 60, 90));.draw(new Line2D.Double(5, 10, leftX-5, 10));.draw(new Line2D.Double(5, 110, leftX-5, 110));.draw(new Line2D.Double(5, 210, leftX-5, 210));.drawString("+1", 1, 10);.drawString(" 0", 1, 110);.drawString("-1", 1, 210);

}

}int messageX = 20;int messageY =225;double width = 20;double height;double leftX = 15;double topY;JTextArea rezultat = new JTextArea ();JScrollPane scrollPane2;double [] massivVivod;

}

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

package classWindow;java.awt.*;java.awt.event.*;java.util.*;javax.swing.*;java.text.*;class VvodCifr extends JDialog

{VvodCifr (Frame owner, int kol)

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

k=kol;= new JLabel();.setText(text);= new ArrayList (k);= new double [k];(150, (3+k)*30);contentPane = getContentPane();panel = new InpPanel(VvodCifr.this);.add(panel, BorderLayout.CENTER);.add(label, BorderLayout.NORTH);

}class InpPanel extends JPanel

{InpPanel (final JDialog owner)

{layout = new GridBagLayout ();(layout);constraints = new GridBagConstraints ();(int i = 0; i<k; i++)

{= getConstr(0, i, 1, 1);= new JLabel();.setText("нейрон "+(i+1));(labelNumber, constraints);= getConstr(1, i, 1, 1);sb = new SmallButton ();(sb, constraints);.add(sb);

}panel22 = new UprPanel (owner);= getConstr(0, k+1, 2, 1);(panel22, constraints);

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

{constraint = new GridBagConstraints ();.fill = GridBagConstraints.BOTH;ins = new Insets (1,1,1,1);.insets = ins;.weightx = 100;.weighty = 100;.gridx = x;.gridy = y;.gridwidth = w;.gridheight = h;constraint;

}class SmallButton extends JFormattedTextField

{SmallButton ()

{(new Integer (0));

}

}class UprPanel extends JPanel

{UprPanel (final JDialog owner)

{okButton = new JButton (" Ok ");.addActionListener (new()

{void actionPerformed(ActionEvent event)

{= true;(int i = 0; i<k; i++)

{s = (SmallButton)kartinka.get(i);value = (Number) s.getValue();v = value.doubleValue();[i] = v;

}.setVisible (false);

}

});cancelButton = new JButton ("Cancel");.addActionListener(new()

{void actionPerformed (ActionEvent event)

{.setVisible (false);

}

});(okButton);(cancelButton);

}

}

}void setMessage (String txt)

{.setText(txt);

}boolean showIt ()

{= false;(true);ok;

}double[] getMassiv ()

{massiv;

}JLabel labelNumber;JLabel label;boolean ok;String text = "пусто";ArrayList kartinka;int k;double [] massiv;

}

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!