Введение

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

1. Улучшить процесс диагностики

Это очень важно, особенно если раннее выявление и лечение могут принести наилучшие результаты. Использование такого алгоритма может буквально спасти жизнь.

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

2. Профилактика и быстрое лечение инфекции

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

3. Краудсорсинговые исследования

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

4. Лекарства

Машинное обучение использовалось для улучшения лекарств от анестезии до лечения рака груди и ежедневного приема лекарств. Знаменитый суперкомпьютер IBM Watson работает с такими компаниями, как Pfizer, над поиском новых лекарств, особенно для лечения иммунных заболеваний и рака. Google занимается этим уже несколько лет и обнаружил, что машинное обучение обладает впечатляющим потенциалом в разработке и улучшении идей лечения. Персонализированная медицина также является ключом к лечению пациентов в будущем, а машинное обучение помогает персонализировать отзывы пациентов о принимаемых ими лекарствах.

Цель

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

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

1. Респираторные заболевания

Первой крупной эпидемией, относящейся к этой группе болезней, была туберкулёз, поразивший лёгкие. Эта эпидемия была вызвана неприемлемыми условиями труда промышленной революции. Эта проблема со здоровьем была известна много столетий назад, но в тот момент, когда она впервые была признана огромной проблемой со здоровьем, которая спровоцировала множество смертей и значительных потерь. Респираторные заболевания начали лечить в начале XIX века с изобретением стетоскопа французским врачом Рене Теофилем Гиацинтом. С этого момента меры против такого рода заболеваний разделились на профилактику (прививки) и оказание медицинской помощи больным людям.

2. Ковид-19

Covid-19, оказавший большое влияние на наш мир за последние 2 года, представляет собой ветвь респираторного заболевания, вызываемого вирусом SARS-CoV-2, поражающим дыхательные пути. Он передается по воздуху и с каплями, выделяемыми при разговоре, чихании или кашле. Впервые он появился в декабре 2019 года в Ухане, Китай, и быстро распространился по всему миру, пока 11 марта 2020 года ВОЗ не признала его пандемией.

Предыдущие попытки

Несколько десятилетий назад искусственный интеллект (ИИ) стал парадигмой, лежащей в основе множества компьютерных проектов, которые можно было применять в самых разных областях нашей жизни. Одним из них был Здоровье, где влияние ИИ растет с каждым днем. Более того, в настоящее время никто не знает границ в этой области. Из-за нынешней ситуации с пандемией во всем мире ИИ также применялся для лечения болезни Covid-19. В этой работе предлагается система классификации рентгеновских изображений грудной клетки с использованием машинного обучения. В частности, был реализован прототип Deep Learning для выполнения соответствующего распознавания изображений. Точнее, он состоит из нескольких слоев Convolutional Artificial Neurons, а также набора плотных слоев нейронов (Multilayer Perceptron).

Полученная точность классификации превысила 95% при использовании изображений, которые никогда не вводились в нашу систему. Кроме того, была доказана недавняя интерпретация изображений, принадлежащая методам искусственного зрения, в частности, Grad-CAM, которая пытается вернуть наиболее важные области изображения, используемые сверточной нейронной сетью в задаче классификации. На данный момент не подтверждено, похожи ли области, полученные с помощью Grad-CAM, на области, которые врачи-пульмонологи используют для диагностики пневмонии.

Хотя несколько исследований доказали, что эффективность использования нейронных сетей превышает 95%, некоторые люди по-прежнему считают, что человеческий глаз более эффективен, чем ИИ. Из-за быстрого распространения Covid-19 менее чем за три месяца у нас нет запаса аннотированных изображений. Тем не менее, некоторые исследователи разработали механизм, который может передавать информацию от распознавания общих объектов к конкретным, который называется 'DeTraC'. Многие исследователи считают этот метод простым и быстрым в применении. Фактическая эффективность этого метода составляет 95,12 % при чувствительности 97,91 %, специфичности 91,87 % и точности 93,36 %.

