Запуск искусственной нейронной сети на Arduino Uno

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

Хотя мы использовали Uno в этом примере сеть также может работать на Nano, Mega или Leonardo.

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

Предыстория искусственных нейронных сетей

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

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

Так что же такое искусственная нейронная сеть? Короче говоря, искусственная нейронная сеть – это сегмент кода, который учится реагировать на входные данные на основе примеров наборов входных и выходных данных. Они являются очень мощными инструментами и быстро находят свое место в распознавании лиц, автономных транспортных средствах, прогнозах на фондовом рынке и спорте и даже в веб-сайтах, предлагающих продукты, которые могут вас заинтересовать. Их самое мощное применение – распознавание образов, где точное вход в сеть неизвестен. Информации может быть слишком мало или слишком много, и сеть решает, как она будет обрабатываться. Хороший пример применения искусственной нейронной сети – распознавание почерка. Мы можем распознавать буквы и цифры, но точная форма символов варьируется от человека к человеку, поэтому вход в нейронную сеть никогда точно не известен. Нейронная сеть должна идентифицировать ввод и связывать его с соответствующим выводом..

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

Один из ключевых принципов в искусственном нейроне. сеть заключается в том, что сеть нужно обучать. Когда сеть настроена, к каждому из соединений применяются случайные веса. Эти веса служат отправной точкой для сети, но почти всегда дают «мусор». Набор образцов данных вводится в сеть, и результаты сравниваются с ожидаемыми результатами. Затем веса корректируются и цикл ввода/вывода повторяется. Этот цикл обучения повторяется до тех пор, пока выходные данные из сети не совпадут с ожидаемыми выходными данными с определенным уровнем точности. Обычно это занимает несколько десятков тысяч циклов обучения в зависимости от сложности данных и сети.

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

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

Входные и выходные данные обучения :

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

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

Что вам нужно для вашей искусственной нейронной сети на основе Arduino

  • Arduino (Uno используется в этом руководстве) – купите здесь

Как создать искусственную нейронную сеть на основе Arduino

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

Понимание кода

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

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

Вот краткое изложение операции кода:

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

Загрузка файла Код

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

Вот код:

//Автор  : Ральф Хеймсфельд//28.06.2018 # include /*******************************  ********************************* * Конфигурация сети - индивидуальная для каждой сети *********  *************************************************  *******/const int PatternCount = 10; const int InputNodes = 7; const int HiddenNodes = 8; const int OutputNodes = 4; const float LearningRate = 0,3; const float Momentum = 0,9; const float InitialWeightMax = 0,5;  const float Успех = 0. 0004; константный байт Input [PatternCount] [InputNodes] = {{1, 1, 1, 1, 1, 1, 0},//0 {0, 1, 1, 0, 0, 0, 0},// 1 {1, 1, 0, 1, 1, 0, 1},//2 {1, 1, 1, 1, 0, 0, 1},//3 {0, 1, 1, 0, 0,  1, 1},//4 {1, 0, 1, 1, 0, 1, 1},//5 {0, 0, 1, 1, 1, 1, 1},//6 {1, 1  , 1, 0, 0, 0, 0},//7 {1, 1, 1, 1, 1, 1, 1},//8 {1, 1, 1, 0, 0, 1, 1}//9};  const byte Target [PatternCount] [OutputNodes] = {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}  , {0, 1, 0, 0}, {0, 1, 0, 1}, {0, 1, 1, 0}, {0, 1, 1, 1}, {1, 0, 0, 0}  , {1, 0, 0, 1}};/************************************  **************************** * Завершить настройку сети *****************  ***********************************************/ int i, j, p, q, r; int ReportEvery1000; int RandomizedIndex [PatternCount]; long TrainingCycle; float Rando; float Error; float Accum; float Hidden [HiddenNodes]; float Output [OutputNodes]; float HiddenWeights [InputNodes + 1  ] [HiddenNodes]; float OutputWeights [HiddenNodes + 1] [OutputNodes]; float HiddenDelta [HiddenNodes]; float OutputDelta [OutputNodes]; float ChangeHiddenWeights [InputNodes + 1] [HiddenNodes]; float ChangeOutputWeights [HiddenNodes];  void setup () {Serial.begin (9600);  randomSeed (analogRead (3));  ReportEvery1000 = 1;  для (p = 0; p  Скрытые веса ************************  *****************************************/для (i = 0; i   Выходные веса ***********************  *****************************************/для (i = 0;  i  

Код также можно загрузить по этой ссылке: ArtificialNeuralNetwork

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

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

  • PatternCount - количество элементов/строка обучения данные в вашей таблице.
  • InputNodes - количество нейронов, связанных с входными данными.
  • Output Nodes - количество нейронов, связанных с выходными данными.

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

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

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

Стоит отметить, что данные обучения и конфигурация сети, представленные в этом примере, касаются настолько большой, насколько вы можете запустить на Arduino Uno, не превышая его 2K SRAM. Если вы хотите поэкспериментировать с большей сетью, вам понадобится плата Arduino с большим выделением SRAM, например Mega. К сожалению, IDE или Arduino не предупреждают, что если выделение превышено, вы будете продолжать получать странные результаты, и сеть не сможет обучаться.

Препятствие, предотвращающее запуск робота A Нейронная сеть

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

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

Это действительно впечатляющее зрелище. .

Код несколько сложнее, чем в этом примере, из-за сложности проекта, но он довольно хорошо разбит. Вы можете скачать код по этой ссылке - Neural Network Robot

What To Try Next

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

  • Добавьте ЖК-дисплей или TFT-дисплей к вашему Arduino и отправьте обучающие или выходные данные на дисплей, а не на ваш последовательный монитор.
  • Разработайте сеть, которая реагирует на входные данные Arduino. Например, вы можете использовать физические переключатели или фоторезисторы на входах Arduino, чтобы активировать входные узлы и управлять «обученным» выходом.
  • Используйте сеть для управления выходами на вашем Arduino. Добавьте двигатель или сервопривод к вашему Arduino, который использует нейронную сеть для ответа на входные данные. Например, вы можете сделать экран с сервоприводом, который закрывает Arduino, когда свет падает на фоторезистор.

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

Поделитесь этим:

  • Нажмите, чтобы поделиться в Facebook (Открывается в новом окне)
  • Нажмите, чтобы поделиться в Pinterest (Открывается в новом окне)
  • Нажмите, чтобы поделиться в Twitter (открывается в новом окне)
  • Нажмите, чтобы распечатать (открывается в новом окне)

Похожий

Оцените статью
futurei.ru
Добавить комментарий