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