Моя страсть заключается в искусственном интеллекте, и я хочу, чтобы мое наследие было в области здравоохранения с использованием ИИ. Итак, в надежде осуществить свою мечту, а также попрактиковаться в ООП-подходе к реализации нейронных сетей, я начну первую часть длинной серии КТ-сканирований легких. Я собираюсь начать эту серию с реализации стандартного 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, чтобы получить к нему доступ пожалуйста, пройдите по этой ссылке. Для перехода на главную страницу репозитория нажмите здесь. Теперь, пожалуйста, следуйте пошаговому руководству.
- Загрузите файл "легких_data_small.zip" по ссылке выше.
2. Скопируйте код из Google Colab на свою игровую площадку. После запуска кода появится небольшая кнопка, как показано выше. (Зеленый ящик). Нажмите «Выбрать файлы» и выберите недавно загруженный файл «light_data_small.zip».
3. Программа завершит загрузку данных в Google Colab и продолжит работу.
Итак, имея в виду приведенное выше короткое руководство, пожалуйста, нажмите здесь, чтобы получить доступ к интерактивному коду.
Заключительные слова
Я сожалею, что говорю это, моей собственной модели. Но я не ожидал многого от этой ванильной модели. Однако я считаю, что автоматические кодировщики - это захватывающие алгоритмы, и я думаю, что есть ОГРОМНЫЕ возможности с автокодировщиками.
Если будут обнаружены какие-либо ошибки, напишите мне по адресу [email protected].
Тем временем подпишитесь на меня в моем твиттере здесь и посетите мой веб-сайт или мой канал Youtube для получения дополнительной информации. Я также сделал сравнение Decoupled Neural Network здесь, если вам интересно.
Ссылка
- Растущий архив медицинских изображений рака. (нет данных). Получено 12 февраля 2018 г. с сайта http://www.cancerimagingarchive.net/.
- Гавриелидес, Мариос А., Киннард, Лиза М., Майерс, Кайл Дж., Перегой, Дженифер, Причард, Уильям Ф., Зенг, Ронгпин,… Петрик, Николас. (2015). Данные от Phantom_FDA. Архив изображений рака. Http://doi.org/10.7937/K9/TCIA.2015.ORBJKMUX
- Вики-сайт архива визуализации рака. (нет данных). Получено 12 февраля 2018 г. с сайта https://wiki.cancerimagingarchive.net/display/Public/Phantom FDA № 9d6953e17646457293a77021aa4cdb37.
- 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/.
- 1. (2017, 04 августа). Автоэнкодеры - биты и байты глубокого обучения - к науке о данных. Получено 12 февраля 2018 г. с сайта https://towardsdatascience.com/autoencoders-bits-and-bytes-of-deep-learning-eaba376f23ad.
- Как сделать два графика бок о бок с помощью Python. (нет данных). Получено 12 февраля 2018 г. с сайта https://stackoverflow.com/questions/42818361/how-to-make-two-plots-side-by-side-using-python.
- Что противоположно numpy.repeat? (нет данных). Получено 12 февраля 2018 г. с сайта https://stackoverflow.com/questions/40617710/what-is-the-opposite-of-numpy-repeat.
- J. (2017, 27 февраля). JaeDukSeo / Python_Basic_Image_Processing. Получено 12 февраля 2018 г. с сайта https://github.com/JaeDukSeo/Python_Basic_Image_Processing.
- Рудер, С. (10 февраля 2018 г.). Обзор алгоритмов оптимизации градиентного спуска. Получено 12 февраля 2018 г. с сайта http://ruder.io/optimizing-gradient-descent/index.html#adam.
- 1. (26 июля 2017 г.). Автоэнкодеры необходимы в глубоких нейронных сетях - на пути к науке о данных. Получено 12 февраля 2018 г. с сайта https://towardsdatascience.com/autoencoders-are-essential-in-deep-neural-nets-f0365b2d1d7c.
- Чжан Р., Изола П., Эфрос А. А., Шехтман Э. и Ван О. (2018). Неоправданная эффективность глубинных функций как метрики восприятия. Препринт arXiv arXiv: 1801.03924.