Существуют и другие модели, такие как Alibaba, которые работают с изображениями компьютерной томографии. Этот китайский алгоритм ИИ достиг 96% эффективности в обнаружении пневмонии Covid-19.

Сеть Covid — это модель с бесплатным доступом, которая позволяет исследователям улучшать инструмент искусственного интеллекта для обнаружения SARS-CoV-2. Целью этой сети ИИ является содействие разработке высокоточных и практичных решений для глубокого обучения для выявления случаев COVID-19 и ускорения лечения наиболее нуждающихся. В заключение, из-за отсутствия наборов для лабораторного анализа, а также задержек с получением результатов и ограниченных ресурсов, ИИ мог бы стать ценным инструментом для систем здравоохранения и пациентов.

Как это работает?

Чтобы решить проблему классификации рентгеновского изображения грудной клетки пациента, обеспечивающего точную диагностику, как мы обсуждали ранее, мы будем использовать метод искусственного интеллекта под названием >Сверточные нейронные сети. Сеть такого типа состоит из алгоритма, который принимает изображение в качестве входных данных и определяет набор визуальных признаков, для которых он был обучен. Цель этого конкретного проекта — классифицировать входное изображение по одной из пяти возможных диагностик, которые может выполнять наша модель. Таким образом, сеть будет использовать распознанные характеристики изображения для подачи в классическую полностью связанную нейронную сеть и получать в качестве выходных данных прогноз вероятности для пяти различных классов, к которым может принадлежать изображение. . Класс с наибольшей активацией (вероятностью) — это тот, который модель выбирает в качестве правильной диагностики для рентгеновского изображения.

Однако Сверточные нейронные сети также могут быть полезны в аналогичных задачах компьютерного зрения, таких как распознавание объектов и лиц, сегментация изображений, беспилотные автомобили, автоматизация видеоигр, прогнозирование погоды, естественные обработка языка (NLP) и даже инициатива по борьбе с изменением климата, такая как это, которая использует машинное обучение для классификации отходов с использованием современных алгоритмов машинного обучения.

Чтобы упростить и лучше визуализировать то, что делает модель, давайте рассмотрим этот пример:

Для этого изображения модель выдаст следующие прогнозы:

[ 0.001 99.925  0.005  0.067  0.001]
['Bacterial Pneumonia', 'COVID', 'Normal', 'Tuberculosis', 'Viral Pneumonia']

Предыдущий набор значений означает, что обработанное изображение имеет 0,001% вероятность принадлежности к 'Бактериальной пневмонии'класс, вероятность 99,925% принадлежности к классу 'Covid', вероятность 0,005% для нормального состояниякласс, вероятность 0,067% для класса "Туберкулез" и вероятность 0,001% для класса "Вирусная пневмония".

Как видите, класс с наибольшей вероятностью (активация) — второй. Таким образом, это указывает на то, что наиболее правильный диагноз – "Covid". Теперь вы можете подумать, всегда ли для окончательной классификации выбирается наивысшее значение набора прогнозов? Ну, это зависит от типа проблемы, с которой вы столкнулись. Пороговое число может определять значение, от которого класс должен быть активным или нет. Таким образом, работа с активациями действительно является довольно хорошим приближением к искусственному процессу работы нашего мозга.

Сверточные сети в глубине

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

Вот некоторые из лучших мест для получения больших объемов данных для проектов искусственного интеллекта и машинного обучения:

В этом случае мы создали набор данных из 23472 файлов изображений, извлеченных со следующих сайтов:

-Ковид, пневмония и нормальное состояние

-Туберкулез

Предварительная обработка данных

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

Типичный способ предварительной обработки данных — использование библиотек Python, таких как Keras в данном случае. Например, если файл изображения поврежден или пуст, его следует удалить из набора данных во избежание ошибок. В другом случае, если размер файла отличается от остальных, его следует изменить до правильных размеров. Таким образом, существует метод предварительной обработки данных, называемый «увеличение данных», который иногда может помочь улучшить производительность нашей модели. Поворачивая, изменяя масштаб, перемещая и применяя набор преобразований к входным изображениям, он может увеличить способность модели обобщать особенности, которые она изучает.

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

Вот пример предварительной обработки данных в этом проекте:

  1. Но сначала мы импортируем библиотеки, которые нам понадобятся для разработки проекта.
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import itertools
import math
import os

2. Набор данных загружен на 'GitHub', поэтому мы должны загрузить его, клонировав содержащий его репозиторий.

!git clone https://github.com/cardstdani/covid-classification-ml.git

3. После клонирования репозитория набор данных будет расположен по пути, указанному в переменной 'DIR'. Следующий код разбивает первичный набор данных на обучающий и тестовый наборы с коэффициентом 90/10 соответственно.

Это разделение данных предназначено для обучения модели с помощью обучающего набора и проверки точности и способности к обобщению с помощью тестового набора, чтобы модель никогда не "видела"какие-либо данные из тестовый набор. Случайные изображения выбираются из всех классов наборов данных в процессе разделения. Кроме того, параметр 'seed' может изменить случайность метода, используемого для подачи данных генератору случайных чисел, участвующему в выборе изображений, которые будут в каждом наборе.

Как видно ниже, функция 'image_dataset_from_directory'из Keras API имеет параметр с именем 'image_size'который нормализует размер всех изображений внутри каталога набора данных. Если какой-то образец имеет несовместимый размер, он использует параметр 'smart_resize', чтобы изменить его размер до 'image_size' параметр.

DIR = "/content/covid-classification-ml/Covid19_Dataset"
train_dataset = tf.keras.preprocessing.image_dataset_from_directory(DIR, validation_split=0.1, subset="training", seed=42, batch_size=32, smart_resize=True, image_size=(256, 256))
test_dataset = tf.keras.preprocessing.image_dataset_from_directory(DIR, validation_split=0.1, subset="validation", seed=42, batch_size=32, smart_resize=True, image_size=(256, 256))

4. Количество классов определяется автоматически по количеству подпапок внутри основной папки набора данных, как вы можете видеть на этом изображении.

Затем все классы набора данных содержатся в свойстве 'class_names' объекта'train_dataset'. Наконец, остальная часть кода повышает производительность процесса обучения. Вы можете найти дополнительную информацию о том, как 'tf.data.AUTOTUNE' оптимизирует его, по следующей ссылке.

classes = train_dataset.class_names
numClasses = len(train_dataset.class_names)
print(classes)
AUTOTUNE = tf.data.AUTOTUNE
train_dataset = train_dataset.prefetch(buffer_size=AUTOTUNE)
test_dataset = test_dataset.prefetch(buffer_size=AUTOTUNE)

Искусственные нейронные сети (ИНС)

Поскольку мы работаем с 'размеченными'данными, важно знать, что мы сталкиваемся с проблемой контролируемогообучения. Этот процесс обучения относится к набору задач, в которых входные данные помечаются результатом, который алгоритм должен получить самостоятельно. В этом состоит значение 'помеченных'данных. Обычно эти проблемы в основном связаны с классификацией и регрессией. Однако в искусственном интеллекте есть и другие методы обучения, такие какнеконтролируемоеобучение.Эта последняя процедура состоит из алгоритма глубокого обучения, который опирается на шаблоны в немаркированном наборе данных. Это означает, что у него нет четких инструкций о том, что он должен выдавать на выходе. Следовательно, модель автоматически находит корреляции в данных, извлекая полезные функции и анализируя их структуру, и все это без помеченных данных. Чтобы узнать больше о различных методах обучения, используемых в машинном обучении, вы можете прочитать следующий ресурс:

Но прежде чем объяснять его структуру и принцип работы, давайте сначала узнаем немного больше об искусственных сетях (ИНС). В целом искусственные сети представляют собой вычислительные модели, вдохновленные биологическим мозгом, который составляет основу алгоритмов глубокого обучения. Их основными компонентами являются нейроны, названные так из-за их сходства с самой базовой единицей, из которой состоит физическая нейронная сеть. Кроме того, эти нейроны располагаются в виде ряда слоев, где каждый нейрон связан со всеми нейронами следующего слоя. Этот процесс соединения иногда называют синапсисом. Таким образом, с этой начальной структурой информация может распространяться от входа к выходу сети с целью обучения всей сети.

На изображении выше у вас есть представление нейрона, который является узлом, который принимает n входных значений x0, x1, x2, xnи умножает каждое значение на определенный номер веса, присвоенный каждому входу w0, w1, w2, wn. После выполнения взвешенной суммы он добавляет результаты со значением смещения и передает функцию активации, чьи выходные данные наконец, будет выходом нейрона.

Вот некоторые из наиболее часто используемых функций активации в машинном обучении. Обычно двумя наиболее распространенными являются ReLU (Recified Linear Unit) и Softmax. ,для расчета вероятностей. В общем, его основное применение — помочь всей сети изучить более сложные шаблоны данных, которые вводятся в сеть. Хотя иногда это понятие называют нелинейностью. Подробнее об этом можно узнать из следующего ресурса:

Чтобы наглядно представить, что делает этот процесс, давайте рассмотрим один из самых известных случаев для искусственной нейронной сети:linear регресс.

На изображении выше вы можете видеть двумерный набор данных, представленный синими точками на диаграмме. Кроме того, вы можете наблюдать красную линию, которая является приближением модели к тренду данных. Поскольку формула для линии y=mx+n,просто нейрон с одним входным значением x ( его соответствующий параметрm) и смещение b (intercept) может быть достаточно для построения модели для этого конкретного случая из-за линейности набора данных.

Но с моделью, выбранной со случайным значением, мы не можем сопоставить тренд модели с трендом набора данных. Поэтому нам нужно обучитьмодель, чтобы она научилась шаблону, который моделирует данные. И самый простой и широко используемый способ сделать это — изменить параметры нейрона до тех пор, пока он не даст наилучший результат при подгонке данных.

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

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

Таким образом, с уже выбранной функцией потери для расчета производительности модели нам нужен метод изменения параметров модели, чтобы заставить ее обучаться при минимизации функции потерь. Этот метод называется оптимизатороммодели. Чтобы интуитивно понять, как работают эти алгоритмы оптимизации, давайте посмотрим на следующую анимацию:

Как вы можете видеть слева, наша модель пытается соответствовать предоставленному набору данных. А справа график с основным параметром модели по оси x, который в данном случае относится к наклону линии и соответствующее значение функции потерь для выходных данных модели на оси y. Поэтому для оптимизации (подгонки)параметров модели и одновременной минимизации потерь мы используем алгоритм под названием Градиентный спуск. на основе элементарного набора шагов.

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

  1. Сначала начните со случайной точки и оцените, в каком направлении будет больше всего температура.
  2. Сделайте один шаг вперед в том направлении, которое вы сочли подходящим.
  3. Повторяйте этот процесс, пока не решите, что достигли своей цели.

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

  1. Сначала начните со случайной точки и вычислите градиент (производная)функции, которая связывает параметры с потерями модели в этой точке.
  2. Измените параметры в определенной степени (скорость обучения), чтобы следовать направлению, противоположному градиенту (наклон производной). Поэтому, если скорость обучения слишком высока, ей будет трудно достичь минимального значения. Напротив, для завершения процесса потребуется много ненужного времени, если он слишком мал.
  3. Повторяйте этот процесс, пока процесс не найдет параметры, минимизирующие потери.

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

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

Чтобы прояснить концепцию нейронных сетей, не перегружая эту статью, вы можете более подробно узнать об этой теме с помощью следующей серии видео:

Обнаружение функций на изображениях с помощью сверток

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

Представим, что с самым четким изображением мы хотим обнаружить белые пиксели на изображении 2x2 в градациях серого следующим образом:

