Разработка нейронной сети для определения того, инфицирована ли клетка или нет, с помощью сверточной нейронной сети.

Повестка дня

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

Развитие

Загрузить данные

Набор данных изображений клеток малярии, доступный здесь, содержит 27 558 изображений инфицированных и неинфицированных клеток малярии.

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

Вы можете увидеть пример ниже.

Этот набор данных содержит равное количество зараженных и незараженных изображений.

Подмножество изображений

Мы разделили изображения на три набора:

Увеличение изображения

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

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

В этом проекте мы использовали 4 различных техники трансформации. Каждый из них описан ниже.

• 10% — Horizontal shift
• 10% — Width shift
• 10 degree — Random rotation, in a range of 360 degrees
• 10% — Zoom 

Создание архитектуры CNN

Это самый важный шаг для нашего проекта. Он состоит из пяти частей -

  1. Свертка
  2. Объединение
  3. Сплющивание
  4. Плотный или полностью связанный
  5. Выбывать

Свертка

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

В операции свертки мы начинаем с ядра, которое представляет собой просто небольшую матрицу весов. Это ядро ​​«скользит» по входным данным, выполняя поэлементное умножение на ту часть входных данных, на которой оно находится в данный момент, а затем суммирует результаты в один выходной пиксель.

Вот пример операции свертки с ядром 3x3 и входным изображением 7x7.

Объединение

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

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

Сглаживание

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

Плотный или полностью связанный слой

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

матрица карты объектов будет преобразована в векторную. С полностью связанными слоями мы объединили эти элементы вместе, чтобы создать модель. Наконец, у нас есть функция активации, такая как softmax, для классификации выходных данных как зараженных или незараженных.

Прекращение обучения

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

Обучение

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

На этапе обучения мы использовали функцию потерь как категориальную кроссэнтропию, потому что мы будем обучать CNN выводить вероятность по 2 классам для каждого изображения, и мы использовали «точность» в качестве матрицы точности.

Тест

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

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

Я не мог представить себе лучшего результата! Сеть выполнила задание с поразительной точностью 95% (приблизительно).

Весь код этого проекта можно найти в моем профиле GitHub: