Как сделать нейронную сеть на java

Обновлено: 03.07.2024

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

Демонстрацию работы нейросети произведем на 4-х разных задачах (и, соответственно, будем использовать 4 разных набора учебных данных):
1) логическая операция XOR
2) три поля
3) горизонтальные и вертикальные линии 3х3
4) квадратные цифры 3х5.

Оглавление:

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

Описание задачи и наборы данных

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

"Правильный ответ" минус "Ответ нейрона" и полученный результат умножить на "Производную функции активации для ответа нейрона".
Ошибка=(Правильный ответ - Ответ нейрона)*Производная функции активации
В коде формула выглядит так:
error [ l ][ i ] =(y[ i ]-N[ l ] [ i ])*N[ l ][ i ]*(1-N [ l ][ i ]),
где N[ l ] [ i ] - значение текущего нейрона,
y[ i ] - правильный ответ из учебного набора

Ошибка нейронов ПРЕДПОСЛЕДНЕГО слоя и ОСТАЛЬНЫХ скрытых слоев рассчитывается по формуле (формула учитывает все ошибки, входящие с последующего слоя):

error[ l ] [ i ] = summator*N[ l ][ i ]*(1-N[ l ][ i ]),
где N[ l ] [ i ] - значение текущего нейрона,
summator - это сумма произведений всех входящих ошибок с последующего слоя на веса связи с текущим нейроном.

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

Логическая операция (или то, или это, но не оба сразу). 4 примера.
Минимальная структура нейросети:
netSize = [ 3,3,1 ]

Определить цвет ячейки по номеру ряда и столбца. 300 примеров.
Минимальная структура нейросети:
netSize = [ 3,6,3 ]

Определить наличие вертикальных и горизонтальных линий в поле 3х3. 24 примера.
Минимальная структура нейросети:
netSize = [ 10. 2 ]


Определить цифру от 9 до 9 в поле 3х5. 10 примеров.
Минимальная структура нейросети:
netSize = [ 16,26,10 ]


Переменные и функции:

Вектор индексов - это самая первая константа, объявленная в коде нашей сети. Она задается до начала обучения, и, при необходимости, эту константу можно изменять с целью подбора оптимальных параметров сети.
Константа "Вектор индексов" задает размер и структуру сети. Каждый элемент обозначает слой.
Число элементов - это количество слоев.
Значение элемента - количество нейронов в слое.
Данный вектор используется для того, чтобы ссылаясь на него, можно было указать адреса элементов основных массивов сети, таких, как:
N (значения нейронов исходя из последнего рассчитанного примера),
error (значения ошибок для каждого нейрона исходя из последнего рассчитанного примера),
w (значения весовых коэффициентов).
Соответственно, вектор индексов netSize используется и при инициализации всех указанных массивов, для того, чтобы определять число слоев, элементов и т.д.
Узнать число слоев в сети можно с помощью команды netSize.length
Узнать число элементов в конкретном слое можно с помощью команды netSize [ l ], где l - индекс слоя.
Посмотреть структуру сети в консоли можно с помощью вспомогательной функции showStructureOfNet ().

В приведенном примере:
Слой 0 - это входные данные: netSize[0]
Если указать в командной строке netSize[0], то ответом будет число 3 - это число элементов в слое 0.
Слой 1 - скрытый слой: netSize[1] //3
Слой 2 - выходные данные: netSize[2] //1

Учебный набор должен включать попарные массивы:
1) ВХОДНЫЕ ДАННЫЕ: число элементов соответствует [0]-му слою, элемент[0]=1
2) ПРАВИЛЬНЫЕ ОТВЕТЫ: число элементов соответствует последнему слою

В 4-х приведенных простых задачах нейросеть учит данные наизусть, поэтому учебный набор равен проверочному

Инициализация трехмерной матрицы весов
Адрес каждого веса между нейроном1 и нейроном2 [l][i][b],
где l - слой нейрона2, i - индекс нейрона2, b - индекс нейрона1

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

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

function drawChart() <
var data = google.visualization.arrayToDataTable(report);
var options = <
title: 'Отчет сети',
curveType: 'function',
legend: < position: 'bottom' >
>;
var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
chart.draw(data, options);
>

по умолчанию в качестве параметра передается проверочная выборка, но можно вручную подставить и другую

Обозначения переменных,
которые используются в циклах:

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

Переменная не объявляется в качестве глобальной и используется в качестве локальной переменной при переборе циклов. Если требуется сослаться на номер элемента в слое или перебрать элементы в слое, то в качестве переменной будем выбирать i. Элемент с индексом 0 в каждом слое является нейроном смещения и всегда равен 1 (кроме последнего слоя, в котором нейрон смещения не используется). Адрес любого нейрона слоя выглядит так: [ l ] [ i ]

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


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

Ключевые слова: нейронные сети, Java, Neuroph, Deeplearning4j

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

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

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

‒ непосредственное описание объектов нейронной сети, таких как нейрон, связь, слой, входы и выходы сети;

‒ представление в конструкциях языка архитектуры сети: связи между слоями, их количество и тип;

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

‒ сохранение и загрузка параметров обученной сети.

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

Java является объектно-ориентированным языком. В данном случае каждый элемент нейронной сети может быть отображен в свой класс [2]. В случае кодирования всех узлов без использования библиотек необходимо создать класс для каждого из них. Далее описываются основные узлы, которые необходимо реализовать.

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

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

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


‒ линейная функция ;


‒ гиперболический тангенс ;


‒ сигмоидная функция .

Начиная с Java версии 1.8 стало возможно объявлять лямбда-функции. Функции такого вида можно передавать как аргументы другой функции, но, самое главное, они могут являться полем класса. В примере далее показывается объявление простейшей линейной функции.

Function function = (x) -> x;

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

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

После создания нейронной сети необходимо провести ее обучение. Обучение производится на тренировочных наборах (сетах) — последовательностях данных, которыми может оперировать нейронная сеть. Обработка тренировочного сета может проходить в несколько этапов — эпох. На каждой из эпох нейронная сеть обрабатывает полный набор данных. Целью обучения является снижение ошибки. Ошибка — величина отражающая расхождение между ожидаемыми и полученными результатами. Ошибка вычисляется каждую эпоху и при успешном обучении должна становиться меньше.

Для вычисления ошибки используются различные способы:


Mean Squared Error (MSE) ;


‒ Root MSE;


‒ Arctan .

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

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

for (int i = 0; i нейронные сети, Java, Neuroph, Deeplearning4j

Похожие статьи

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

Искусственные нейронные сети | Статья в журнале.

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

Распознавание английского текста сверточной нейронной сетью

Сверточная нейронная сеть была впервые предложена Я. Лекуном и Й. Бенгуа [1].

За обозначим количество карт признаков на слое , а за функцию активации рассматриваемого слоя .

В подобной архитектуре нейронной сети принимается нечетным числом, то есть .

Применение технологий нейронных сетей для обработки данных.

нейронная сеть, сеть, функция прогнозирования, FANN, CMS, ANN, пользовательский интерфейс компонента, система управления, функция классификации, компонент.

Модель математической нейронной сети | Статья в журнале.

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

Разработка математической модели нейронной сети

Ключевые слова: модель, нейрон, математика, нейронные сети, основные модели нейронных сетей, нейрон.

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

Эволюционный подход к настройке и обучению нейронной сети

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

Виды архитектур нейронных сетей | Статья в журнале.

нейронная сеть, сеть, эта, нейрон, данные, архитектура, функция активации, искусственная нейронная сеть, искусственный интеллект, искусственный нейрон.

Сравнительный анализ алгоритмов нейронной сети и деревьев.

Искусственная нейронная сеть представляет собойсистемусоединённых и взаимодействующих между собой простыхпроцессоров(искусственных нейронов).

В качестве исходных данных мы используем набор данных из базы ВУЗа.

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

Искусственные нейронные сети | Статья в журнале.

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

Распознавание английского текста сверточной нейронной сетью

Сверточная нейронная сеть была впервые предложена Я. Лекуном и Й. Бенгуа [1].

За обозначим количество карт признаков на слое , а за функцию активации рассматриваемого слоя .

В подобной архитектуре нейронной сети принимается нечетным числом, то есть .

Применение технологий нейронных сетей для обработки данных.

нейронная сеть, сеть, функция прогнозирования, FANN, CMS, ANN, пользовательский интерфейс компонента, система управления, функция классификации, компонент.

Модель математической нейронной сети | Статья в журнале.

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

Разработка математической модели нейронной сети

Ключевые слова: модель, нейрон, математика, нейронные сети, основные модели нейронных сетей, нейрон.

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

Эволюционный подход к настройке и обучению нейронной сети

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

Виды архитектур нейронных сетей | Статья в журнале.

нейронная сеть, сеть, эта, нейрон, данные, архитектура, функция активации, искусственная нейронная сеть, искусственный интеллект, искусственный нейрон.

Сравнительный анализ алгоритмов нейронной сети и деревьев.

Искусственная нейронная сеть представляет собойсистемусоединённых и взаимодействующих между собой простыхпроцессоров(искусственных нейронов).

В качестве исходных данных мы используем набор данных из базы ВУЗа.

Обложка: Сохранение нейронной сети в JSON и другое: обучаем нейронную сеть на JavaScript

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

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

Сегодня нейронные сети популярны как никогда. Свои решения в этой области представляют такие компании, как Google, Microsoft и многие другие. Но существуют и библиотеки с открытым кодом, написанные энтузиастами на самых разных языках. Сегодня tproger расскажет вам об одной из них — это библиотека brain, написанная на JavaScript.

Использование

Самый простой пример применения — обучение на функции XOR:

А еще есть очень классная визуализация того, как нейронная сеть обучается XOR, OR и другим логическим функциям.

Чтобы установить библиотеку, можно использовать, например, npm:

npm install brain

Можно также скачать последнюю версию brain.js. Тренировать сеть можно даже оффлайн, а затем уже натренированную загрузить на сайт.

Senior Frontend Developer

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

Каждая модель для обучения должна иметь параметры input и output , каждый из которых составляет массив или хэш чисел от 0 до 1. Например, для демо с распознаванием контрастности цветов это выглядело так:

Функция train() умеет принимать в качестве второго аргумента массив нескольких параметров:

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

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

learningRate — параметр, определяющий, как быстро натренируется нейронная сеть. Задается он числом от 0 до 1. Чем меньше параметр, тем дольше сеть будет обучаться. С увеличением числа скорость будет расти, но вместе с этим растет вероятность более плохого качества обучения. По умолчанию это число составляет 0.3.

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

Обученную сеть можно хранить в формате JSON:

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

NeuralNetwork() принимает ассоциативный массив параметров:

Первый параметр — общее количество скрытых слоев и размер каждого слоя. Например, если нужно два скрытых слоя — один с 3 нодами и второй с 4, то параметр будет таким:

hiddenLayers: [3, 4]

По умолчанию brain использует один слой, пропорциональный размеру входного массива.

Кстати, сеть может использовать WriteStream. Ее можно тренировать, используя pipe() , чтобы отправлять данные в сеть.

Чтобы тренировать сеть в потоке, сначала нужно поток создать вызовом метода net.createTrainStream() , принимающего следующие параметры:

  • floodCallback() — функция, которая будет вызываться на каждой итерации обучения;
  • doneTrainingCallback(info) — функция, которая выполнится после завершения обучения. Параметр info будет содержать ассоциативный массив информации о том, как прошло обучение:

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

Вы программист на Java и хотите начать или практиковаться в машинном обучении?

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

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

Среды

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

Вайкато среда для анализа знаний(Weka) - платформа машинного обучения, разработанная Университетом Вайкато, Новая Зеландия. Он написан на Java и предоставляет графический интерфейс пользователя, интерфейс командной строки и API Java. Это, пожалуй, самая популярная библиотека машинного обучения на Java и отличное место для начала или практики машинного обучения.


KNIME

Констанц Информационный Шахтер(KIME) - платформа аналитики и отчетности, разработанная Университетом Констанц, Германия. Он был разработан с упором на фармацевтические исследования, но расширился до общей бизнес-аналитики. Он предоставляет графический интерфейс пользователя (на основе Eclipse) и API Java.


RapidMiner


Среда для KDD-приложений DeveLoping, поддерживаемая Index-Structures(ELKI) - это верстак для интеллектуального анализа данных, разработанный на Java Университетом Людвига Максимилиана в Мюнхене, Германия. Он сосредоточен на работе с данными в реляционной базе данных для таких задач, как обнаружение и классификация выбросов (методы, основанные на дистанционных функциях). Он обеспечивает мини-графический интерфейс, интерфейс командной строки и Java API.


Библиотеки

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

Java-ML

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

Инструмент статистического анализа Java(JSAT) предоставляет чистые реализации Java стандартных алгоритмов машинного обучения для задач небольшого размера. Автор комментирует, что он разработал библиотеку частично как упражнение для самообразования и частично для достижения цели. Тем не менее список алгоритмов впечатляет. Он включает методы классификации, регрессии, ансамбля, кластеризации и выбора признаков.

Большие данные

В этом разделе перечислены проекты Java, предназначенные для использования с большими данными, например на кластерах машин.

Mahout (Hadoop)

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

MLlib (Spark)

Библиотека машинного обучения Apacheпредоставляет реализации алгоритмов машинного обучения для использования на платформе Apache Spark (HDFS, но не map-Reduce). Хотя Java, библиотека и платформа поддерживают привязки Java, Scala и Python. Библиотека новая и список алгоритмов короткий, но быстро растущий.

Массивный онлайн анализ(MOA) - платформа с открытым исходным кодом, разработанная Университетом Вайкато, Новая Зеландия, для интеллектуального анализа потоков данных. Как и Weka (разработанный там же), он предоставляет графический интерфейс, интерфейс командной строки и Java API. В нем представлен длинный список алгоритмов с акцентом на классификацию и поддержку обнаружения выбросов и устранения дрейфа концепций. МОА используетУсовершенствованная система интеллектуального анализа данных и машинного обучения(ADAMS) для управления рабочими процессами также разработаны в том же месте.

САМОА

Масштабируемый расширенный массовый онлайн-анализ(SAMOA) - это система машинного обучения с распределенной потоковой передачей, разработанная Yahoo !. Он предназначен для работы на Apache Storm и Apache S4. Система может использовать алгоритмы, предоставленные проектом MOA для таких задач, как классификация

Обработка естественного языка

Этот раздел посвящен библиотекам и проектам Java для решения проблем из подполя машинного обучения, называемого Natural Language Processing (NLP).

НЛП - это не моя область, поэтому я просто укажу на ключевые библиотеки.

  • OpenNLP:Apache OpenNLPпредставляет собой инструментарий для обработки текста на естественном языке. Он предоставляет методы для задач NLP, таких как токенизация, сегментация и извлечение сущностей.
  • LingPipe:LingPipeпредставляет собой инструментарий для компьютерной лингвистики и включает в себя методы классификации тем, выделения сущностей, кластеризации и анализа настроений.
  • ВОРОТА:Общая архитектура для текстовой инженерии(GATE) - библиотека с открытым исходным кодом для обработки текста. Это предоставляет множество подпроектов, нацеленных на различные варианты использования.
  • колотушка:Машинное обучение для языкового инструментария(MALLET) - это инструментарий Java для статистической обработки естественного языка, классификации документов, кластеризации, моделирования тем и извлечения информации.

Компьютерное зрение

В этом разделе перечислены эти библиотеки для подполя машинного обучения, который называется Computer Vision (CV).

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

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

Глубокое обучение

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

  • Encog:Encogэто библиотека машинного обучения, которая предоставляет такие алгоритмы, как SVM, классические нейронные сети, генетическое программирование, байесовские сети, HMM и генетические алгоритмы.
  • Deeplearning4j:Deeplearning4jзаявлено, что это библиотека глубокого обучения коммерческого уровня, написанная на Java. Он описывается как совместимый с Hadoop и предоставляет алгоритмы, включающие в себя машины с ограниченным Больцманом, сети глубокого доверия и автоматические энкодеры с накоплением в денуазе.

Резюме

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

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

public class NNMethod extends EmptyFcastMethod implements PropertyChangeListener

private Trainer tr = new Trainer();

private NumberFormat nf = NumberFormat.getNumberInstance();

private NumberFormat nf2 = NumberFormat.getNumberInstance();

private int historyCount = 10;

private TrainProgressDialog dlg = new TrainProgressDialog();

private double[][] diffs = null;

private double[][] res = null;

private double[] difmuls = null;

IFunction fn = new ThSigmoid();

tr.getNetwork().getLayerAt( 0 ).setOutCount( 10 );

for ( int i = 1; i

tr.getNetwork().getLayerAt( i ).setFn( fn );

tr.getNetwork().getLayerAt( i ).setOutCount( 10 );

private void loadProps()

DM dm = DM.getInstance();

PrefVO pref = dm.findPrefByName( "forecast.nn.initialSpeed" );

if ( pref.getValue() != null )

tr.setInitialSpeed( Double.parseDouble( pref.getValue() ) );

> catch ( NumberFormatException ex )

pref = dm.findPrefByName( "forecast.nn.stopError" );

if ( pref.getValue() != null )

tr.setStopError( Double.parseDouble( pref.getValue() ) );

> catch ( NumberFormatException ex )

pref = dm.findPrefByName( "forecast.nn.stopIteration" );

if ( pref.getValue() != null )

tr.setStopIteration( Integer.parseInt( pref.getValue() ) );

> catch ( NumberFormatException ex )

pref = dm.findPrefByName( "forecast.nn.speedDecrement" );

if ( pref.getValue() != null )

tr.setSpeedDecrement( Double.parseDouble( pref.getValue() ) );

> catch ( NumberFormatException ex )

private void saveProps()

DM dm = DM.getInstance();

PrefVO pref = dm.findPrefByName( "forecast.nn.initialSpeed" );

pref = dm.findPrefByName( "forecast.nn.stopError" );

pref = dm.findPrefByName( "forecast.nn.stopIteration" );

pref = dm.findPrefByName( "forecast.nn.speedDecrement" );

> catch ( DBException ex )

System.err.println( "cannot save forecast parameters" );

public void prepare()

private void addSamples()

int outsize = diffs[0].length;

int insize = outsize * historyCount;

for ( int i = historyCount; i

double[] x = new double[insize];

for ( int j = 1; j

for ( int k = 0; k

x[ ( j - 1 ) * outsize + k] = diffs[i - j][k];

double[] y = new double[outsize];

for ( int j = 0; j

ArraySample sample = new ArraySample( x, y );

private void initTrainer()

int outsize = diffs[0].length;

int insize = outsize * historyCount;

int midsize = outsize + ( int ) Math.sqrt( insize ) * 2;

tr.getNetwork().getLayerAt( 0 ).setInCount( insize );

tr.getNetwork().getLayerAt( 0 ).setOutCount( midsize );

int lcount = tr.getLayersCount();

for ( int i = 1; i

tr.getNetwork().getLayerAt( i ).setInCount( midsize );

tr.getNetwork().getLayerAt( i ).setOutCount( midsize );

tr.getNetwork().getLayerAt( lcount - 1 ).setInCount( midsize );

tr.getNetwork().getLayerAt( lcount - 1 ).setOutCount( outsize );

private void prepareDiffs()

diffs = new double[m.length - 1][];

difmuls = new double[m[0].length];

for ( int i = 0; i

diffs[i] = new double[m[i + 1].length];

for ( int j = 0; j

diffs[i][j] = m[i + 1][j] - m[i][j];

if ( Math.abs( diffs[i][j] ) > difmuls[j] )

difmuls[j] = Math.abs( diffs[i][j] );

for ( int i = 0; i

for ( int j = 0; j

public void calc() throws FcastException

int lcount = tr.getLayersCount();

for ( int i = 0; i

tr.getNetwork().getLayerAt( i ).reinit();

//Подготавливаем к запуску

private void cleanResult()

int fcount = getFcastValue() / fixedStep;

double step = ( max - min ) / m.length;

res = new double[m.length + fcount][regions.length * 2 + 1];

//Заполнение по статистике

//Заполнение по прогнозу

> catch ( NoLayersException ex )

> catch ( SizesMismatchException ex )

private void initialFill( double step )

for ( int i = 0; i

double t = min + i * step;

for ( int j = 0; j

int rccount = regions[j].getArraysCount();

res[i][j * 2 + 1] = m[i][k];

res[i][j * 2 + 2] = m[i][k];

private void statFill( double step ) throws NoLayersException, SizesMismatchException

int incount = tr.getInputCount();

int outcount = tr.getOutputCount();

for ( int i = historyCount; i

double t = min + i * step;

for ( int j = 0; j

int rccount = regions[j].getArraysCount();

res[i][j * 2 + 1] = m[i][k];

double[] x = new double[incount];

for ( int iback = 1; iback

x[ ( iback - 1 ) * outcount + k] = diffs[i - iback][k];

double[] y = new double[outcount];

for ( int iback = 0; iback

ArraySample sample = new ArraySample( x, y );

double[] outs = tr.getNetwork().getLayerAt( tr.getLayersCount() - 1 ).getOuts();

for ( int j = 0; j

int rccount = regions[j].getArraysCount();

res[i][j * 2 + 2] = outs[k] * difmuls[k] + m[i - 1][k];

private void fcastFill( double step ) throws NoLayersException, SizesMismatchException

Читайте также: