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

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

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

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

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

Пример требует Deep Learning Toolbox™ и Модели Deep Learning Toolbox для пакета Сетевой поддержки GoogLeNet.

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

Загрузите предварительно обученную сеть 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™ и поддерживаемого устройства графического процессора. Для получения информации о поддерживаемых устройствах смотрите Поддержку графического процессора Релизом (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'])

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

Смотрите также

| | | |

Похожие темы