Фреймворк реализован в виде 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
Базовая структура фреймворка — это нейрон. Нейрон — это структура данных, не
имеющая кода, которая должна быть реализована в виде дата класса. Нейроны
объединены в матрицу MAX_X на MAX_Y. Нейрон имеет следующие поля:
-
Координаты:
X,Y, целые значения, позиция нейрона в матрице. -
Статус активности
ACTIVE: Значение с плавающей точкой от нуля до единицы. В момент активации, значение выставляется в единицу. А затем на каждом цикле обработки уменьшается на фиксированную величинуmemory_delta, определенную в глобальных параметрах фреймворка. В текущей реализации это поле обрабатывается как бинарное значение. Дельта памяти, на которую уменьшается значение, равна единице. -
Эмоциональный квант
EQ: Значение с плавающей точкой от минус единицы до плюс единицы. -
Способность к эмоциональному обучению
eq_delta: Значение с плавающей точкой от нуля до единицы. -
Значение сигнала
Signal: Это поле вычисляется как сумма весов всех активных связей. -
Charge: Это уровень заряда нейрона, который обнуляется, если нейрон стал активным, и растёт с каждой итерацией наcharge_delta. Дефолтное значение 0.1 -
Charge_min: Это минимальный уровень заряда нейрона, при котором возможна его активация. -
Charge_max: Это уровень заряда нейрона, при котором наступает произвольное срабатывание. -
Список входов: Идентификаторы нейронов, которые генерируют входные сигналы
input_ids, и весовinput_weights, которые присвоены этим связям. -
Output_idx: Целое значение, дефолт0. -
Пороговый уровень входного сигнала
input_trigger.
Метод должен создавать матрицу нейронов прошлого нужного размера и инициализировать их поля.
Параметры:
- Размеры матрицы
max_x,max_y Default_eq= 0.1Default_eq_delta= 0.01Default_trigger= 0.8Min_number_of_inputs= 1Max_number_of_inputs= 16Max_length_of_link= 20
В процессе инициализации метод должен создать матрицу нужного размера. Затем для каждой ячейки этой матрицы метод должен создать новый нейрон и инициализировать его поля.
-
Статус активности должен быть нулевым.
-
триггер входа, должен быть установлен в дефолтные значения.
-
с вероятностью 0.95 eq должен быть позитивным значением 0.2. В этом случае eq_delta должна быть 0.1. В оставшихся 5% нейронов eq должен быть -0.8, а способность к обучению 0
-
Список входов нейрона должен быть пустым.
Вновь созданный нейрон должен быть привязан к другим. В первую очередь метод должен случайным образом сгенерировать количество связей для данного нейрона. Это случайное целое число в диапазоне между минимальным количеством связей и максимальным количеством связей. Затем метод должен случайным образом выбрать ячейки матрицы, которые находятся на дистанции меньше максимальной длины связи. Из этих ячеек он должен случайным образом выбрать нужное количество входов так, чтобы короткие связи были более вероятны, чем длинные. Затем метод должен случайным образом выставить веса этих связей и нормализовать их так, чтобы сумма модулей весов была равна единице. Эту операцию в дальнейшем мы будем называть нормализацией весов, и она будет необходима после каждого изменения весов в процессе обучения. Для лучшей читаемости, она должна быть выделена в отдельную функцию.
Метод должен построить диаграмму активности в матрице нейронов прошлого, где каждый нейрон обозначен соответствующим пикселем.
-
Неактивные нейроны должны быть обозначены белым цветом, активные нейроны с положительным эмоциональным квантом должны быть обозначены зеленым, негативные синим.
-
Дополнительным графиком отрази на диаграмме графики эмоциональной активности eq_pos_history зеленым, eq_neg_history синим, eq_mod_history оранжевым.
-
Дополнительным графиком отрази на диаграмме activity_history
-
Если метод вызван повторно, то он должен обновить созданную диаграмму, а не создавать новую.
Метод должен сохранять диаграмму, созданную методом brain.show, в заданный
файл как битмап.
Методы должны сохранять матрицу нейронов прошлого в файл JSON формата и соответственно, читать матрицу из такого файла.
Аналогично методам brain.save and brain.load, они должны сохранять и читать
данные, но использовать базу данных. На данном этапе пометь их как to be implemented.
Метод получает на вход массив структур (x, y, x_inp, y_inp, weight), отмечает
нейрон как входящий. Если до этого он не был отмечен как входной, то список его
входов обнуляется. Значение x_inp, y_inp, weight добавляется как новая
связь.
Метод получает на вход массив структур (x, y, output_idx). Метод должен
отметить нейрон, указанный координатами, как выходной. И установить значение его
выходного индекса.
Метод осуществляет преобразование матрицы прошлого в матрицу будущего. Метод перебирает все нейроны в матрице прошлого. И для каждого нейрона выполняет следующую операцию: читает данные из матрицы прошлого, модифицирует данные по описанной ниже процедуре и сохраняет обновленную структуру в матрице будущего.
-
Уровень заряда увеличивается на
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
Shall return 0.
Shall pass.
-
Создай класс.
-
Создай матрицу 100 на 100 с дефолтными значениями.
-
Создай 10 случайных входов и два случайных выхода.
-
Выполни метод
process1000 раз с паузой 0.1 секунда между итерациями. Визуализируй каждую итерацию.