exponenta event banner

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

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

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

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

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

В данном примере требуются Toolbox™ Deep Learning и модель инструментария 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 по умолчанию использует совместимый графический процессор, если он доступен. В противном случае он использует ЦП. Для использования графического процессора требуется 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'])

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

См. также

| | | |

Связанные темы