Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

8124

.pdf
Скачиваний:
0
Добавлен:
23.11.2023
Размер:
1.4 Mб
Скачать

9

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

используемые в процессе ее обучения, делят на обучающие и проверочные.

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

Шаг 1. Разграничиваем данные на обучающие и проверочные (обычно проверочные данные составляют 25% от обучающих);

Шаг 2. Случайным образом выбираем из массива обучающих данных

отсчеты и подаем их на вход нейронной сети. При этом для каждого отчета

(входного вектора) известен целевой вектор T нейронной сети. На вход нейронной сети требуется подать все отсчеты из множества обучающих данных. Для каждого отсчета вычисляется ошибка нейронной сети в соответствии с выражением (1.1). После этого может быть сделана корректировка весовых значений нейронной сети в соответствие с алгоритмом обратного распространения ошибки. После того, как все отсчеты из обучающих данных были поданы на вход нейронной сети, вычисляется общая ошибка нейронной сети в соответствии с выражением (1.2).

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

принято называть этапом обучения.

Шаг 3. В соответствие с выражением (1.2) вычисляется общая ошибка нейронной сети для проверочных данных. Полученное значение запоминается в памяти ЭВМ. Если нейронная сеть решает задачу классификации, то в память ЭВМ записывается также вероятность успешного

51

10

классификации отсчетов из проверочных данных. Шаг 3 приято называть этапом проверки.

Шаги 2 и 3 в общем случае принято назвать эпохой.

Шаг 4. Повторяем Шаг 2 и Шаг 3 несколько раз (100 или 200). Строим зависимости вероятности правильной классификации нейронной сети от номера эпохи на этапе обучения и проверки. Строим зависимости общей ошибки (потери) нейронной сети от номера эпохи на этапе обучения и проверки.

Ниже представлены примеры графиков обучения нейронной сети [2].

Рисунок 6 - Потери на этапах обучения и проверки

Рисунок 7 - Точность на этапах обучения и проверки

52

11

Как видите, на этапе обучения потери снижаются с каждой эпохой, а

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

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

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

Отметим, что в настоящее время не существует точных правил по выбору количества слоев нейронной сети, функций активации нейронов,

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

2Проблемы классификации в электроэнцефалографии

Всовременной литературе по клинической электроэнцефалографии электроэнцефалограммы принято делить на три класса: нормальные ЭЭГ,

пограничные ЭЭГ и патологические ЭЭГ. Решение о классе ЭЭГ принимается на

основе визуальной оценки их форм. В литературе по клинической

53

12

электроэнцефалографии приводятся вербальные описания форм электроэнцефалограмм, но основе которых выполняется их классификация.

Как правило «нормальные» ЭЭГ характеры для здорового человека без церебральной патологии. «Пограничные» ЭЭГ не указывают явным образом на церебральную патологию, но при этом являются указанием на проведение дополнительных клинических исследований с помощью методов компьютерной и магнитно-резонансной томографии. «Пограничные» электроэнцефалограммы могут наблюдаться как у здорового пациента, так и у пациента с различными патологиями центральной нервной системы,

которые выявляются с помощью дополнительных исследований.

Патологические ЭЭГ явным образом указывают на наличие серьезных заболеваний центральной нервной системы, таких как эпилепсия или опухоль долей головного мозга. Подробнее о вербальных критериях классификации электроэнцефалограмм можно прочитать в работе [3].

3 Классификация электроэнцефалограмм последовательной

нейронной сетью

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

фрагментов пограничной и 500 фрагментов патологической ЭЭГ. Сигналы были получены в ГБУ РМЭ Республиканская клиническая больница, а также из верифицированных баз данных, расположенных в открытом доступе в сети интернет: TUH EEG (www.isip.piconepress.com/projects/tuh_eeg/) и PhisioNet

(www.physionet.org/). Длительность каждого фрагмента составляет 0,5 с, при частоте дискретизации 500 Гц. В заданную длительность сигнала как раз укладываются основные ЭЭГ-феноменомы, характерные для нормальной,

54

13

пограничной и патологической ЭЭГ. Ниже представлены фрагменты сигналов

из рассматриваемой базы данных.

Рисунок 8 – Эпоха нормальной ЭЭГ длительностью 0,5 с, сигнал состоит из следующих друг за другом альфа-волн частотой 10 Гц

Рисунок 9 – Эпоха нормальной ЭЭГ длительностью 0,5 с, сигнал состоит из следующих друг за другом альфа-волн частотой 10 Гц, амплитуда альфа ритма не превышает 100 мкВ

55

14

Рисунок 10 – Эпоха нормальной ЭЭГ длительностью 0,5 с, сигнал состоит из следующих друг за другом альфа-волн частотой 10 Гц, имеется одна бета волна частотой 15 Гц и амплитудой ниже 7 мкВ

U, мкВ

t, c

Рисунок 11– Эпоха патологической ЭЭГ длительностью 0,5 с, в состав сигнала входит острая волна частой порядка 20 Гц и амплитудой 55 мкВ

(первая волна на графике)

56

15

Рисунок 12 – Эпоха патологической ЭЭГ длительностью 0,5 с, в состав сигнала входит спайк с амплитудой порядка 140 мкВ

Рисунок 13 – Эпоха пограничной ЭЭГ длительностью 0,5 с, содержит тета-

волну частотой 5 Гц и амплитудой выше 50 мкВ

57

16

Рисунок 14 – Эпоха пограничной ЭЭГ длительностью 0,5 с, содержит альфа-

волну с вершиной «заостренной» формы

Для классификации будем использовать последовательную нейронную сеть, содержащую 250 нейронов во входном слое (поскольку число отсчетов в классифицируемом сигнале равно 250), 16 нейронов в первом скрытом слое, 16 нейронов во втором скрытом слое и 3 нейрона в последнем слое. Число нейронов в последнем слое нейронной сети равно числу классов. В

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

– это будет нормальная ЭЭГ, на выходе второго – патологическая ЭЭГ, на выходе третьего – пограничная ЭЭГ. 1000 случайно выбранных сигналов ЭЭГ будем использовать в качестве обучающих данных, 250 – в качестве проверочных. Оставшиеся 250 сигналов будем использовать в качестве тестовых данных, которые нейронная сеть «не видела» на этапе обучения и проверки. Обучение нейронной сети будем проводить на 500 эпохах, т.е. 500

раз будем подавать на ее вход весь массив обучающих и проверочных

58

17

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

Ниже представлен пример реализации данной нейронной сети на языке

Python. Представленный скрипт сохранен в отдельную папку с проектом. Эта директория в свою очередь содержит папку data, в которой хранятся обучающие данные. Папка data содержит 3 директории: border-epochs, normepochs и pathology-epochs, в которых содержится по 500 файлов пограничной,

нормальной и патологической ЭЭГ соответственно.

from tensorflow.keras import models from tensorflow.keras import layers

from tensorflow.keras.utils import to_categorical import signal_proc as sp

import random import numpy as np

import matplotlib.pyplot as plt

# загрузка имен файлов

epoch_paths = (sp.get_abs_fpaths("data/norm-epochs") + sp.get_abs_fpaths("data/pathology-epochs") + sp.get_abs_fpaths("data/border-epochs"))

# перемешиваем имена файлов в случайном порядке random.seed(42)

random.shuffle(epoch_paths)

data = [] labels = []

# загружаем данные

for path in epoch_paths: data.append(sp.load_segment(path))

# определение типа эпохи (нормальная, пограничная или патологическая) в зависимости от имени файла

labels.append(sp.get_epoch_label_by_path(path))

#преобразуем данные из list в ndarray data = np.array(data, dtype=np.float) labels = np.array(labels)

#нормализация значений сигнала [-1, 1]

59

18

eeg_signal_max_value = np.max(data) # максимальное значение амплитуды загруженных сигналов

eeg_signal_min_value = np.min(data) # минимальное значение амплитуды загруженных сигналов

sweep = eeg_signal_max_value - eeg_signal_min_value

normalized_data = (data - eeg_signal_min_value) / sweep # нормализация данных

#разграничиваем данные на обучающие, проверочные и тестовые train_labels = labels[0:1000]

val_labels = labels[1000:1250] test_labels = labels[1250:1500]

one_hot_train_labels = to_categorical(train_labels) one_hot_val_labels = to_categorical(val_labels) one_hot_test_labels = to_categorical(test_labels) train_data = normalized_data[0:1000]

val_data = normalized_data[1000:1250] test_data = normalized_data[1250:1500]

#конструирование нейронной сети

model = models.Sequential()

model.add(layers.Dense(16, activation='relu', input_shape=(250,))) model.add(layers.Dense(16, activation='relu')) model.add(layers.Dense(3, activation='softmax'))

model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['acc'])

history = model.fit(train_data, one_hot_train_labels, epochs=500, batch_size=25,

validation_data=(val_data, one_hot_val_labels))

#значение функции потер для обучающих данных loss = history.history['loss']

#значение функции потерь для проверочных данных val_loss = history.history['val_loss']

#значение функции точности для обучающих данных acc = history.history['acc']

#значение функции точности для проверочных данных val_acc = history.history['val_acc']

sp.show_train_history_2(sp.smooth_curve(acc))

results = model.evaluate(test_data, one_hot_test_labels) print(results)

60

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]