unit BCNNLib;

TBCNN = class(TNeuronalNet)   - Объект BCNN Brain Centers Neuronal Network

Нейросеть BCNN ( Gorbunov I . Semenov P .) в базовом варианте имеет четырехслойную структуру с 2мя парами одинаковых по количеству нейронов слоев 1м и 4м и 2м и 3м (Рис 1). Первый и четвертый (входной и выходной) слои содержат нейроны, активация которых должна соответствовать потенциалам на ЭЭГ электродах на поверхности головы. Второй и третий слои содержат нейроны, активация которых отражает суммарный биоэлектрический потенциал определенной области мозга. Несмотря на громадное упрощение модели структуры мозга, мы постарались сделать ее наиболее соответствующей нашему пониманию процессов биоэлектрической активности. В соответствие с этим активация нейрона может иметь положительный или отрицательный потенциал. Мы выбрали гиперболический тангенс как активационную функцию (отражающую скачек между поляризацией дендритного дерева и сомы нейронов центра). Этот выбор  мы сделали так как исходя из теорий происхождения ЭЭГ (Гусельников В. И. 1976, Зенков Л. Р. 2011, Niedermeyer E . and da Silva F . L . 2005) можно предположить, что поверхностная ЭЭГ формируется в основном благодаря деполяризационным и гиперполяризационным процессам, происходящим на дендритных деревьях, которые с точки зрения авторов имеют более плавную временную природу и, за счет большого количества дендритов, более сильно отклоняющиеся от нуля потенциалы чем процессы, происходящие в аксонах. Следовательно, влияние на поверхностную ЭЭГ оказывает в большей степени активность нейрона до преобразования через скачковую (сигмоидную) функцию активации. Система связей между центрами мозга и электродами 3м (центры мозга) и 4м (электроды) слоями была выбрана исходя из закономерностей распространения электрического потенциала в объемном проводнике. То есть, влияние источника потенциала распространяется обратно пропорционально квадрату расстояния между источником и регистрирующим элементом (электродом).

 

Схема BCNN

Рис 1 . Схематическое изображение нейронной сети BCNN для построения модели взаимосвязей между центрами мозга (функционального коннектома).   Изображена модель BCNN где I1 In – нейроны, активация которых отражает потенциалы на электродах в начальный момент времени ti . H 11, H 12 – нейроны, активация которых отражает электрические потенциалы мозговых центров (показано только 2, но может быть и больше) в момент  ti . H 11, H 12 – нейроны, активация которых отражает электрические потенциалы тех же мозговых центров после взаимодействия в момент  ti+1 . O 1 , On -   потенциалы на электродах в момент t1

Публичные Методы


   constructor Create(Owner:TComponent; NumCenters:Integer; NumChannels:Integer;InvMatr:Boolean; NumHidNeur:Integer);

Создает объект нейросеть BCNN с необходимым количеством центров и количеством каналов

Параметры:

NumCenters - Количество центров

NumChannels - Количество каналов

InvMatr - Тип распознавания потенциалов центров по потенциалам электродов

True - Потенциалы центров вычисляются с помощью псевдообратной матрицы от матрицы между центрами Ti+1 и выходным слоем (Для вычисления псевдообратной матрицы используется функция Pinv() из пакета NumPy Python, на компьютере необходим установленный Python)

False - между входным слоем электродов и слоем центров Ti создается 3х слойный перцептрон, обучаемый восстанавливать активации центров по активациям электродов (необходима процедура обучения)

NumHidNeur - резерв

Результат - Созданная нейронная сеть BCNN

   procedure SetInput(Value:TArray1D);

Загружает входные значения на электродах (входных нейронах) для дальнейшей активации сети

Параметры:

Value - Одномерный динамический массив чисел с плавающей точкой Double типа TArray1D (описан в библиотеке MyProc) содержащий вектор потенциалов на электродах. Длина массива равна количеству электродов (нейронов первого и последнего слоев)


   procedure InitCenterWeights(Coeff:Double);

Инициализирует матрицу связей между центрами случайными числами

Параметры:

Coeff - Разброс случайных чисел вокруг 0, например 0.7


    procedure SetResistances(Resists:TArray2D);

Задает связи между центрами и электродами - сопротивления в объемном проводнике

Параметры:

Resist - Двумерный динамический массив чисел с плавающей точкой типа Double размерностью (N,M) для мозга обратно- пропорциональных квадрату расстояний между ними. N- количество электродов, M - количество центров

    procedure Activate(InputVec:TArray1D);overload; //Активация сети входным массивом

Активирует входной слой вектором InputVec и активирует все последующие слои нейронов

Параметры:

InputVec - Одномерный динамический массив чисел с плавающей точкой Double типа TArray1D (описан в библиотеке MyProc) содержащий вектор потенциалов на электродах. Длина массива равна количеству электродов (нейронов первого и последнего слоев)


    procedure StepContext; 

Копирует активации центров в момент Ti+1 в слой акциваций Ti и активирует все последующие слои. Фактически вычисляет следующий шаг активации сети от без загрузки на входы потенциалов электродов предыдущего. После выполнения на выходном слое прогноз потенциалов электродов в момент  Ti+k где k - количество команд StepContext

 

    function Learn(TargetVect:TArray1D):Double;

Цикл обучения Целевому вектору TargetVect

Параметры:

TargetVect - Одномерный динамический массив чисел с плавающей точкой Double типа TArray1D (описан в библиотеке MyProc) содержащий ожидаемый вектор потенциалов на электродах после активации сети. Длина массива равна количеству электродов (нейронов первого и последнего слоев)

Результат - Число отражающее среднюю ошибку на выходном слое


    function Check(TargetVec:TArray1D):Double;

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

Параметры:

TargetVec - Одномерный динамический массив чисел с плавающей точкой Double типа TArray1D (описан в библиотеке MyProc) содержащий ожидаемый вектор потенциалов на электродах после активации сети. Длина массива равна количеству электродов (нейронов первого и последнего слоев)

Результат - Число отражающее среднюю ошибку на выходном слое

    function GetErrorTargets:TArray1D;

Возвращает массив ошибок определения целевых потенциалов на электродах 

Результат - Одномерный динамический массив чисел с плавающей точкой Double типа TArray1D (описан в библиотеке MyProc) содержащий все ошибки, полученные при сравнении с целевыми значениями, значений выходных потенциалов на электродах после активации сети.

    function LearnInv:Double;

Только если при создании BCNN параметр InvMatr был False. Проводит один цикл обучения перцептрона для вычисления активаций центров по входному вектору потенциалов. А именно - загружает случайный вектор потенциалов центров Ti+1, вычисляет потенциалы на выходном слое электродов активируя последний слой. Загружает выходные потенциалы на входной слой, с помощьб входного перцептрона вычисляет центры Ti и сравнивает их с искомыми Ti+1 Полученную ошибку использует для обучения предыдущих слоев перцептрона.

Результат - Число отражающее среднюю ошибку вычисления центров по электродам

    function GetWeights:TArray1D;

Возвращает массив связей между центрами (плоский) В порядке последовательности - все входные связи каждого центра Ti+1 подряд.
Результат - Одномерный динамический массив чисел с плавающей точкой Double типа TArray1D (описан в библиотеке MyProc) содержащий все входные веса нейронов слоя центров Ti+1 размерностью I2 где I-количество центров.

    function GetWeights2D:TArray2D; /

Возвращает массив связей между центрами (2D) размерностью (M,N). В порядке M - центры слоя Ti+1, N - центры слоя Ti

Результат - Двумерный динамический массив чисел с плавающей точкой Double типа TArray2D (описан в библиотеке MyProc) содержащий все входные веса нейронов слоя центров Ti+1 размерностью (M,N) где M-количество центров слоя Ti+1, N - центры слоя Ti.


    function GetAvgErrorTargets:Double;

Средняя Ошибка определения целевых потенциалов на электродах 

Результат - Число отражающее среднюю ошибку на выходном слое

    function GetPredictVec:TArray1D;

Массив предсказанных значений ЭЭГ на 1 шаг Размер массива - количество электродов 

Результат - Одномерный динамический массив чисел с плавающей точкой Double типа TArray1D (описан в библиотеке MyProc) содержащий все предсказанные потенциалы на электродах после активации сети.

    function GetPredictStr:String;

получить предсказанные значения в строке с разделителями ';' 

Результат - Строка, содержащая массив предсказанных потенциалов на электродах после активации сети через ";".

    function GetCentersStr:String; 

получить активации центров в строке с разделителями ';' 

Результат - Строка, содержащая массив предсказанных значений центров на момент Ti+1 через ";".



    function GetInputStr:String; //

получить входные значения в строке с разделителями ';'

Результат - Строка, содержащая массив входных потенциалов на электродах после активации сети через ";".

    function GetResistanceMatrix:TArray2D;

Возвращает связи между центрами и электродами - сопротивления в объемном проводнике

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

 

Свойства

    property NumChan:Integer - Управление количеством входных нейронов - каналов ЭЭГ (1-4 слои)

    property NumCenters:Integer - Управление количеством нейронов - центров ЭЭГ (2-3 слои)

    property Resistance[electrode,center:Integer]:Double - Элемент матрицы связей между центрами Ti+1 и выходными электродами

    property Center[Index:Integer]:TNeuron - Управление объектом - нейроном центра в слое Ti+1 после преобразования

    property CenterIn[Index:Integer]:TNeuron - Управление объектом - нейроном центра в начальном слое Ti

    property Predicted[Index:Integer]:TOutput  - Управление нейроном выходного слоя (Электродом)

    property flInvMatr:Boolean - Флаг указывающий на особенности структуры сети: True - на входе псевдообратная матрица и центры начинаются со 2-го слоя. False - на входе перцептрон обученный распознавать центры по электродам и центры начинаются с 3-го слоя 
    property CoefLearn:Double - коэффициент регуляции скорости обучения нейросети - Nu между центрами

    property Nu:Double - Скорость обучения

    property Mu:Double - Момент скорости обучения

 

//Функция получения обратной матрицы с помощью вызова функции Python Numpy Pinv()

function getInvMatr(matr:TArray2D):TArray2D;
var I,J:Integer;
ds:TStringList;
Str:String;
begin
  ds:=TStringList.Create;
  for I := 0 to High(matr) do begin
    Str:=FloatToStr(matr[I,0]);
    for J := 1 to High(matr[I]) do
      Str:=Str+';'+FloatToStr(matr[I,J]);
      Str:=ReplaceText(Str,',','.');
      ds.Add(Str);
  end;
  ds.SaveToFile('matr1.csv');
  ds.Clear;
  WinExec('python pinvmatr.py', SW_SHOW);
  Sleep(3000);
  ds.LoadFromFile('matr2.csv');
  for I := 0 to ds.Count-1 do
      ds[I]:=ReplaceText(ds[I],'.',',');
  Result:=LoadArray(ds,';');

end;