В данном случае белые пиксели 1 — это наш признак, который мы хотим обнаружить на изображении, а 0 относится к черным пикселям. Таким образом, первым подходом будет сравнение всех входных значений со значением пикселя объекта, который мы ищем, и сохранение результатов в матрице 2x2, заполненной нулями и те, которые представляют, сколько нашей функции присутствует в каждом пикселе. Поэтому, когда значение пикселя изображения равно черному 0,ноль сохраняется в матрице результатов, также известной как карта объектов. Такой подход в компьютерном зрении называется сверткой. Но чтобы понять это лучше, давайте узнаем, как это работает в больших масштабах с большим изображением и более сложной функцией.

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

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

Чтобы наглядно понять, что происходит внутри операции свертки, давайте взглянем на этот GIF:

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

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

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

На этом этапе вы можете заметить, что размер карты объектов, предоставленной Convolution в качестве выходных данных, меньше исходного размера изображения. Это явление связано с природой этого алгоритма, а именно со свойством шага ядра, которое определяет, сколько пикселей оно должно перемещать по горизонтали или по вертикали на каждом шаге. Например, в следующей анимации у вас есть свертка со значением шага 2. Обратите внимание, что ядро перемещается на 2 пикселя каждый шаг, вызывая функцию map стала намного меньше, чем раньше.

Решение 'проблемы'размера вывода повторяется при добавлении 'отступа'к входному изображению. Заполнение добавляет один или несколько внешних кадров, обычно с нулевыми значениями, к матрице, представляющей изображение. Таким образом, у ядра будет больше места для охвата всего изображения и создания карты объектов с точными размерами в качестве входных данных.

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

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

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

Архитектура сверточных нейронных сетей (CNN)

Теперь давайте найдем и реализуем сверточную нейронную сеть, которая решит нашу первоначальную задачу классификации рентгеновских изображений грудной клетки в Python с использованием Tensorflow и Keras библиотеки.

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

Изучение функций

Выполняя секцию изучения признаков в сети, мы преобразуем нашу первоначальную проблему классификации изображений в более простую задачу классификации набора активаций, где каждая из них относится к обнаруженной функции во входном изображении. Кроме того, чтобы адекватно уменьшить размерность входных данных, мы составим набор Сверточных слоев, которые применяют операцию свертки к входному изображению с использованием нескольких фильтров и запускают функцию активации. (обычно ReLU) на выходной карте объектов, чтобы ввести нелинейность. После добавления в сеть каждого слоя свертки поверх него должен быть помещен слой Pooling. Слои пула являются ключом к максимальному уменьшению выходных данных сверточных слоев без потери важной информации об обнаруженных шаблонах. Его основная работа такая же, как у свертки, за исключением того, что объединение не выполняет взвешенную сумму элементов, покрываемых ядром на каждом этапе. Напротив, он напрямую выбирает максимум, минимум или среднее значение этих элементов. Эти варианты операции объединения называются Макс, Минимум и Среднее объединение<. /strong> соответственно, но в сверточных нейронных сетях чаще всего используется Max Pooling из-за его производительности.

На приведенном выше изображении у вас есть представление операции максимального объединения, выполненной на матрице 4x4 с 2x2 kernel с использованием шага по горизонтали и вертикали, равного 2. Как вы можете заметить, функция понижает разрешение исходного изображения, не нарушая его зависимости от пикселя/функции. В этом случае вы можете видеть его как входной и выходной цвета.

Классификация

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

Хотя это не единственный способ связать части сети Convolution и Classification, иногда это может привести к проблемы с переоснащением или просто неправильный способ действий. Такие методы, как GlobalAveragePooling или GlobalMaxPooling, обычно решают проблемы переобучения, вызванные Flatten слой. Его работа очень похожа на пул, который мы видели ранее. Он выполняет операцию объединения всех карт объектов, но на этот раз использует ядро ​​с точными размерами в качестве карты объектов.

После изменения формы карт объектов классификационная сеть, состоящая из сложенных слоев Dense, в которых все узлы связаны с узлами следующего слоя, получает измененные карты объектов и, используя функция активации Softmax возвращает набор активаций для каждого ожидаемого класса.

На приведенном выше изображении у вас есть представление части классификации сети, но если вы хотите более подробно узнать, как работает весь этот процесс, вы можете посмотреть следующие лекции:

Детали реализации

Первое, что нам нужно сделать для построения модели, — это загрузить предварительно обученную часть Convolution из Keras API в качестве базовой модели без последних слоев из который мы будем складывать остальные наши слои. Существуют различные предварительно обученные модели, которые мы можем выбрать для такого рода задачи извлечения признаков, но та, которая обеспечивает наилучшую производительность и занимает меньше всего места для работы, — это MobileNetV3Small. Вы можете увидеть список доступных моделей по следующей ссылке. Они обучаются с помощью imagenet, одного из крупнейших в мире наборов данных, состоящего из миллионов изображений, и ориентированы на повышение производительности сверточных сетей.

baseModel = tf.keras.applications.MobileNetV3Large(input_shape=(256, 256,3), weights='imagenet', include_top=False, classes=numClasses)

После создания базовой сверточной модели мы должны настроить часть классификации, которая имеет решающее значение для использования преимуществ архитектуры базовой модели. В этом случае мы используем слой GlobalMaxPooling2D, чтобы уменьшить размерность карт объектов, и передаем его в плотную сеть, созданную скрытым слоем из 256 нейронов с использованием >ReLU и выходной слой с тем же количеством нейронов, что и классы в нашей задаче (5). В этой части сети также есть слой Пакетная нормализация, который повышает точность результатов модели, и несколько методов уменьшения переобучения, таких как Dropout и L2 регуляризаторы.

last_output = baseModel.layers[-1].output
x = tf.keras.layers.Dropout(0.5) (last_output)
x = tf.keras.layers.GlobalMaxPooling2D() (last_output)
x = tf.keras.layers.Dense(256, activation = 'relu', kernel_regularizer=tf.keras.regularizers.l2(0.02), activity_regularizer=tf.keras.regularizers.l2(0.02),  kernel_initializer='he_normal')(x)
x = tf.keras.layers.BatchNormalization() (x)
x = tf.keras.layers.Dropout(0.45) (x)
x = tf.keras.layers.Dense(numClasses, activation='softmax')(x)
model = tf.keras.Model(inputs=baseModel.input, outputs=x)

После построения архитектуры модели ее необходимо обучить и протестировать, чтобы она соответствовала входному набору данных. Итак, теперь мы определим функцию потерь, используемую для оценки производительности во время обучения, и алгоритм оптимизатора, который будет настраивать параметры модели для минимизации функции потерь. В этом случае мы используем стохастический градиентный спускс начальной скоростью обучения 0,1 в качестве оптимизатора и разреженную категориальную кроссэнтропию,одна из самых обычных потерь в подобных задачах мультиклассовой классификации. В дополнение к потерям мы также добавляем метрику 'точность', которая, как следует из ее названия, показывает производительность модели в виде процента. Тем не менее, мы можем использовать функцию потерь как саму метрику, но основная причина этого не делать — использование каждой из них. Например, основная цель функции потерь — минимизировать ее при обучении для оптимизации модели. В то же время метрика является индикатором того, насколько хорошо модель работает не только при обучении, но и при тестировании и выводе.

model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.1), loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=['accuracy'])

Наконец, мы определяем количество эпох, которые будет обучать модель. Таким образом, в каждую эпоху обучающий набор делится на серию пакетов с количеством изображений, равным размеру пакета(обычно 32). и подается в сеть для соответствия ее параметрам. Таким образом, модель будет обучаться в течение одной эпохи, выполняя столько шагов, сколько пакетов может быть разделено на обучающую выборку. Цель этого разделения данных — контролировать, насколько стабильно алгоритм обучения обучает сеть, как вы можете видеть на следующем изображении:

И последнее, но не менее важное: мы определяем обратный вызов типа LearningRateSchedulerдля уменьшения скорость обучения ступенчато во время обучения, так что она будет делиться на десять каждые шесть эпох.

epochs = 40
stepDecay = tf.keras.callbacks.LearningRateScheduler(lambda epoch: 0.1 * 0.1**math.floor(epoch / 6))
history = model.fit(train_dataset, validation_data=test_dataset, epochs=epochs, callbacks=[stepDecay])

Теперь у нас есть переменная 'history', созданная с помощью функции fit() модели, которая содержит всю информацию, сгенерированную во время обучения, такую ​​как потери и точность с течением времени, количество шагов за эпоху и т. д. Эти данные полезны при визуализации того, как модель эволюционировала от случайной инициализации до состояния, в котором она минимизирует функцию потерь и дает приличную точность. для решения задачи.

Полученные результаты

На изображении выше у вас есть график, показывающий значение потерь для наборов данных обучения и теста на ось y и текущая эпоха по оси x. В начале, поскольку параметры модели задаются случайным образом, общие потери принимают высокое значение и быстро уменьшаются в течение 2–3 последующих эпох. Затем, после того, как он продолжает падать и стабилизироваться, он, наконец, заканчивается фиксированным значением примерно 0,15. Тем не менее, это хороший сигнал, что как тренировочные, так и тестовые потери в конечном итоге стабилизируются с очень близкими значениями. Например, если бы потери при обучении были меньше, чем потери при тестировании в конце обучения, модель переобучила бы данные обучения. Таким образом, его способность к обобщению и производительность для невидимых данных были бы хуже. Чтобы лучше понять, как интерпретировать такие графики:

После завершения процесса обучения модель завершается с общей точностью 95,3%, что является хорошим значением для нейронной сети классификации. Тем не менее, недостаточно полностью внедрить санитарную систему в качестве еще одного инструмента, потому что примерно 5 из 100 человек будут поставлены неправильные диагнозы. Итак, чтобы визуализировать, что означает точность, давайте построим матрицу путаницы и протестируем окончательную модель, сделав несколько прогнозов:

В этой матрице путаницы цель состоит в том, чтобы визуализировать связь между истинными метками и предсказанными метками проверенных данных, нанеся ее на матричный график. Таким образом, на оси y мы представляем истинные метки в виде строк, а на оси x мы поместите те же метки, что и раньше, но на этот раз столбцы представляют предсказанные метки, которые модель дала в качестве выходных данных. Результирующий график для модели, которая идеально соответствует данным, должен выглядеть как единичная матрица, где все предсказанные метки оси x совпадают с соответствующими фактическими метками оси y. В этом случае мы можем наблюдать сильную тенденцию соответствовать матрице идентичности идеальной модели. Хотя мы можем видеть некоторые ошибочно предсказанные значения, особенно по двум типам пневмонии, поскольку точность не достигает 100%. Эта путаница вызывает большинство проблем при подгонке данных за счет снижения общей точности.

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

Заключение

Достигнув точности 95%, мы можем сделать вывод, что модель делает большое количество правильных предположений, но также предстоит проделать большую работу, чтобы улучшить результаты этого алгоритма машинного обучения в таких сложных задачах. Тем не менее, статьи, подобные этой, в которых пытаются объяснить силу современных технологий, применяемых для решения крупномасштабных проблем, которые не могли быть решены ранее, полезны для лучшего общего понимания искусственного интеллекта. Кроме того, знание того, как работает технология, которую мы используем, улучшает нашу способность использовать ее правильно и способствует развитию критического и творческого мышления.

Ресурсы

Ссылка на блокнот Colab с полной реализацией: https://github.com/cardstdani/covid-classification-ml/blob/main/ModelNotebook.ipynb

При сотрудничестве: Алехандро Паскуаль, Хавьер Ньето, Кецаль Гомес, Альберто Руис.