Сколько скрытых слоев может присутствовать в нейросети
Перейти к содержимому

Сколько скрытых слоев может присутствовать в нейросети

  • автор:

Оптимальное количество нейронов/слоев

Потиху изучаю нейронные сети. Принцип я понял, основные понятия вроде бы уловил. Даже самый простой прототипчик написал. Но вот какой вопрос у меня появился: Я вижу, что моя нейронная сеть недостаточно умна, сколько ни обучай, и понимаю, что нужно увеличить количество нейронов. Но каким образом мне увеличивать их количество? Увеличить количество на слое, или же увеличить количество слоёв? (Понятное дело, это нужно подбирать экспериментально, но из-за отсутствия опыта я не могу ссылаться на свои наблюдения как на валидные, а вопрос мучает уже сейчас). Если я правильно понимаю, можно представить аналогию с обработкой изображения: a) Допустим, мы изначально работали только с бинарного вида изображением. Ну, белый/чёрный пиксель. А потом хотим обрабатывать обычное черно-белое изображение (или цветное). Количество входных нейронов может не увеличиться, но мы-то понимаем, что усложнился один шаг, и поэтому можем добавить дополнительные нейроны в существующий слой. b) Мы хотим выделять резкие границы на изображении. Понятное дело, тут уже будет гораздо больше шагов, а не один объемный. Тут сначала нужно сделать из цветного изображения черно-белое, потом, к примеру, взять квадрат цвета, ну или что-то подобное, словом, задача не в один шаг. И тут мы уже увеличиваем именно количество слоёв в сети. Верен ли мой ход мысли? Может есть какие-то более конкретные сведения на эту тему, которые я упустил/не нашёл? P.S. ибо стала задача сделать ИИ для простенькой логической игры, и захотелось попробовать заставить компьютер обучаться, играя против компьютера. А так как процесс не быстрый, пытаюсь прикинуть необходимое количество слоёв сети для ИИ этой игры. Сам я пока что расцениваю сложность в пару скрытых слоёв, опираясь лишь на интуицию и примерный ход мыслей человека, играющего в это.

  • нейронные-сети
  • машинное-обучение
  • искусственный-интеллект

Отслеживать
задан 16 мар 2018 в 21:29
4,439 8 8 серебряных знаков 20 20 бронзовых знаков
19 мар 2018 в 13:08
@MaxU угу, и правда подобный. Странно, что я не нашёл его. Буду разбираться.
19 мар 2018 в 21:37

0

Сортировка: Сброс на вариант по умолчанию

Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.

  • нейронные-сети
  • машинное-обучение
  • искусственный-интеллект
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8412

Сколько скрытых слоев и скрытых узлов необходимо в нейронной сети?

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

Резюмируем информацию скрытых слоях

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

  • Перцептроны, состоящие только из входных узлов и выходных узлов (называемые однослойными перцептронами), не очень полезны, потому что они не могут аппроксимировать сложные связи вход-выход, которые характеризуют многие типы реальных явлений. Более конкретно, однослойные перцептроны ограничены линейно разделимыми задачами. Как мы видели в седьмой статье («Продвинутое машинное обучение с многослойным перцептроном»), даже такая базовая функция, как логическая функция «исключающее ИЛИ» (XOR), не является линейно разделимой.
  • Добавление скрытого слоя между входным и выходным слоями превращает перцептрон в универсальный аппроксиматор, что, по сути, означает, что он способен захватывать и воспроизводить чрезвычайно сложные связи вход-выход.
  • Наличие скрытого слоя делает обучение немного более сложным, потому что весовые коэффициенты между входным и скрытым слоями косвенным образом влияют на конечную ошибку (этот термин я использую для обозначения разницы между выходным значением нейросети и целевым значением, заданным обучающими данными).
  • Методика, которую мы используем для обучения многослойного перцептрона, называется обратным распространением: мы распространяем конечную ошибку обратно в сторону входа нейросети таким образом, который позволяет нам эффективно изменять веса, которые не подключены непосредственно к выходному узлу. Процедура обратного распространения является расширяемой, т.е. та же самая процедура позволяет нам обучать веса, связанные с произвольным числом скрытых слоев.

Следующая диаграмма обобщает базовую структуру многослойного перцептрона.

Рисунок 1 Многослойная нейронная сеть перцептрон, или MLP (multilayer perceptron)

Сколько скрытых слоев?

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

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

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

Рисунок 2 Переобученная нейросеть

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

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

Рисунок 3 Хорошо обученная нейросеть

Итак, когда нам действительно нужно несколько скрытых слоев? Я не могу дать вам никаких рекомендаций из личного опыта. Лучшее, что я могу сделать, это передать опыт доктора Джеффа Хитона (смотрите страницу 158 текста по ссылке), который утверждает, что один скрытый слой позволяет нейронной сети аппроксимировать любую функцию, включающую «непрерывное преобразование из одного конечного пространства в другое».

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

Сколько скрытых узлов?

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

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

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

Заключение

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

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

Нейронные сети, перцептрон

Искусственная нейронная сеть (ИНС) (англ. Artificial neural network (ANN)) — упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.

Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом [1] . В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть [2] , а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.

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

Структура нейронной сети

Рисунок 2. Схема искусственного нейрона

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

Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон — это такая функция [math]\mathbb^n \rightarrow \mathbb[/math] , которая преобразует несколько входных параметров в один выходной.

Как видно на рисунке справа, у нейрона есть [math]n[/math] входов [math]x_i[/math] , у каждого из которого есть вес [math]w_i[/math] , на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы [math]x_i \cdot w_i[/math] направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют [math]net[/math] . Таким образом, [math]net = \sum_^ w_i \cdot x_i = w^T \cdot x[/math] .

Просто так передавать взвешенную сумму [math]net[/math] на выход достаточно бессмысленно — нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют функцию активации, которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается [math]\phi(net)[/math] . Таким образом, выходов искусственного нейрона является [math]\phi(net)[/math] .

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

  • Функция единичного скачка. Если [math]net \gt threshold[/math] , [math]\phi(net) = 1[/math] , а иначе [math]0[/math] ;
  • Сигмоидальная функция. [math]\phi(net) = \frac[/math] , где параметр [math]a[/math] характеризует степень крутизны функции;
  • Гиперболический тангенс. [math]\phi(net) = tanh(\frac)[/math] , где параметр [math]a[/math] также определяет степень крутизны графика функции;
  • Rectified linear units (ReLU). [math]ReLU(x) = \begin x & x \geq 0 \\ 0 & x \lt 0 \end = \max(x, 0)[/math] .

Виды нейронных сетей

Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.

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

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

Рисунок 3. Схема однослойной нейронной сети

Однослойная нейронная сеть (англ. Single-layer neural network) — сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.

Как видно из схемы однослойной нейронной сети, представленной справа, сигналы [math]x_1, x_2, \ldots x_n[/math] поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число — вес соответствующей связи.

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

Рисунок 4. Схема многослойной нейронной сети

Многослойная нейронная сеть (англ. Multilayer neural network) — нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.

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

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

Сети прямого распространения

Сети прямого распространения (англ. Feedforward neural network) (feedforward сети) — искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.

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

Однако сигнал в нейронных сетях может идти и в обратную сторону.

Сети с обратными связями

Рисунок 5. Схема сети с обратными связями

Сети с обратными связями (англ. Recurrent neural network) — искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.

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

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

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

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

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

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

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

Тестовая выборка — конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.

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

Перцептрон

Рисунок 6. Схема перцептрона

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

История

Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его «перцептроном» (от латинского perceptio — восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер — «Марк-1», который был способен распознавать некоторые буквы английского алфавита.

Таким образом перцептрон является одной из первых моделей нейросетей, а «Марк-1» — первым в мире нейрокомпьютером.

Описание

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

Принцип работы перцептрона следующий:

  1. Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен 0), либо в состоянии возбуждения (сигнал равен 1);
  2. Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только -1, 0 или 1;
  3. Затем сигналы от сенсорных элементов, прошедших по S-A связям, попадают в A-элементы, которые еще называют ассоциативными элементами;
    • Одному A-элементу может соответствовать несколько S-элементов;
    • Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог ​ [math]\theta[/math] ​, то этот A-элемент возбуждается и выдает сигнал, равный 1;
    • В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал;
  4. Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса (которые уже могут принимать любые значения, в отличие от S-A связей);
  5. R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем
    • если превышен определенный порог, генерирует выходной сигнал, равный 1;
    • eсли порог не превышен, то выход перцептрона равен -1.

Для элементов перцептрона используют следующие названия:

  • S-элементы называют сенсорами;
  • A-элементы называют ассоциативными;
  • R-элементы называют реагирующими.

Классификация перцептронов

Рисунок 7. Схема однослойного перцептрона

Перцептрон с одним скрытым слоем (элементарный перцептрон, англ. elementary perceptron) — перцептрон, у которого имеется только по одному слою S, A и R элементов.

