Разработка «Универсальной» Библиотеки Для Создания Нейросети (Начало)



Фон Я, простой смертный, даже не думал об ИИ как об универсальном помощнике, спокойно программировал для автоматизированных рабочих мест (С/С++), и всё было бы хорошо, если бы не одно НО.

Однажды я встретил человека на форуме, посвящённом теме кодирования для AWS, он довольно долго мне многое объяснял, помогал, + сам делал много интересного.

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

тест Тьюринга более одного раза».

.

Я, конечно, как вполне адекватный человек не поверил, потому что.

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

С тех пор прошло несколько лет, и тема его ИИ поднималась не раз.

Хотя мне так и не удалось получить прототип, и я не уверен на 100%, что он у него вообще есть, но это и не важно, т.к.

Каждый наш разговор давал мне идею персонализировать мой ИИ.



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

Когда я выбрал за основу свой любимый C/C++, друг сказал мне, что «Ваш интеллект обычно не пишется локально, и для этого нужно выбрать заявленный язык».

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

Так был выбран язык C/C++.

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

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

Было, конечно, еще одно НО, об этом позже.

Итак была поставлена задача написать свою собственную библиотеку.



Идти
Я выбрал среду Рад Студия , испытывая тонны ненависти, попробую объяснить: Мне нужен быстрый форм-шлеп для проверки, чтобы не тратить много времени на интерфейс Нам нужна была простота перехода на Delphi, потому что.

многие знакомые выбрали его основным языком, и Рад Студия это для него основная среда Я не собирался сильно прибивать код к VCL для более простого переноса на gcc, MS VS. Я постараюсь использовать минимальный набор инструментов для облегчения кроссплатформенного портирования.

Итак, базовая структура каждой сети такова:

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

В голову сразу пришла идея - Занятия, но немного подумав, взвесив все за и против, пришлось от них отказаться.

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

Для этого были выбраны связанные списки и решено использовать указатели.

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

  
   

typedef struct _link{ }LINK; typedef struct _neuron{ struct _neuron *prev,*next; }NEURON; typedef struct _n_layer{ struct _n_layer *prev,*next; }NLAYER;

Теперь идея в том, как связать все это вместе? Немного подумав, я решил сделать так: 1 блок связи соединяет 2 нейрона -> каждый экземпляр соединения должен быть легко доступен и относиться только к 2-м конкретным нейронам, но у нейрона может быть неограниченное количество связей (я пробовал сделать библиотека без программных ограничений).

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

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

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



typedef struct _link{ void *from,*to;

Теги: #искусственный интеллект #искусственные нейронные сети #программирование на C++ #программирование #C++

Вместе с данным постом часто просматривают: