Визуализация функций сверточной нейронной сети

Этот пример показов, как визуализировать функции, выученные сверточными нейронными сетями.

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

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

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

Для примера требуются Deep Learning Toolbox™ и Deep Learning Toolbox Model для пакета поддержки GoogLeNet Network.

Загрузка предварительно обученной сети

Загрузите предварительно обученную сеть GoogLeNet.

net = googlenet;

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

В сети GoogLeNet существует несколько сверточных слоев. Сверточные слои к началу сети имеют небольшой размер рецептивного поля и изучают небольшие низкоуровневые функции. Слои к концу сети имеют большие размеры восприимчивого поля и изучают большие функции.

Использование analyzeNetworkпросмотрите сетевую архитектуру и найдите сверточные слои.

analyzeNetwork(net)

Функции на сверточном слое 1

Задайте layer быть первым сверточным слоем. Этот слой является вторым слоем в сети и имеет имя 'conv1-7x7_s2'.

layer = 2;
name = net.Layers(layer).Name
name = 
'conv1-7x7_s2'

Визуализируйте первые 36 функции, выученных этим слоем, используя deepDreamImage путем установки channels быть вектором индексов 1:36. Задайте 'PyramidLevels' равным 1, чтобы изображения не масштабировались. Чтобы отображать изображения вместе, можно использовать imtile.

deepDreamImage использует совместимый графический процессор, по умолчанию, при наличии. В противном случае используется центральный процессор. Для использования графический процессор требуется Parallel Computing Toolbox™ и поддерживаемый графический процессор. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox).

channels = 1:36;
I = deepDreamImage(net,name,channels, ...
    'PyramidLevels',1);
|==============================================|
|  Iteration  |  Activation  |  Pyramid Level  |
|             |   Strength   |                 |
|==============================================|
|           1 |         0.26 |               1 |
|           2 |         6.99 |               1 |
|           3 |        14.24 |               1 |
|           4 |        21.49 |               1 |
|           5 |        28.74 |               1 |
|           6 |        35.99 |               1 |
|           7 |        43.24 |               1 |
|           8 |        50.50 |               1 |
|           9 |        57.75 |               1 |
|          10 |        65.00 |               1 |
|==============================================|
figure
I = imtile(I,'ThumbnailSize',[64 64]);
imshow(I)
title(['Layer ',name,' Features'],'Interpreter','none')

Эти изображения в основном содержат ребра и цвета, что указывает на то, что фильтры на слое 'conv1-7x7_s2' являются детекторами ребер и цветными фильтрами.

Функции на сверточном слое 2

Второй сверточный слой назван 'conv2-3x3_reduce', что соответствует слою 6. Визуализируйте первые 36 функции, выученных этим слоем, установив channels быть вектором индексов 1:36.

Чтобы подавить подробный выход о процессе оптимизации, установите 'Verbose' на 'false' в вызове deepDreamImage.

layer = 6;
name = net.Layers(layer).Name
name = 
'conv2-3x3_reduce'
channels = 1:36;
I = deepDreamImage(net,name,channels, ...
    'Verbose',false, ...
    'PyramidLevels',1);
figure
I = imtile(I,'ThumbnailSize',[64 64]);
imshow(I)
name = net.Layers(layer).Name;
title(['Layer ',name,' Features'],'Interpreter','none')

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

Визуализация более глубоких сверточных слоев

Более глубокие слои изучают высокоуровневые комбинации функций, выученных более ранними слоями.

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

layer = 97;
name = net.Layers(layer).Name
name = 
'inception_4e-1x1'
channels = 1:6;
I = deepDreamImage(net,name,channels, ...
    'Verbose',false, ...
    "NumIterations",20, ...
    'PyramidLevels',2);
figure
I = imtile(I,'ThumbnailSize',[250 250]);
imshow(I)
name = net.Layers(layer).Name;
title(['Layer ',name,' Features'],'Interpreter','none')

Заметьте, что слои, которые глубже в сети, дают более детальные фильтры, которые научились сложным шаблонам и текстурам.

Визуализация полносвязного слоя

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

Выберите полностью соединенный слой (слой 142).

layer = 142;
name = net.Layers(layer).Name
name = 
'loss3-classifier'

Выберите классы, которые нужно визуализировать, установив channels быть индексами этих имен классов.

channels = [114 293 341 484 563 950];

Классы хранятся в Classes свойство выходного слоя (последнего слоя). Можно просмотреть имена выбранных классов, выбрав записи в channels.

net.Layers(end).Classes(channels)
ans = 6×1 categorical
     snail 
     tiger 
     zebra 
     castle 
     fountain 
     strawberry 

Сгенерируйте подробные изображения, которые сильно активируют эти классы. Задайте 'NumIterations' на 100 при вызове deepDreamImage для получения более подробных изображений. Изображения, сгенерированные из полностью соединенного слоя, соответствуют классам изображений.

I = deepDreamImage(net,name,channels, ...
    'Verbose',false, ...
    'NumIterations',100, ...
    'PyramidLevels',2);
figure
I = imtile(I,'ThumbnailSize',[250 250]);
imshow(I)
name = net.Layers(layer).Name;
title(['Layer ',name,' Features'])

Сгенерированные изображения сильно активируют выбранные классы. Изображение, сгенерированное для класса «зебра», содержит отдельные полосы зебры, в то время как изображение, сгенерированное для класса «замок», содержит башенки и окна.

См. также

| | | |

Похожие темы