В этом примере показано, как визуализировать особенности, полученные сверточными нейронными сетями.
Сверточные нейронные сети используют особенности для классификации изображений. Сеть сама изучает эти функции в процессе обучения. Чему учится сеть во время обучения, иногда неясно. Тем не менее, вы можете использовать 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», содержит турели и окна.
deepDreamImage | googlenet | gradCAM | imageLIME | occlusionSensitivity