Однослойный персептрон (англ. Single-layer perceptron) — перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес 1, а порог любого А-элемента равен 1. Часть однослойного персептрона соответствует модели искусственного нейрона.

Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный +1, а порог A элементов равен 1. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон — это искусственный нейрон, который на вход принимает только 0 и 1.

Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.

Многослойный перцептрон по Розенблатту (англ. Rosenblatt multilayer perceptron) — перцептрон, который содержит более 1 слоя А-элементов.

Многослойный перцептрон по Румельхарту (англ. Rumelhart multilater perceptron) — частный случай многослойного персептрона по Розенблатту, с двумя особенностями:

  • S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;
  • Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.

Обучение перцептрона

Задача обучения перцептрона — подобрать такие [math]w_0, w_1, w_2, \ldots, w_n[/math] , чтобы [math]sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))[/math] как можно чаще совпадал с [math]y(x)[/math] — значением в обучающей выборке (здесь [math]\sigma[/math] — функция активации). Для удобства, чтобы не тащить за собой свободный член [math]w_0[/math] , добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что [math]x = (1, x_1, x_2, \ldots, x_n)[/math] . Тогда [math]w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n[/math] можно заменить на [math]w^T \cdot x[/math] .

Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать градиентным спуском. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый критерий перцептрона: [math]E_P(w) = -\sum_ y(x)(\sigma(w^T \cdot x))[/math] , где [math]M[/math] — множество примеров, которые перцептрон с весами [math]w[/math] классифицирует неправильно.

Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на [math]y(x)[/math] здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ −1, значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.

Теперь [math]E_P(w)[/math] можно оптимизировать градиентным спуском. На очередном шаге получаем: [math]w^ = w^ − \eta\triangledown_w E_P(w)[/math] .

Алгоритм такой — мы последовательно проходим примеры [math]x_1, x_2, \ldots[/math] из обучающего множества, и для каждого [math]x_n[/math] :

  • если он классифицирован правильно, не меняем ничего;
  • а если неправильно, прибавляем [math]\eta \triangledown_w E_P(w)[/math] .

Ошибка на примере [math]x_n[/math] при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется — правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.

Применение

  • Решение задач классификации, если объекты классификации обладают свойством линейной разделимости;
  • Прогнозирование и распознавание образов;
  • Управление агентами [3] .

Примеры кода

Пример использования с помощью scikit-learn [4]

Будем классифицировать с помощью перцептрона датасет MNIST [5] .

# Load required libraries from sklearn import datasets from sklearn.preprocessing import StandardScaler from sklearn.linear_model import Perceptron #Single-layer perceptron from sklearn.neural_network import MLPClassifier #Multilayer perceptron from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import numpy as np
# Load the mnist dataset mnist = datasets.load_digits()
# Create our X and y data n_samples = len(mnist.images) X = mnist.images.reshape((n_samples, -1)) y = mnist.target
# Split the data into 70% training data and 30% test data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# Train the scaler, which standarizes all the features to have mean=0 and unit variance sc = StandardScaler() sc.fit(X_train)
# Apply the scaler to the X training data X_train_std = sc.transform(X_train)
# Apply the SAME scaler to the X test data X_test_std = sc.transform(X_test)
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1 ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0) # Create a multilayer perceptron object mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(256, 512, 128), random_state=1)
# Train the perceptrons ppn.fit(X_train_std, y_train) mppn.fit(X_train_std, y_train)
# Apply the trained perceptrons on the X data to make predicts for the y test data y_pred = ppn.predict(X_test_std) multi_y_pred = mppn.predict(X_test_std)
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations) print('Single-layer perceptron accuracy: %.4f' % accuracy_score(y_test, y_pred)) print('Multilayer perceptron accuracy: %.4f' % accuracy_score(y_test, multi_y_pred))
Single-layer perceptron accuracy: 0.9574 Multilayer perceptron accuracy: 0.9759
Пример использования с помощью tensorflow [6]

Будем классифицировать цифры из того же датасета MNIST.

# Load required libraries import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data
#Load MNIST dataset mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
#placeholder for test data x = tf.placeholder(tf.float32, [None, 784]) #placeholder for weights and bias W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10])) #tensorflow model y = tf.nn.softmax(tf.matmul(x, W) + b) #loss function y_ = tf.placeholder(tf.float32, [None, 10]) cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
#gradient descent step train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict=) correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) print("Accuracy: %s" % sess.run(accuracy, feed_dict=))

Рисунок 8.
Правильные метки — 5, 4, 9, 7.
Результат классификации — 6, 6, 4, 4.

