Узнайте, как работает лучшее решение для конкурса Kaggle по меланоме стоимостью 30 000 долларов, используя EfficientNet и ResNext.

5 месяцев назад я участвовал в моем первом официальном конкурсе SSIM-ISIC Melanoma. Вот краткий обзор конкурса (от Kaggle):

Рак кожи - самый распространенный вид рака. В частности, меланома является причиной 75% смертей от рака кожи, несмотря на то, что она является наименее распространенным раком кожи. По оценкам Американского онкологического общества, в 2020 году будет диагностировано более 100 000 новых случаев меланомы. Также ожидается, что почти 7 000 человек умрут от этой болезни. Как и в случае с другими видами рака, раннее и точное обнаружение - потенциально при помощи науки о данных - может сделать лечение более эффективным.

Лично я чувствую себя очень мотивированным, когда работаю над тем, во что верю. Это чувство находило отклик у меня на протяжении всего соревнования, поскольку рак кожи безмерно разрушает жизни многих людей. Мне как человеку, увлеченному машинным обучением и особенно здравоохранением, это было очень интересно. Так как это были мои первые соревнования, большая часть того, что я делал, было обучением, а не кодированием, и поэтому я попал в 72% лучших.

Этот рассказ будет в основном о моем опыте и первом решении (из которого есть чему поучиться).

Одна из довольно сложных проблем этого соревнования заключается в том, что набор данных был крайне несбалансированным. Областью проблемы была двоичная классификация изображений. Распределение классов было 98% для класса 1 и только 2% для класса 2! Для краткости и не дублирования контента я нашел эту статью весьма полезной для решения этой проблемы:



Остальная часть этой истории будет посвящена решению других задач в этом соревновании.

1. Моделирование:

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

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

  • ResNet и ResNext:

Остаточные сети работают по идее «остаточных блоков», которые имеют соединения с пропуском идентичности. Если вы хотите лучше понять это, ознакомьтесь с этой историей:

Https://towardsdatascience.com/an-overview-of-resnet-and-its-variants-5281e2f56035

ResNext - это просто разновидность ResNet, которая добавляет этап «разделение-преобразование-слияние», когда выходные данные разных путей объединяются путем их сложения.

  • EfficientNet:

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

Объяснение того, как это работает, выходит за рамки этой истории, но вы, вероятно, сможете понять это, если знакомы с различными типами масштабирования:

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

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

Для этой полностью подключенной сети они также использовали Batch Normalization и Dropout, которые также обычно используются во многих сетях.

Это финальный конвейер модели:

Блок модели CNN представляет собой ансамбль из трех моделей CNN, рассмотренных выше. Ансамбль был также новым приемом, который, как я узнал, оказался очень эффективным. Это не только дает вам лучшую точность / результаты, но и потому, что окончательные рейтинги соревнований оцениваются на небольшом подмножестве данных, объединение дает вам гораздо больше шансов выжить после «встряски». Встряхивание - это когда ваши модели превышают обучающие данные, и, следовательно, конечный результат намного хуже, поэтому вы получаете худший ранг.

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

2. Уловки обработки данных и разработка функций:

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

Чтобы обеспечить стабильную проверку, мы использовали данные за 2018 + 2019 + 2020 годы как для поездов, так и для проверки. Мы отслеживаем два результата: cv_all и cv_2020. Первый намного стабильнее второго.

Также распространенный трюк для дальнейшего увеличения размера набора данных - использование увеличения данных. Они использовали очень хорошее сочетание простых и сложных методов увеличения данных. Что касается простых, они использовали вертикальное и горизонтальное переворачивание, случайную яркость и контрастность, а также изменение размера. Для сложных они использовали Gaussian Blur / Gaussian Noise, Elastic transform и Grid distortion. Есть и другие, которые вы можете выбрать из их кода:

transforms_train = A.Compose([
    A.Transpose(p=0.5),
    A.VerticalFlip(p=0.5),
    A.HorizontalFlip(p=0.5),
    A.RandomBrightness(limit=0.2, p=0.75),
    A.RandomContrast(limit=0.2, p=0.75),
    A.OneOf([
        A.MotionBlur(blur_limit=5),
        A.MedianBlur(blur_limit=5),
        A.GaussianBlur(blur_limit=5),
        A.GaussNoise(var_limit=(5.0, 30.0)),
    ], p=0.7),

    A.OneOf([
        A.OpticalDistortion(distort_limit=1.0),
        A.GridDistortion(num_steps=5, distort_limit=1.),
        A.ElasticTransform(alpha=3),
    ], p=0.7),

    A.CLAHE(clip_limit=4.0, p=0.7),
    A.HueSaturationValue(hue_shift_limit=10, sat_shift_limit=20, val_shift_limit=10, p=0.5),
    A.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.1, rotate_limit=15, border_mode=0, p=0.85),
    A.Resize(image_size, image_size),
    A.Cutout(max_h_size=int(image_size * 0.375), max_w_size=int(image_size * 0.375), num_holes=1, p=0.7),    
    A.Normalize()
])

transforms_val = A.Compose([
    A.Resize(image_size, image_size),
    A.Normalize()
])

источник: Github

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

  • Вывод:

Что касается моей модели, я просто использовал модель ResNext с K-кратной перекрестной проверкой. Я изучил концепцию ансамбля, объединения результатов с метаданными, возможности увеличения данных и многих других битов. И я думаю, что это одно из главных преимуществ соревнований Kaggle, они знакомят вас с потрясающим сообществом и своими решениями. Также большое спасибо разделу «Блокноты» на конкурсе Kaggle, где каждый делится своими решениями.

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

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



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

Https://artisanal-motivator-8249.ck.page/5524b8f934