Thanks to visit codestin.com
Credit goes to github.com

Skip to content

anahronic/MarkMilhar

Repository files navigation

Фреймворк для симуляции нейросети

Фреймворк реализован в виде Python класса Brain. Класс имеет следующие поля: * матрицы нейронов before (прошлое состояние), after (будущее состояние) * интегральные уровни эмоциональной активности

  • eq_pos
  • eq_neg
  • eq_mod = sqrt(eq_pos^2 + eq_neg^2)
  • уровень влияния эмоций eq_factor
  • массивы эмоциональной памяти eq_pos_history, eq_neg_history, eq_mod_history чтобы сохранять последние 100 значений
  • память активности системы о количестве активных нейронов activity_history
  • значений eq levels за все итерации счетчик итераций run_count

Neuron

Базовая структура фреймворка — это нейрон. Нейрон — это структура данных, не имеющая кода, которая должна быть реализована в виде дата класса. Нейроны объединены в матрицу MAX_X на MAX_Y. Нейрон имеет следующие поля:

  1. Координаты: X, Y, целые значения, позиция нейрона в матрице.

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

  3. Эмоциональный квант EQ: Значение с плавающей точкой от минус единицы до плюс единицы.

  4. Способность к эмоциональному обучению eq_delta: Значение с плавающей точкой от нуля до единицы.

  5. Значение сигнала Signal: Это поле вычисляется как сумма весов всех активных связей.

  6. Charge: Это уровень заряда нейрона, который обнуляется, если нейрон стал активным, и растёт с каждой итерацией на charge_delta. Дефолтное значение 0.1

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

  8. Charge_max: Это уровень заряда нейрона, при котором наступает произвольное срабатывание.

  9. Список входов: Идентификаторы нейронов, которые генерируют входные сигналы input_ids, и весов input_weights, которые присвоены этим связям.

  10. Output_idx: Целое значение, дефолт 0.

  11. Пороговый уровень входного сигнала input_trigger.

Method Brain.create

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

Параметры:

  • Размеры матрицы max_x, max_y
  • Default_eq = 0.1
  • Default_eq_delta = 0.01
  • Default_trigger = 0.8
  • Min_number_of_inputs = 1
  • Max_number_of_inputs = 16
  • Max_length_of_link = 20

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

  • Статус активности должен быть нулевым.

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

  • с вероятностью 0.95 eq должен быть позитивным значением 0.2. В этом случае eq_delta должна быть 0.1. В оставшихся 5% нейронов eq должен быть -0.8, а способность к обучению 0

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

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

Method brain.show

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

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

  • Дополнительным графиком отрази на диаграмме графики эмоциональной активности eq_pos_history зеленым, eq_neg_history синим, eq_mod_history оранжевым.

  • Дополнительным графиком отрази на диаграмме activity_history

  • Если метод вызван повторно, то он должен обновить созданную диаграмму, а не создавать новую.

Method brain.shot

Метод должен сохранять диаграмму, созданную методом brain.show, в заданный файл как битмап.

Methods brain.save and brain.load

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

Methods brain.db_save and brain.db_load

Аналогично методам brain.save and brain.load, они должны сохранять и читать данные, но использовать базу данных. На данном этапе пометь их как to be implemented.

Method brain.assign_inputs(лист)

Метод получает на вход массив структур (x, y, x_inp, y_inp, weight), отмечает нейрон как входящий. Если до этого он не был отмечен как входной, то список его входов обнуляется. Значение x_inp, y_inp, weight добавляется как новая связь.

Method brain.assign_outputs(лист)

Метод получает на вход массив структур (x, y, output_idx). Метод должен отметить нейрон, указанный координатами, как выходной. И установить значение его выходного индекса.

Method brain.process

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

  • Уровень заряда увеличивается на charge_delta.

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

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

  • Сумма входов входного нейрона: Если нейрон отмечен как входной, то для каждой связи вызывается функция read_world(time_pos = run_count, x, y). Функция возвратит значение с плавающей точкой. Если полученное значение по модулю выше, чем вес связи по модулю, то вес связи добавляется в общую сумму.

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

  • Расчетное срабатывание: Если сумма входа, умноженная на eq_factor * eq_mod, выше порогового уровня, то нейрон помечается как активный, его заряд обнуляется.

  • Обработка выходов: Если нейрон помечен как выходной, вызывается функция write_world(output idx, signal).

  • Сумма позитивных и негативных eq всех сработавших нейронов помещается в eq_pos и eq_neg, и вычисляется eq_mod.

  • Количество ацтивных нейронов сохраняется в activity_history

Method brain.read_world()

Shall return 0.

Method brain.write_world()

Shall pass.

Тестовый код

  1. Создай класс.

  2. Создай матрицу 100 на 100 с дефолтными значениями.

  3. Создай 10 случайных входов и два случайных выхода.

  4. Выполни метод process 1000 раз с паузой 0.1 секунда между итерациями. Визуализируй каждую итерацию.

About

Friend repository

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages