С момента появления сверточных нейронных сетей в области компьютерного зрения произошли огромные успехи. Невероятная скорость исследований в этой области в сочетании с открытой доступностью огромного количества баз данных изображений в сети дали нам невероятные результаты за последние несколько лет. Расцвет больших сверточных нейронных сетей начался с AlexNet в 2012 году, созданного Алексом Крижевским, Ильей Суцкевер и Джеффри Хинтоном. и стала победителем в конкурсе ImageNet Large-Scale Visual Recognition Challenge в том году. С тех пор исследователи в этой области не оглядывались назад, и результаты в различных областях компьютерного зрения являются ярким доказательством этого. От распознавания лиц в вашем телефоне до вождения автомобилей - огромная мощность CNN используется для решения многих реальных проблем.

Но, несмотря на широкую доступность больших баз данных и предварительно обученных моделей CNN, иногда становится довольно сложно понять, что и как именно изучает ваша большая модель, особенно для людей без необходимого фона машинного обучения. Хотя изучение базовой статистики и вероятности помогает преодолеть некоторые препятствия, но когда дело доходит до отладки больших архитектур свертки, таких как модели Inception, многие люди терпят поражение. Цель большинства людей - просто использовать предварительно обученную модель для некоторой классификации изображений или любой другой связанной задачи, чтобы получить окончательные результаты. Их меньше всего беспокоит внутренняя работа сети, которая может многое рассказать им о том, как и что их сеть изучает, а также отладить ее сбои.

Недавно я наткнулся на потрясающую книгу Deep Learning with Python François Chollet (twitter) . Эта книга станет жемчужиной, если вы только начинаете свой путь к глубокому обучению. Он использует Keras, отличную библиотеку для глубокого обучения и работает с TensorFlow, MXNET и Theano, чтобы объяснить основы, а также новейшие достижения и результаты в области глубокого обучения. Среди множества новых вещей, которые я узнал, читая эту книгу, меня по-настоящему заинтересовало то, как визуализации можно использовать для изучения свёрточных сетей. В этом блоге я резюмировал три метода, которым я научился, и мои результаты по их воспроизведению.

Введите визуализации

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

В этом посте я продемонстрирую несколько способов визуализации выходных данных вашей модели (промежуточных и конечных слоев), которые помогут вам лучше понять работу вашей модели. Я обучил модель InceptionV3 (предварительно обученную в ImageNet), доступную в Keras, на наборе данных распознавания цветов, доступном на Kaggle. Если вы не знакомы с начальными моделями, я бы посоветовал вам просмотреть исходный документ для Начальная архитектура, а затем просмотреть документ InceptionV3 для понимания теория, лежащая в основе этих архитектур.

Я обучил модель для 10 эпох с размером пакета 32, при этом размер каждого изображения был изменен до формы (299, 299, 3), которая требуется для предварительно обученной модели InceptionV3. Моя модель смогла достичь потери при обучении 0,3195 и потери при проверке 0,6377. Я использовал встроенный модуль Keras ImageDataGenerator для увеличения изображений, чтобы модель не слишком быстро подходила к размеру. Вы можете взглянуть на код в моем репозитории github.

Визуализация активаций промежуточного уровня

Чтобы понять, как наша глубокая модель CNN может классифицировать входное изображение, нам нужно понять, как наша модель видит входное изображение, глядя на выходные данные его промежуточных слоев. Таким образом мы сможем узнать больше о работе этих слоев.

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

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

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

Переходя к активациям ReLU (Rectified Linear Units) соответствующих сверточных слоев, все, что они делают, это применяют функцию Relu к каждому пикселю, который равен ReLU(z) = max(0, z), как показано на рисунке ниже. Таким образом, в основном для каждого пикселя функция активации просто ставит либо 0 для всех отрицательных значений, либо само значение пикселя, если оно больше 0.

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

Визуализация фильтров Convnet

Другой способ узнать, что ваша сеть свертки ищет в изображениях, - это визуализировать фильтры слоя свертки. Отображая фильтры сетевого уровня, вы можете узнать о шаблоне, на который будет реагировать каждый фильтр. Это можно сделать, запустив Gradient Descent для значения свертки, чтобы максимизировать отклик определенного фильтра, начиная с пустого входного изображения.

Вот некоторые из шаблонов модели InceptionV3, которые я обучил на наборе данных Flowers.

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

Визуализация тепловых карт активации классов

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

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

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

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

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

Заключение

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