Глубокое обучение для решения наиболее часто диагностируемого рака у женщин

Застряли за платным доступом? Нажмите здесь, чтобы прочитать всю историю с помощью моего Friend Link!

Рак груди - второй по распространенности рак у женщин и мужчин во всем мире. В 2012 году на него приходилось около 12 процентов всех новых случаев рака и 25 процентов всех онкологических заболеваний у женщин.

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

Соревнование

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

Данные

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

dataset train
  benign
   b1.jpg
   b2.jpg
   //
  malignant
   m1.jpg
   m2.jpg
   //  validation
   benign
    b1.jpg
    b2.jpg
    //
   malignant
    m1.jpg
    m2.jpg
    //...

Папка обучения содержит 1000 изображений в каждой категории, а папка проверки - 250 изображений в каждой категории.

Архитектура CNN

Давайте шаг за шагом проанализируем каждый слой сверточной нейронной сети.

Вход

Матрица значений пикселей в форме [WIDTH, HEIGHT, CHANNELS]. Предположим, что наш ввод - [32x32x3].

Свертка

Назначение этого слоя - получить карту объектов. Обычно мы начинаем с небольшого количества фильтров для обнаружения низкоуровневых функций. Чем глубже мы углубляемся в CNN, тем больше фильтров мы используем для обнаружения высокоуровневых функций. Обнаружение признаков основано на «сканировании» входных данных фильтром заданного размера и применении матричных вычислений для получения карты признаков.

Объединение

Цель этого уровня - обеспечить пространственную дисперсию, что просто означает, что система будет способна распознавать объект, даже если его внешний вид каким-либо образом изменяется. Уровень объединения будет выполнять операцию понижения дискретизации по пространственным измерениям (ширина, высота), в результате чего будет получен такой результат, как [16x16x12] для pooling_size = (2, 2).

Полностью подключено

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

Классификация изображений

Полный конвейер классификации изображений можно формализовать следующим образом:

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

Где код?

Без лишних слов, давайте начнем с кода. Полный проект на github можно найти здесь.

Начнем с загрузки всех библиотек и зависимостей.

Затем я загрузил изображения в соответствующие папки.

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

Затем я разделил набор данных на два набора - обучающий и тестовый наборы с 80% и 20% изображениями соответственно. Давайте посмотрим на примеры доброкачественных и злокачественных образов.

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

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

Затем я создал генератор данных для автоматического получения данных из наших папок в Keras. Для этой цели Keras предоставляет удобные функции генератора Python.

Следующим шагом было построение модели. Это можно описать следующими тремя шагами:

  1. В качестве предварительно натренированных гирь я использовал DenseNet201, который уже прошел тренировку в соревнованиях Imagenet. Скорость обучения была выбрана равной 0,0001.
  2. Вдобавок к этому я использовал слой globalaveragepooling, за которым следовали 50% отсевов, чтобы уменьшить чрезмерную подгонку.
  3. Я использовал пакетную нормализацию и плотный слой с 2 ​​нейронами для 2 выходных классов, т.е. доброкачественных и злокачественных с softmax в качестве функции активации.
  4. Я использовал Адама в качестве оптимизатора и бинарную кросс-энтропию в качестве функции потерь.

Давайте посмотрим на выходную форму и параметры каждого слоя.

Перед обучением модели полезно определить один или несколько обратных вызовов. Довольно удобные: ModelCheckpoint и ReduceLROnPlateau.

  • ModelCheckpoint: когда обучение требует много времени для достижения хорошего результата, часто требуется много итераций. В этом случае лучше сохранять копию наиболее эффективной модели только по окончании эпохи, улучшающей показатели.
  • ReduceLROnPlateau: уменьшите скорость обучения, когда показатель перестает улучшаться. Модели часто выигрывают от снижения скорости обучения в 2–10 раз, когда обучение застопоривается. Этот обратный вызов отслеживает количество, и если не наблюдается улучшения для «терпеливого» количества эпох, скорость обучения снижается.

Я тренировал модель за 20 эпох.

Показатели эффективности

Наиболее распространенный показатель для оценки производительности модели - точность. Однако, когда только 2% вашего набора данных относится к одному классу (злокачественный), а 98% - к другому классу (доброкачественный), ошибочная классификация не имеет смысла. Вы можете быть точными на 98% и при этом не выявить ни одного злокачественного заболевания, которое могло бы стать ужасным классификатором.

Точность, отзывчивость и оценка F1

Чтобы лучше понять ошибочную классификацию, мы часто используем следующую метрику, чтобы лучше понять истинные положительные результаты (TP), истинные отрицательные результаты (TN), ложные положительные результаты (FP) и ложные отрицательные результаты (FN).

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

Напомнить - это отношение правильно предсказанных положительных наблюдений ко всем наблюдениям в реальном классе.

F1-Score - это средневзвешенное значение точности и отзывчивости.

Чем выше F1-Score, тем лучше модель. Для всех трех показателей 0 - худшее, а 1 - лучшее.

Матрица путаницы

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

Кривые ROC

Линия под углом 45 градусов - это случайная линия, где площадь под кривой или AUC равна 0,5. Чем дальше кривая от этой линии, тем выше AUC и лучше модель. Максимальное значение, которое может получить модель, - это значение AUC, равное 1, когда кривая образует прямоугольный треугольник. Кривая ROC также может помочь в отладке модели. Например, если нижний левый угол кривой находится ближе к случайной линии, это означает, что модель неправильно классифицируется при Y = 0. Принимая во внимание, что если это случайное значение в правом верхнем углу, это означает, что ошибки возникают при Y = 1.

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

Выводы

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

Ссылки / Дополнительная литература









Прежде чем ты уйдешь

Соответствующий исходный код можно найти здесь.



Контакты

Если вы хотите быть в курсе моих последних статей и проектов, подписывайтесь на меня на Medium. Вот некоторые из моих контактных данных:

Приятного чтения, удачного обучения и удачного кодирования!