Моя страсть заключается в искусственном интеллекте, и я хочу, чтобы мое наследие было в области здравоохранения с использованием ИИ. Итак, в надежде осуществить свою мечту, а также попрактиковаться в ООП-подходе к реализации нейронных сетей, я начну первую часть длинной серии КТ-сканирований легких. Я собираюсь начать эту серию с реализации стандартного Auto Encoder с Adam Optimizer.

ПРИМЕЧАНИЕ. Все изображения DICOM взяты из Сети архива изображений рака. Если вы планируете использовать эти данные, ознакомьтесь с их политикой использования данных в отношении возраста. В частности, я буду использовать изображения DICOM из набора данных Phantom FDA.

Тренировочные данные и генерируемые шумовые данные

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

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

Сетевая архитектура (графическая форма)

Черный ящик → Введите изображение DICOM размером 512 * 512.

Синий / зеленый квадрат → Encoder Portion, 3 операции свертки и в последнем слое мы векторизуем изображение (Flatten).

Красный / желтый квадрат → Часть декодера, принимает на входе закодированный вектор и изменяет его форму для выполнения трехуровневой операции свертки.

Как видно выше, компоненты, из которых состоит автокодер, очень просты и понятны.

Сетевая архитектура (объектно-ориентированная форма)

Как видно выше, каждая из моделей выполняет три разные функции.
а. Инициализировать → Инициализировать все веса в модели.

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

c. Обратное распространение → Это КЛЮЧЕВАЯ функция модели, где мы вычисляем частоту ошибок для каждого слоя и корректируем вес модели, чтобы узнать оптимальные веса.

Операция с прямой связью (кодировщик / декодер)

Красный прямоугольник → Операция свертки для кодировщика
Синий прямоугольник → Операция на полностью подключенном слое для кодировщика

Синий ящик → Полностью подключенный слой для декодера
Красный ящик → Операция свертки для декодера

Я хочу отметить две вещи.
1. Порядок операций меняется от кодировщика к декодеру. (Или, другими словами, зеркальное отображение.)
2. Чтобы выполнить уменьшение размерности, мы собираемся использовать Mean Pooling в кодировщике. А для повышения качества изображения мы просто собираемся повторить каждый элемент матрицы в декодере.

Обратное распространение (кодировщик / декодер)

Красный ящик → Обновление Adam Optimizer для кодировщика
Синий ящик → Выполнение обратного распространения для кодировщика

Синяя рамка → Выполнение обратного распространения для декодера
Пурпурная рамка → Чтобы передать градиент в кодировщик, вычислите градиент для передачи перед обновлением весов
Красный ящик → Обновление Adam Optimizer для декодера.

Функция наивной стоимости

Для этих обычных автокодировщиков я собираюсь использовать наивную функцию стоимости, которая представляет собой функцию стоимости L2 в квадрате, но с 1/4 в знаменателе, а не с 1/2. Я понимаю, что есть много других функций стоимости, которые мы можем использовать здесь, например SSIM, или мы даже можем использовать VGG 16 в качестве функции стоимости, как показано в статье Неоправданная эффективность глубоких функций как воспринимаемого показателя. А пока остановимся на L2.

Обучение и результаты - стандартный стохастический градиентный спуск

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

Обучение и результаты - Adam Optimizer (высокая скорость обучения)

Скорость обучения для кодировщика → 0,0005
Скорость обучения для декодера → 0,001

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

Обучение и результаты - функция активации ReLU (высокая скорость обучения)

Скорость обучения для кодировщика → 0,000006
Скорость обучения для декодера → 0,0000006

Левый GIF - это первые 50 эпох, а правый GIF - последние 50 эпох, то есть всего 100 эпох. И снова мы видим ту же тенденцию формирования «белого круга» в центре декодированного изображения.

Обучение и результаты - функция активации ReLu (низкая скорость обучения)

Скорость обучения для кодировщика → 0,0000001
Скорость обучения для декодера → 0,00000001

Левый GIF - это первые 50 эпох, а правый GIF - последние 50 эпох, то есть всего 100 эпох. При низкой скорости обучения мы можем видеть легкую часть изображения (левый GIF), однако по мере обучения снова появляется белый кружок.

Обучение и результаты - функция активации Tanh / Arctanh (высокий LR)

Скорость обучения для кодировщика → 0,000006
Скорость обучения для декодера → 0,0000006

Левый GIF - это первые 50 эпох, а правый GIF - последние 50 эпох, то есть всего 100 эпох. Очень похоже на модель активации ReLU с High Learning Rate, но снова заканчивается белым кружком.

Обучение и результаты - функция активации Tanh / Arctanh (низкий LR)