Accuracy: 0.9164

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

Пример на языке Java

Пример классификации с применением weka.classifiers.functions.MultilayerPerceptron [7]

 nz.ac.waikato.cms.weka weka-stable 3.8.0  
import weka.classifiers.functions.MultilayerPerceptron; import weka.core.converters.CSVLoader; import java.io.File;
// read train & test datasets and build MLP classifier var trainds = new DataSource("etc/train.csv"); var train = trainds.getDataSet(); train.setClassIndex(train.numAttributes() - 1); var testds = new DataSource("etc/test.csv"); var test = testds.getDataSet(); test.setClassIndex(test.numAttributes() - 1); var mlp = new MultilayerPerceptron(); mlp.buildClassifier(train); // Test the model var eTest = new Evaluation(train); eTest.evaluateModel(mlp, test); // Print the result à la Weka explorer: var strSummary = eTest.toSummaryString(); System.out.println(strSummary);

См. также

  • Сверточные нейронные сети
  • Рекуррентные нейронные сети
  • Рекурсивные нейронные сети [на 28.01.19 не создан]

Примечания

  1. ↑Artificial neuron, Wikipedia
  2. ↑Perceptron, Wikipedia
  3. ↑Применения перцептрона, Wikipedia
  4. ↑Библиотека scikit-learn для Python
  5. ↑Датасет MNIST
  6. ↑Библиотека tensorflow для Python
  7. ↑Weka, MLP

Источники информации

  • Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.
  • Нейронные сети — учебник

Искусственные нейронные сети. Часть 2

В этой части мы изучим принципы работы нейронных сетей и напишем нейронную сеть из 2 слоев.

Нейронные сети состоят из связанных между собой нейронов.

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

Нейронные сети делятся на слои:

  1. Входной слой
  2. Скрытые слои
  3. Выходной слой

Скрытые слои это слои между входным и выходным, количество скрытых слоев может быть любым.

Мы напишем нейронную сеть из 2 слоев, входного и выходного слоев.

Вначале разберем принципы работы нейронных сетей.

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

Схема нейронной сети из 3 слоев с 2 нейронами на входе, 3 скрытыми, 1 выходным будет выглядеть так

Такая связь между слоями называется, прямой связью.

В итоге у нас получилось 3 слоя и 6 нейронов.

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

Схема для нашей нейронной сети

Создадим файл NeuronNet.py

Подключим класс нейрона который писали в прошлой части:

from Neuron import *

Опишем в файле класс NeuronNet и конструктор для него:

class NeuronNet: def __init__(self): self.n = [] for i in range(3): self.n.append(Neuron(2))

В конструкторе класса создается массив из объектов класса Neuron размером в 3 нейрона. Нейрону передаем в параметры число 2, так как входов для всех нейронов будет по 2.

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

def activate(self, inputs): return self.n[2].activate(np.array([self.n[0].activate(inputs), self.n[1].activate(inputs)]))

В итоге у нас получился класс NeuronNet. Который мы записали в файл NeuronNet.py.

Полное содержание NeuronNet.py:

from Neuron import * class NeuronNet: def __init__(self): self.n = [] for i in range(3): self.n.append(Neuron(2)) def activate(self, inputs): return self.n[2].activate(np.array([self.n[0].activate(inputs), self.n[1].activate(inputs)]))

Теперь создадим файл main.py, чтобы проверить работоспособность нашей нейронной сети.

Подключим к файлу main.py библиотеку numpy и наш файл NeuronNet.py:

import numpy as np from NeuronNet import *

Создадим объект нейронной сети:

net = NeuronNet()

Объявим массив с входными данными и передадим его в нейронную сеть:

x = np.array([1, 2]) print(net.activate(x))

Полное содержание файла:

import numpy as np from NeuronNet import * net = NeuronNet() x = np.array([1, 2]) print(net.activate(x))

Теперь запустим наш код. Введем в консоль:

python main.py

Запустим еще раз

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

  1. Узнали принципы работы нейронных сетей
  2. Выучили принципы связи нейронов в нейронных сетях
  3. Написали класс NeuronNet на языке программирования python
  4. Запустили свою первую нейронную сеть

В следующей части мы реализуем обучение нашей нейронной сети.

Если остались вопросы после чтения статьи, задайте их в комментариях.

  • нейоросеть
  • нейронные сети
  • нейронная сеть
  • нейронная сеть с нуля
  • machine learning
  • нейросети
  • искусственный интеллект
  • ai
  • ии
  • машинное обучение
  • Python
  • Искусственный интеллект

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *