Диагностика болезней сердца с ИСКУССТВЕННЫМ РАЗУМОМ и ГЛУБОКОМ ОБУЧЕНИЕМ
Вступление:
В эпоху здравоохранения одна из важнейших задач, с которыми сталкиваются врачи, - это правильная диагностика заболеваний у пациентов. Из-за отсутствия подготовки или иногда сложной ситуации они не могут правильно диагностировать состояние пациентов. Вот почему врач не помогает пациенту должным образом, если он ошибается при диагностике болезни у пациента. Это привело бы к заброшенности и судебным процессам, которые в конечном итоге повредили настроениям пациентов и утратили их веру в медицинских работников, поскольку, как вы знаете, врачебная ошибка является 3 крупнейшей причиной смерти во всем мире. Эта статья представляет собой диагностику сердечных заболеваний с помощью построения собственной нейронной сети.
Термин «болезнь сердца» часто используется как синоним «сердечно-сосудистого заболевания». Сердечно-сосудистые заболевания обычно относятся к состояниям, которые включают суженные или заблокированные кровеносные сосуды, которые могут привести к сердечному приступу, боли в груди (стенокардии) или инсульту, в основном вызванным фиброзно-жировой бляшкой в внутренней оболочке кровеносных сосудов, состоящих из дисфункционального эндотелия и также состоящих из гладких мышц. содержит липиды пенистых клеток и макрофаги, поглощающие нежелательные вещества. переосмыслить маленькие и большие бляшки, что более опасно, часто знайте, что большая бляшка более опасна, но на самом деле маленькая бляшка более опасна, потому что у нее нет фиксированной бляшки, она претерпевает динамические изменения с меньшим или тонким фиброзный колпачок и вызывают опасную обструкцию из-за меньшего количества внеклеточных жиров и пенистых клеток. Отложение фибрина является крайне пагубной стенокардией у людей, вызывающей внезапную остановку сердца. Острые изменения могут быть вызваны эрозией / изъязвлением, трещинами и размножением межпланшников. Другие сердечные заболевания, такие как те, которые влияют на сердечную мышцу, клапаны или ритм, PSVT, фибрилляция, кардиомегалия и базальный застой, накопление жидкости в легких и альвеолах, зависящее от силы тяжести, нечеткие полные ворота представляют собой увеличенные легочные вены и жидкость вокруг них, двусторонний плевральный выпот из-за повышенного гидростатического давления также считается формой болезни сердца.
Пациент страдает, потому что не получает правильного лекарства в золотой час, и рискует своим здоровьем из-за состояния, которое из-за этого остается незамеченным. кроме того, пациент проходит ненужное лечение и принимает ненужные лекарства, что требует времени и денег. Болезни сердца - одна из основных причин заболеваемости и смертности населения мира. Прогнозирование сердечно-сосудистых заболеваний считается одним из самых замечательных результатов ИСКУССТВЕННОГО ИНТЕЛЛЕКТА в здравоохранении.
Если мы правильно диагностируем состояние пациента, у нас есть потенциал снизить смертность во всех возрастных группах. Если мы создадим модели глубоких нейронных сетей, которые смогут классифицировать, страдает ли пациент сердечным заболеванием или нет, и определить болезнь, через которую проходит пациент, и определить тяжесть заболевания, то медицинские работники смогут использовать эти модели для лучше диагностировать своих пациентов, и это также снизит нагрузку на них. В отчете из Китая и США говорится, что методы диагностики на основе искусственного интеллекта более точны и требуют меньше времени, чем группа радиологов. Точный диагноз также может быть полезен при своевременном лечении пациента; неправильный диагноз может привести к задержке в получении надлежащего лечения.
В этой статье мы проведем глубокое обучение для набора данных, содержащего данные пациентов с сердечными заболеваниями и других пациентов с нормальным сердцем, эти наборы данных разделены на наборы для обучения и тестирования, поэтому модель глубокого обучения, способная извлекать уроки из нее и классифицировать новую КТ грудной клетки либо на основе электрокардиографа, либо на КТ-ангиографию сердца на положительные и отрицательные.
Я создаю здесь свою собственную сверточную нейронную сеть (CNN) и пытаюсь повысить точность наборов тестов с помощью пакетной нормализации и отсева, а затем пытаюсь классифицировать пациента как страдающего сердечным заболеванием или нет. Это проблема бинарной классификации. Я также хотел бы применить CNN, чтобы классифицировать пациента как страдающего тяжелым сердечным заболеванием, умеренного или не имеющего его. Это проблема 3-х классной классификации. Практикующие врачи не всегда могут все время ставить правильный диагноз, поэтому глубокое обучение может обнаружить информацию о состоянии легких, особенно о том, в норме ли кровеносные сосуды в легких и есть ли жидкость в легких или вокруг них. КТ-рентгенограммы могут обнаружить увеличение сердца, которое часто происходит из-за сердечной недостаточности или порока сердечных клапанов.
Однако есть некоторая подготовка изображений, которая необходима перед применением сверточной нейронной сети, например, увеличение данных для увеличения размера. наборов данных, если изображений меньше. Изображения должны быть подготовлены с использованием сверточных слоев в процессе, называемом сверткой. В этом процессе есть несколько этапов, таких как операция свертки, операция ReLU (Rectified linear Unit), хотя я предпочел дырявый ReLU, а не ReLU, потому что он имеет значение либо 1, либо не совсем 0, чтобы исключить проблему исчезающего градиента, слой maxpooling и сглаживание; в конечном результате полученный результат будет передан в искусственную нейронную сеть.
Во время операции свертки к изображению применяются различные детекторы признаков для создания набора карт признаков, который называется сверточным слоем. ReLU применяется к каждой карте функций для повышения нелинейности. На этапе объединения, или мы можем вызвать подвыборку, мы применяем максимальное объединение (или какой-либо другой тип объединения) для сопоставления каждой функции, присутствующей на рентгенограммах КТ, создавая более мелкие карты функций, которые сохраняют необходимые функции изображения. Результирующий стек объединенных избранных карт формирует слой объединения.
После того, как у нас есть слой объединения, состоящий из объединенных карт объектов, каждую объединенную карту объектов необходимо объединить в вектор, и все векторы последовательно объединяются в один вектор. . Записи всего этого вектора подаются на входной уровень нашей модели искусственной нейронной сети. Таким образом, элементы сглаженного вектора, соответствующие одному изображению, подаются во входные блоки ИНС. Это в отличие от ИНС, используемых в традиционном наборе данных, где характеристики одного экземпляра вводятся во входной уровень ИНС. ИНС начинается там, где она формирует полностью связанные уровни модели CNN. Как вы, наверное, знаете, сверточная нейронная сеть представляет собой смесь свертки и ИНС. Затем на обучающих наборах подготавливается искусственная нейронная сеть и опробуется на тестовых наборах.
Создайте собственную CNN на Python:
Чтобы построить CNN, мы импортируем библиотеки и пакеты Keras:
# Импорт библиотек и пакетов Keras
из keras.models import Sequential
из keras.layers import Convolution2D
из keras. слои импортировать MaxPooling2D
из keras.layers import Flatten
из keras.layers import Dense
# Последовательный пакет используется для инициализации CNN.
# Пакет Convolution2D используется для создания сверточных слоев.
# Пакет MaxPooling2D используется для создания объединенных карт объектов.
# Пакет Flatten используется для сглаживания стопки объединенных карт признаков в один вектор, который можно передать в ИНС.
# Пакет Dense используется для добавления слоев к ANN.
Затем мы инициализируем CNN, создав объект класса Sequential. Этот объект мы назовем «классификатором»:
# Инициализация CNN
classifier = Sequential ()
Добавьте один сверточный слой из 32 карт фильтров, применив 32 фильтра известных детекторов признаков размерности 3 на 3 к входному изображению.
Входное изображение должно иметь размер 64 на 64, и если цветные изображения обрабатываются по 3 каналам.
Примените функцию активации ReLU или дырявый ReLU наилучшим образом до настоящего времени.
# Шаг 1 - Свертка
classifier.add (Convolution2D (32, (3,3), input_shape = (64,64,3), activate = 'relu'))
Теперь у нас есть карты функций в сверточном слое, мы применяем максимальное объединение к каждой карте функций, используя сетку 2 на 2.
# Шаг 2 - MaxPooling
classifier.add (MaxPooling2D ((2,2)))
Теперь у нас есть объединенный слой, состоящий из объединенных карт признаков, каждый объединенный слой сглаживается в вектор и последовательно объединяются все результирующие векторы в один гигантский вектор.
# Шаг 3 - Сглаживание
classifier.add (Flatten ())
Теперь мы собираемся добавить искусственную нейронную сеть. Сначала добавьте скрытый слой из 128 единиц и используйте функцию активации «relu».
Затем добавьте выходной слой, состоящий из одной выходной единицы, и используйте функцию активации сигмоида в качестве выходного слоя, и мы используем только одну выходную единицу, потому что наш выход является двоичным (нормальный или сердечный.
# Шаг 4 - Полное соединение
classifier.add (Dense (units = 128, Activation = 'relu'))
classifier.add (Dense (units = 1, activate = 'sigmoid'))
Теперь мы составляем CNN. Мы собираемся использовать «adam», лучший оптимизатор для стохастического градиентного спуска, двоичной кросс-энтропии для функции потерь и получения точности в матрице производительности.
# Компиляция CNN
classifier.compile (optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['precision'])
В нашем тренировочном наборе и тестовом наборе меньше изображений; Итак, мы собираемся применить увеличение данных изображения, чтобы увеличить размер нашего обучающего набора и тестового набора при одновременном уменьшении переобучения. Его также уменьшают за счет применения выпадающего слоя. Затем мы подгоняем CNN к нашему расширенному обучающему набору и тестируем его на нашем расширенном тестовом наборе.
# Подгонка CNN для предварительной обработки изображений крайне важна в проблеме классификации нейронных сетей для удаления артефактов.
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator (
rescale = 1. / 255 ,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator (rescale = 1. / 255)
training_set = train_datagen.flow_from_directory (
'Chess_xraybinary / train',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
test_set = test_datagen.flow_from_directory (
'Chess_xraybinary / test',
target_size = (64,64),
batch_size = 32,
class_mode = 'binary')
classifier.fit_generator (
тренировочный_сет,
эпохи = 30,
validation_data = test_set)
После 30 эпох достигается точность 96% на обучающем наборе и 90% на тестовом наборе.
Оценка, улучшение и настройка CNN. Ранее мы создавали CNN с одним сверточным слоем и одним скрытым слоем. На этот раз мы добавим второй сверточный слой и посмотрим, улучшит ли он производительность.
Добавьте следующий код после шага 2 - объединение:
# Добавление классификатора второго сверточного слоя
. add (Convolution2D (32, (3,3), activate = 'relu'))
classifier.add (MaxPooling2D ((2,2)))
Через 30 эпох мы получаем точность 96,5 % на обучающем наборе и 91,5% на тестовом наборе.
Далее, помимо второго сверточного слоя, мы собираемся добавить второй скрытый слой и посмотреть, улучшит ли он производительность. Чтобы добавить второй скрытый слой, мы просто добавляем код для добавления одного скрытого слоя:
# Шаг 4 - Полное соединение
classifier.add (Dense (units = 128, activate = 'relu')) < br /> classifier.add (Dense (units = 128, activate = 'relu'))
classifier.add (Dense (units = 1, activate = 'sigmoid'))
После 30 эпох точность достигла 95,4% на обучающей выборке и 90,6% на тестовой. Этого достаточно для таких небольших наборов данных и для обнаружения ВПС. Созданная модель CNN может легко отличить ВПС от нормальной КТ грудной клетки.
В фазе искусственной нейронной сети CNN путем изменения количества выходных единиц с 1 до 3 и функции активации выхода с «сигмоида» на «softmax», потому что в основном выходной слой состоит из сигмоидной функции или функции активации tanH. При компиляции CNN функция потерь изменяется с «binary_crossentropy» на «categoryorical_crossentropy», потому что binar_crossentropy классифицирует только 2 класса, тогда как category_crossentropy может классифицировать многие классы.
Производительность тестового набора улучшена от CNN с двумя сверточными слоями и двумя скрытыми слоями. Тем не менее, это хорошее улучшение производительности набора тестов по сравнению с CNN с одним сверточным слоем и одним скрытым слоем, а затем увеличиваются размеры изображений, подаваемых в CNN, с 64 на 64 до 128 на 128; это привело к точности 80,85% на обучающем наборе и 85,74% на тестовом наборе, мы можем сказать, что это худшая производительность, которую мы когда-либо достигали. Вывод: увеличение размера приводит к снижению точности наборов данных для обучения и тестирования, однако использование наборов данных для проверки может немного повысить точность.
Я уменьшил размеры входных изображений до 64 на 64 и добавил третий сверточный слой из 128 детекторов признаков, в результате чего точность составила 81,54% на обучающем наборе и 87,34% на тестовом наборе. этот шаг тоже. Оставив те же настройки, после запуска модели CNN на 100 эпох; точность обучающего набора постоянно увеличивалась до 96,32%, в то время как точность тестового набора колебалась от 80 до 86 и, наконец, заканчивалась на уровне 86,54%.
Это в основном из-за обновления веса путем обратного распространения ошибки с каждой успешной эпохой, которая приближается к желаемому результату. Сохранив три сверточных слоя, я добавил больше скрытых слоев, всего 10 скрытых слоев; через 30 эпох я получил точность обучающего набора 79,54% и точность набора тестов 83,33%. Итак, добавление дополнительных скрытых слоев не привело к улучшению, поэтому я думаю прекратить изменять нейронную сеть сейчас.
Заключение:
В этой статье я применил сверточные нейронные сети к проблеме бинарной классификации, чтобы определить, какой из 2 классов
Сердечная болезнь и нормальный
Мы обнаружили, что CNN с одним сверточным слоем и одним скрытым Layer достиг точности 95% на обучающем наборе и 89% на тестовом наборе.
Затем мы добавили второй сверточный слой к CNN и достигли точности 96% на обучающем наборе и точности 91,5% на тестовом наборе; это немного улучшило производительность.
Затем, помимо второго сверточного слоя, мы добавили второй скрытый слой и достигли точности 96% на обучающем наборе и точности 91,5% на тестовом наборе; это не улучшило производительность. Мы применили сверточные нейронные сети к задаче классификации трех классов, чтобы определить, какой из трех классов нормальный, тяжелый и умеренный. Застойная сердечная недостаточность.
Диагностика сердечных заболеваний с помощью ИСКУССТВЕННОГО РАЗУМА и ГЛУБОКОГО ОБУЧЕНИЯ