Скорость обучения для кодировщика → 0,0000007
Скорость обучения для декодера → 0,0000001

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

Стоимость с течением времени

Независимо от того, использую ли я функцию активации ReLU, Tanh или Arctan, стоимость, похоже, со временем уменьшается, однако, если вы посмотрите на ось Y, она не где-то рядом с 0 и не в диапазоне, который дает приемлемые изображения с шумоподавлением. .

Интерактивный код

Я перешел на Google Colab для интерактивных кодов! Таким образом, вам понадобится учетная запись Google для просмотра кодов, а также вы не можете запускать сценарии только для чтения в Google Colab, поэтому сделайте копию на своей игровой площадке. Наконец, я никогда не буду спрашивать разрешения на доступ к вашим файлам на Google Диске, просто к сведению. Удачного кодирования!

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

  1. Загрузите файл "легких_data_small.zip" по ссылке выше.

2. Скопируйте код из Google Colab на свою игровую площадку. После запуска кода появится небольшая кнопка, как показано выше. (Зеленый ящик). Нажмите «Выбрать файлы» и выберите недавно загруженный файл «light_data_small.zip».

3. Программа завершит загрузку данных в Google Colab и продолжит работу.

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

Заключительные слова

Я сожалею, что говорю это, моей собственной модели. Но я не ожидал многого от этой ванильной модели. Однако я считаю, что автоматические кодировщики - это захватывающие алгоритмы, и я думаю, что есть ОГРОМНЫЕ возможности с автокодировщиками.

Если будут обнаружены какие-либо ошибки, напишите мне по адресу [email protected].

Тем временем подпишитесь на меня в моем твиттере здесь и посетите мой веб-сайт или мой канал Youtube для получения дополнительной информации. Я также сделал сравнение Decoupled Neural Network здесь, если вам интересно.

Ссылка

  1. Растущий архив медицинских изображений рака. (нет данных). Получено 12 февраля 2018 г. с сайта http://www.cancerimagingarchive.net/.
  2. Гавриелидес, Мариос А., Киннард, Лиза М., Майерс, Кайл Дж., Перегой, Дженифер, Причард, Уильям Ф., Зенг, Ронгпин,… Петрик, Николас. (2015). Данные от Phantom_FDA. Архив изображений рака. Http://doi.org/10.7937/K9/TCIA.2015.ORBJKMUX
  3. Вики-сайт архива визуализации рака. (нет данных). Получено 12 февраля 2018 г. с сайта https://wiki.cancerimagingarchive.net/display/Public/Phantom FDA № 9d6953e17646457293a77021aa4cdb37.
  4. DICOM в Python: импорт данных медицинских изображений в NumPy с помощью PyDICOM и VTK. (2014, 25 октября). Получено 12 февраля 2018 г. с сайта https://pyscience.wordpress.com/2014/09/08/dicom-in-python-importing-medical-image-data-into-numpy-with-pydicom-and-vtk/.
  5. 1. (2017, 04 августа). Автоэнкодеры - биты и байты глубокого обучения - к науке о данных. Получено 12 февраля 2018 г. с сайта https://towardsdatascience.com/autoencoders-bits-and-bytes-of-deep-learning-eaba376f23ad.
  6. Как сделать два графика бок о бок с помощью Python. (нет данных). Получено 12 февраля 2018 г. с сайта https://stackoverflow.com/questions/42818361/how-to-make-two-plots-side-by-side-using-python.
  7. Что противоположно numpy.repeat? (нет данных). Получено 12 февраля 2018 г. с сайта https://stackoverflow.com/questions/40617710/what-is-the-opposite-of-numpy-repeat.
  8. J. (2017, 27 февраля). JaeDukSeo / Python_Basic_Image_Processing. Получено 12 февраля 2018 г. с сайта https://github.com/JaeDukSeo/Python_Basic_Image_Processing.
  9. Рудер, С. (10 февраля 2018 г.). Обзор алгоритмов оптимизации градиентного спуска. Получено 12 февраля 2018 г. с сайта http://ruder.io/optimizing-gradient-descent/index.html#adam.
  10. 1. (26 июля 2017 г.). Автоэнкодеры необходимы в глубоких нейронных сетях - на пути к науке о данных. Получено 12 февраля 2018 г. с сайта https://towardsdatascience.com/autoencoders-are-essential-in-deep-neural-nets-f0365b2d1d7c.
  11. Чжан Р., Изола П., Эфрос А. А., Шехтман Э. и Ван О. (2018). Неоправданная эффективность глубинных функций как метрики восприятия. Препринт arXiv arXiv: 1801.03924.