Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шолле Ф. - Глубокое обучение на Python (Библиотека программиста) - 2023.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
11.34 Mб
Скачать

9.4. Интерпретация знаний, заключенных в сверточной нейронной сети    329

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

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

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

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

9.4. ИНТЕРПРЕТАЦИЯ ЗНАНИЙ, ЗАКЛЮЧЕННЫХ В СВЕРТОЧНОЙ НЕЙРОННОЙ СЕТИ

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

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

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

1. Chen L.-C. et al..Encoder-Decoder.with.Atrous.Separable.Convolution.for.Semantic.Image. Segmentation.//.ECCV,.2018,.https://arxiv.org/abs/1802.02611.

330    Глава 9. Введение в глубокое обучение в технологиях зрения

разработан.широкий.спектр.методов.визуализации.и.интерпретации.этих.представлений..Далее.мы.рассмотрим.три.наиболее.доступных.и.практичных.из.них:

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

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

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

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

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

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

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

в.отдельности..Начнем.с.загрузки.модели,.сохраненной.в.разделе.8.2:

>>>from tensorflow import keras

>>>model = keras.models.load_model( "convnet_from_scratch_with_augmentation.keras")

>>>model.summary()

Model: "model_1"

_________________________________________________________________

Layer (type) Output Shape Param #

=================================================================

input_2 (InputLayer) [(None, 180, 180, 3)] 0

_________________________________________________________________

sequential (Sequential) (None, 180, 180, 3) 0

_________________________________________________________________

rescaling_1 (Rescaling) (None, 180, 180, 3) 0

_________________________________________________________________

9.4. Интерпретация знаний, заключенных в сверточной нейронной сети    331

conv2d_5 (Conv2D) (None, 178, 178, 32) 896

_________________________________________________________________

max_pooling2d_4 (MaxPooling2 (None, 89, 89, 32)

0

_________________________________________________________________

conv2d_6 (Conv2D) (None, 87, 87, 64) 18496

_________________________________________________________________

max_pooling2d_5 (MaxPooling2 (None, 43, 43, 64)

0

_________________________________________________________________

conv2d_7 (Conv2D) (None, 41, 41, 128) 73856

_________________________________________________________________

max_pooling2d_6 (MaxPooling2 (None, 20, 20, 128)

0

_________________________________________________________________

conv2d_8 (Conv2D) (None, 18, 18, 256) 295168

_________________________________________________________________

max_pooling2d_7 (MaxPooling2 (None, 9, 9, 256)

0

_________________________________________________________________

conv2d_9 (Conv2D) (None, 7, 7, 256) 590080

_________________________________________________________________

flatten_1 (Flatten) (None, 12544) 0

_________________________________________________________________

dropout (Dropout) (None, 12544) 0

_________________________________________________________________

dense_1 (Dense) (None, 1) 12545

=================================================================

Total params: 991,041 Trainable params: 991,041 Non-trainable params: 0

_________________________________________________________________

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

Листинг 9.6. Предварительная обработка единственного изображения

from tensorflow

import keras

 

 

import numpy as

np

 

 

img_path = keras.utils.get_file(

 

Загрузить

 

fname="cat.jpg",

 

контрольное

origin="https://img-datasets.s3.amazonaws.com/cat.jpg")

 

изображение

def get_img_array(img_path, target_size): img = keras.utils.load_img(

img_path, target_size=target_size) array = keras.utils.img_to_array(img) array = np.expand_dims(array, axis=0) return array

Открыть файл с изображением и изменить его размер

Преобразовать изображение в массив NumPy типа float32 с формой (180, 180, 3)

img_tensor = get_img_array(img_path, target_size=(180, 180))

Добавить измерение для преобразования массива в «пакет» с единственным образцом. Теперь он имеет форму (1, 180, 180, 3)

Сохранить имена слоев для последующего использования
Извлечь выход всех слоев Conv2D и MaxPooling2D

332    Глава 9. Введение в глубокое обучение в технологиях зрения

Отобразим.исходное.изображение.(рис..9.12).

Листинг 9.7. Отображение контрольного изображения

import matplotlib.pyplot as plt plt.axis("off") plt.imshow(img_tensor[0].astype("uint8")) plt.show()

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

Рис. 9.12. Контрольное изображение кошки

Листинг 9.8. Создание экземпляра модели, возвращающей активации слоя

from tensorflow.keras import layers

layer_outputs = [] layer_names = []

for layer in model.layers:

if isinstance(layer, (layers.Conv2D, layers.MaxPooling2D)): layer_outputs.append(layer.output)

layer_names.append(layer.name) activation_model = keras.Model(inputs=model.input, outputs=layer_outputs)

Создать модель, возвращающую выходы с учетом заданного входа

9.4. Интерпретация знаний, заключенных в сверточной нейронной сети    333

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

Листинг 9.9. Использование модели для вычисления активаций слоев

Вернет список с девятью массивами activations = activation_model.predict(img_tensor) NumPy: по одному массиву

на каждую активацию слоя

Возьмем.для.примера.активацию.первого.сверточного.слоя.для.входного.изображения.кошки:

>>>first_layer_activation = activations[0]

>>>print(first_layer_activation.shape) (1, 178, 178, 32)

Это.карта.признаков.178.×.178.с.32.каналами..Попробуем.отобразить.пятый. канал.активации.первого.слоя.оригинальной.модели.(рис..9.13).

Листинг 9.10. Визуализация пятого канала

import matplotlib.pyplot as plt plt.matshow(first_layer_activation[0, :, :, 5], cmap="viridis")

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

334    Глава 9. Введение в глубокое обучение в технологиях зрения

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

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

Листинг 9.11. Визуализация каждого канала для всех промежуточных активаций

 

 

Цикл по активациям

 

 

 

 

 

images_per_row = 16

 

(и именам слоев)

 

 

for layer_name, layer_activation in zip(layer_names, activations):

 

 

 

 

 

 

 

 

 

 

n_features = layer_activation.shape[-1]

 

Активация слоя имеет форму

 

 

 

 

 

 

 

 

 

 

 

size = layer_activation.shape[1]

 

(1, size, size, n_features)

 

 

Подготовить

 

 

n_cols = n_features // images_per_row

 

 

 

 

 

 

пустую сетку

display_grid = np.zeros(((size + 1) * n_cols - 1,

 

 

 

 

для отображения

 

images_per_row * (size + 1) - 1))

 

 

 

 

всех каналов этой

 

 

 

for col in range(n_cols):

 

 

 

 

 

 

активации

 

 

 

 

 

for row in range(images_per_row):

Это единственный канал (признак)

 

 

 

channel_index = col * images_per_row + row

 

 

 

 

 

 

 

channel_image = layer_activation[0, :, :, channel_index].copy()

 

 

 

 

 

 

if channel_image.sum() != 0:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

channel_image

-= channel_image.mean()

 

 

 

 

 

 

 

channel_image

/= channel_image.std()

 

 

 

 

 

 

 

channel_image

*= 64

 

 

 

 

 

 

 

channel_image

+= 128

 

 

 

 

 

 

 

channel_image = np.clip(channel_image, 0, 255).astype("uint8")

 

 

 

 

 

display_grid[

 

 

 

 

 

 

 

 

col * (size +

1): (col + 1) * size + col,

 

 

 

 

 

row * (size +

1) : (row + 1) * size + row] = channel_image

 

 

 

scale = 1. / size

 

 

 

 

 

 

 

 

 

 

 

 

 

 

plt.figure(figsize=(scale

* display_grid.shape[1],

 

 

 

 

 

 

 

scale

* display_grid.shape[0]))

 

Отобразить

 

 

 

plt.title(layer_name)

 

 

 

 

 

 

 

сетку для слоя

 

 

 

plt.grid(False)

 

 

 

 

 

 

 

 

 

 

 

 

plt.axis("off")

 

 

 

 

 

 

 

plt.imshow(display_grid, aspect="auto", cmap="viridis")

 

 

 

 

 

Поместить матрицу канала

Нормализовать значения канала, приведя их

 

 

 

в подготовленную пустую сетку

к диапазону [0, 255]. Все нулевые каналы остаются нулевыми

 

 

 

Вот.несколько.замечаний.к.полученным.результатам.

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

.По.мере.подъема.вверх.по.слоям.активации.становятся.все.более.абстракт- ными,.а.их.визуальная.интерпретация.—.все.более.сложной..Они.начинают. кодировать.высокоуровневые.понятия,.такие.как.«кошачье.ухо».или.«коша-

9.4. Интерпретация знаний, заключенных в сверточной нейронной сети    335

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

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

Рис. 9.14. Все каналы всех активаций слоев для контрольного изображения кошки

336    Глава 9. Введение в глубокое обучение в технологиях зрения

Мы.только.что.рассмотрели.важную.универсальную.характеристику.представлений,.создаваемых.глубокими.нейронными.сетями:.признаки,.извлекаемые.слоями,.становятся.все.более.абстрактными.с.глубиной.слоя..Активации. на.верхних.слоях.содержат.все.меньше.и.меньше.информации.о.конкретном. входном.изображении.и.все.больше.и.больше.—.о.цели.(в.данном.случае.о.клас- се.изображения.—.кошка.или.собака)..Глубокая.нейронная.сеть.фактически. действует.как.конвейер очистки информации,.который.получает.неочищенные. исходные.данные.(в.данном.случае.изображения.в.формате.RGB).и.подвергает. их.многократным.преобразованиям,.фильтруя.ненужную.информацию.(например,.конкретный.внешний.вид.изображения).и.оставляя.и.очищая.нужную. (например,.класс.изображения).

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

Рис. 9.15. Слева: попытки нарисовать велосипед по памяти. Справа: так должен бы выглядеть схематичный рисунок велосипеда