The translation captures the intended meaning of the original text, which appears to be about exploring feature extraction using CNNs.

Перевод передает задуманное значение оригинального текста, в котором рассматривается исследование извлечения признаков с помощью CNN.

Использование сверточной нейронной сети для проверки специализации в извлечении признаков

(Слева) Извлечение признаков на изображении льва с использованием архитектуры VGG19 CNN (изображение от автора). (Справа) Оригинальное изображение льва (общественное достояние, доступное на Pexels).

Сверточные нейронные сети сегодня являются основным инструментом для задач классификации изображений с использованием машинного обучения. Однако еще одной очень полезной задачей, которую они выполняют до классификации, является извлечение соответствующих признаков изображения. Извлечение признаков – это способ, с помощью которого сверточные нейронные сети распознают ключевые узоры изображения для его классификации. В данной статье будет показан пример выполнения извлечения признаков с использованием TensorFlow и функционального API Keras. Но для начала, чтобы формализовать эти понятия сверточных нейронных сетей, нам нужно сначала поговорить о пиксельном пространстве.

Основы

Пиксельное пространство

Пиксельное пространство – это то, что предполагает его название: это пространство, в котором изображение преобразуется в матрицу значений, где каждое значение соответствует отдельному пикселю. Таким образом, исходное изображение, которое мы видим, когда его подают на вход сверточной нейронной сети, преобразуется в матрицу чисел. В чёрно-белых изображениях эти числа обычно варьируются от 0 (черный) до 255 (белый), а значения между ними – оттенки серого. В данной статье все изображения были нормализованы, то есть каждый пиксель был разделён на 255, чтобы его значение лежало в интервале от 0 до 1.

CNN и пиксельное пространство

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

Цель

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

Метод

Для этого я обучил две сверточные нейронные сети с одной и той же архитектурой, но с различными размерами обучающей выборки: одна с 50 тысяч изображений (это эталон, “умная” сеть), и другую с 10 тысяч изображений (это “тупая” сеть). Затем я разделил слои сверточной нейронной сети, чтобы проверить, что алгоритм видит и какое представление образа он создает изображениями, на которых обучался.

Набор данных

Для этого проекта использовался широко известный набор данных изображений cifar10 [1], общедоступный набор данных, который состоит из 60 тысяч изображений, разделенных на 10 классов, из которых 10 тысяч изображений используются в качестве набора проверки. Изображения имеют размер 32х32 пикселя и являются цветными с тремя цветовыми каналами (RGB).

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

Лягушка.

Реализация в TensorFlow

Реализация показана в следующем фрагменте кода. Чтобы правильно нарезать слои CNN, необходимо использовать функциональный API Keras в TensorFlow вместо последовательного API. Он работает как каскад, где следующий слой вызывается над предыдущим.

import tensorflow as tffrom tensorflow.keras.models import Modelfrom tensorflow.keras.layers import Input, Conv2D, MaxPool2D, Dense, Dropout, Flattenfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStoppingdef get_new_model(input_shape):  '''  Эта функция возвращает скомпилированный CNN с указанными выше спецификациями.  '''    #Определение архитектуры CNN  input_layer = Input(shape=input_shape, name='input')  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_1')(input_layer)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_2')(h)  h = MaxPool2D(pool_size=(2,2), name='pool_1')(h)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_3')(h)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_4')(h)  h = MaxPool2D(pool_size=(2,2), name='pool_2')(h)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_5')(h)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_6')(h)      h = Dense(64, activation='relu', name='dense_1')(h)  h = Dropout(0.5, name='dropout_1')(h)  h = Flatten(name='flatten_1')(h)  output_layer = Dense(10, activation='softmax', name='dense_2')(h)  #Чтобы создать модель, мы передаем входной слой и выходной слой  model = Model(inputs=input_layer, outputs=output_layer, name='model_CNN')  #Затем мы применяем метод compile  model.compile(optimizer='adam',                loss='categorical_crossentropy',                metrics=['accuracy'])    return model

Спецификации архитектуры показаны на рис. 1.

Рис. 1: Описание используемой CNN. Изображение автора.

В качестве оптимизатора используется Adam, функция потерь – категориальная перекрестная энтропия, и метрика используется для оценки просто-accuracy, так как набор данных идеально сбалансирован.

Нарезка CNN

Теперь мы можем нарезать некоторые стратегические слои двух CNN, чтобы проверить уровень обработки изображений. Код реализации показан ниже:

benchmark_layers = model_benchmark.layersbenchmark_input = model_benchmark.inputlayer_outputs_benchmark = [layer.output for layer in benchmark_layers]features_benchmark = Model(inputs=benchmark_input, outputs=layer_outputs_benchmark)

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

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

Первый слой свёртки

Фиктивный

На рис. 2 показаны изображения 16 фильтров сверточного слоя (conv2d_1). Мы видим, что изображения несильно обработаны и имеют много повторяющихся элементов. Можно сказать, что это только первый сверточный слой, что объясняет несильную обработку, и это справедливая оценка. Чтобы справиться с этим, мы рассмотрим первый слой тестовой модели.

Рис. 2: Первый сверточный слой дамми-классификатора. Изображение автора.

Бенчмарк

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

Рис. 3: Первый сверточный слой бенчмарк классификатора. Изображение автора.

Последний сверточный слой

Дамми

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

Рис. 4: Последний сверточный слой дамми-классификатора. Изображение автора.

Бенчмарк

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

Рис. 5: Последний сверточный слой бенчмарк классификатора. Изображение автора.

Как связано с информацией?

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

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

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

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

Рис. 7: Распределение цветов нашего исходного изображения лягушки. Изображение автора.

С позиции теории информации различия в вероятностных распределениях между исходным изображением и полученными изображениями после сверточных слоев представляют собой огромный прирост информации.

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

И, наконец, один из способов рассмотрения неопределенности в ответе классификаторов – это рассмотрение вероятностного распределения по классам. Это вывод функции софтмакс, выполняемый в конце нашей CNN. На рис. 8(слева) показано, что базовый классификатор намного увереннее в классе, с распределением, сосредоточенным на классе лягушек; тогда как на рис. 8(справа) показан запутавшийся пустой классификатор, с наивысшей вероятностью в неправильном классе.

рис. 8: Вероятностные распределения, присвоенные каждым классификатором. Изображение автора.

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

Ссылка на блокнот проекта доступна здесь.

Ссылки

[1] Крижевский, Алекс и Джеффри Хинтон. Извлечение многослойных особенностей из маленьких изображений. (2009): 7.

[2] М. Джогин и др., Извлечение особенностей с использованием сверточных нейронных сетей (CNN) и глубокого обучения (2018), Международная конференция по современным тенденциям в электронике, информационных и коммуникационных технологиях (RTEICT)

[3] К. Симоньян, А. Зиссерман, Очень глубокие сверточные сети для распознавания изображений большого масштаба (2015), Опубликовано в качестве конференционной работы на ICLR 2015

[4] З. Мэтью и Р. Роб. Визуализация и понимание сверточных нейронных сетей (2013), Европейская конференция по компьютерному зрению

[5] Б. Джиостна и Н. Виранджанейулу, Извлечение и классификация признаков с использованием сверточных нейронных сетей (2018), Журнал кибербезопасности и мобильности