www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Помогая лечить рак шейки матки с помощью нейронных сетей

Дата публикации May 26, 2017

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

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

Типы шейки матки

Чтобы принять участие, вам нужно запустить тестовый набор фотографий Kaggle на вашей модели и вывести вероятность того, что каждая фотография будет шейки матки типа 1, типа 2 или типа 3. Соревнование оценивается по наименьшему количеству логов в тестовом наборе, которое наказывает за то, что он ошибается больше, чем за неопределенность. Базовая заявка на Kaggle имеет logloss 1,00575.

Исходное представление Kaggle

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

Урок 1. Убедитесь, что вы умеете различать классы

Я говорю, что вы как личность, вы как человек. Я говорю это потому, что многие проблемы распознавания изображений мы, люди, легко можем сделать. Например,Kaggle's Dog против кошекилиПриложение Силиконовой долины Hotdog, С этими более простыми проблемами вы, вероятно, можете более легко применять методы предварительной обработки, которые могли бы помочь вашему алгоритму (такие как обнаружение острых краев),

Обнаружение Canny Edge на шейках матки 1 типа. Алгоритм смог очертить шейку верхней фотографии, но не нижней фотографии.

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

Урок 2. Использование собственных функций потерь

Я использовал Keras для создания своей сети, и когда я начал, я заметил, что у них не было logloss какфункция потерь, Документы говорят, что функции потери Tensorflow совместимы, поэтому я использовалФункция логлосса Tensorflow, С моими начальными моделями моя потеря проверки была последовательно ниже, чем моя потеря Kaggle. Это было плохо, потому что вместо того, чтобы отразить, как моя модель будет работать в реальном мире, мои потери при проверке дали гораздо более радужную картину.

Валидационная утрата против потери Kaggle для нескольких моделей

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

По-видимому, логлосс и перекрестная энтропия - это одно и то же понятие. Поэтому я переключил свою потерю на категорическую перекрестную энтропию, и моя потеря проверки более точно отражает потерю, которую я получаю от Kaggle.

Урок 3 - Нейронные сети подвержены переоснащению

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

Расходы на поезд и испытания

Я действительно нуждался в помощи, поэтому я решил посмотреть, что люди делают на Kaggle и увиделЯдро Owl1 Первоначальная архитектура, которую я использовал, была профессором Стэнфорда.Андрей Карпатскийрекомендуемые рамки для выбора более сложных функций(Ввод -> [Conv -> Relu -> Conv -> Relu -> Pool] * 3 -> [FC -> Relu] * 2 -> FC), Ядро Owl1 намного проще, похоже на другой фреймворк, который предлагает Karpathy(Вход -> [Conv -> Relu -> Pool] * 2 -> FC -> Relu -> FC]), Owl1 также может похвастаться 0,89, что намного лучше, чем любой полученный мной результат.

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

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

  • Использовал более простую архитектуру (Ввод -> [Conv -> Relu -> Pool] * 2 -> FC -> Relu -> FC])
  • Использовано меньше фильтров
  • Заменил последнюю активацию рэла на танх
  • Поменял оптимизатор с rmsprop на adamax
  • Использовал RGB-версию фотографий вместо оттенков серого
  • Добавлен отсев после ФК

К сожалению, ни одно из этих изменений не позволило мне побить базовый уровень. На данный момент я скопировал модель Owl1, чтобы посмотреть, смогу ли я повторить его результаты. Другой вариант, который я хотел бы рассмотреть, - это использовать одну из готовых моделей Keras, чтобы посмотреть, как она будет работать.

Заключительный урок - нейронные сети сложны и занимают много времени

В конце этого проекта у меня есть:

  • Потратил 11 дней на создание моделей
  • Сделано 30 нейронных сетей
  • Сделано 16 уникальных архитектур
  • Обучено более 607 эпох
  • Потратил более $ 150 в Google Cloud Credit

Это привело кНУЛЬнейронные сети, которые бьют базовый уровень Kaggle. Самая близкая, которая сделала, была первой нейронной сетью, которую я сделал с logloss 1.00616, и только 2 эпохи обучались этому.

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

PCA и SVM Combo

Я справился с базовым уровнем Kaggle альтернативным методом. Я использовал уменьшенную / обрезанную версию изображений в сером цвете и провел их через анализ основных компонентов (PCA). PCA - это метод уменьшения размерности, использующий линейную алгебру для объединения функций (см. пост моего учителя Мэтта Брема для получения дополнительной информации). Каждая фотография размером 100 x 100 представлена ​​10000 переменных, каждая из которых указывает, насколько ярким или темным является пиксель. После прогона фотографий через PCA, я выбрал 61 из 1036 результирующих компонентов (или комбинированных функций), что объясняет 90% различий в яркости / темноте пикселей.

Затем я скормил результаты вклассификатор векторов поддержки scikitlearnиспользуя параметры по умолчанию (gridsearch приводит к худшему баллу). Я едва перескочил через базовое представление Kaggle с лог-лоссом 1.00574 после отправки моих результатов.

Результаты моего PCA / SVM Combo

Источники:

Мобильное видео ODT:https://www.youtube.com/watch?v=N8OGrykSgy0&t=543s

Стэнфордский курс CNN:http://cs231n.github.io/

Keras Docs:https://keras.io/

Блог Кераса:https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

Ядро Owl1:https://www.kaggle.com/the1owl/artificial-intelligence-for-cc-screening

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map