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

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

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

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

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

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

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

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

net = alexnet;

Визуализируйте сверточные слои

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

Используя свойство Layers, просмотрите сетевую архитектуру и найдите сверточные слои. Заметьте, что 2D сверточные слои являются слоями 2, 6, 10, 12, и 14.

net.Layers
ans = 
  25x1 Layer array with layers:

     1   'data'     Image Input                   227x227x3 images with 'zerocenter' normalization
     2   'conv1'    Convolution                   96 11x11x3 convolutions with stride [4  4] and padding [0  0  0  0]
     3   'relu1'    ReLU                          ReLU
     4   'norm1'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     5   'pool1'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     6   'conv2'    Grouped Convolution           2 groups of 128 5x5x48 convolutions with stride [1  1] and padding [2  2  2  2]
     7   'relu2'    ReLU                          ReLU
     8   'norm2'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     9   'pool2'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    10   'conv3'    Convolution                   384 3x3x256 convolutions with stride [1  1] and padding [1  1  1  1]
    11   'relu3'    ReLU                          ReLU
    12   'conv4'    Grouped Convolution           2 groups of 192 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    13   'relu4'    ReLU                          ReLU
    14   'conv5'    Grouped Convolution           2 groups of 128 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    15   'relu5'    ReLU                          ReLU
    16   'pool5'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    17   'fc6'      Fully Connected               4096 fully connected layer
    18   'relu6'    ReLU                          ReLU
    19   'drop6'    Dropout                       50% dropout
    20   'fc7'      Fully Connected               4096 fully connected layer
    21   'relu7'    ReLU                          ReLU
    22   'drop7'    Dropout                       50% dropout
    23   'fc8'      Fully Connected               1000 fully connected layer
    24   'prob'     Softmax                       softmax
    25   'output'   Classification Output         crossentropyex with 'tench' and 999 other classes

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

Установите layer быть первым сверточным слоем. Этот слой является вторым слоем в сети и назван 'conv1'.

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

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

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

channels = 1:56;
I = deepDreamImage(net,layer,channels,'PyramidLevels',1);
|==============================================|
|  Iteration  |  Activation  |  Pyramid Level  |
|             |   Strength   |                 |
|==============================================|
|           1 |         4.80 |               1 |
|           2 |        40.36 |               1 |
|           3 |        75.93 |               1 |
|           4 |       111.50 |               1 |
|           5 |       147.06 |               1 |
|           6 |       182.63 |               1 |
|           7 |       218.20 |               1 |
|           8 |       253.76 |               1 |
|           9 |       289.33 |               1 |
|          10 |       324.90 |               1 |
|==============================================|
figure
I = imtile(I,'ThumbnailSize',[64 64]);
imshow(I)
title(['Layer ',name,' Features'])

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

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

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

layer = 6;
channels = 1:30;
I = deepDreamImage(net,layer,channels,'PyramidLevels',1);
|==============================================|
|  Iteration  |  Activation  |  Pyramid Level  |
|             |   Strength   |                 |
|==============================================|
|           1 |         5.00 |               1 |
|           2 |         2.90 |               1 |
|           3 |        11.25 |               1 |
|           4 |        18.39 |               1 |
|           5 |        23.25 |               1 |
|           6 |        27.79 |               1 |
|           7 |        31.34 |               1 |
|           8 |        35.06 |               1 |
|           9 |        37.35 |               1 |
|          10 |        40.11 |               1 |
|==============================================|
figure
I = imtile(I,'ThumbnailSize',[64 64]);
imshow(I)
name = net.Layers(layer).Name;
title(['Layer ',name,' Features'])

Функции на сверточных слоях 3-5

Для каждого из остающихся сверточных слоев визуализируйте первые 30 изученных функций. Чтобы подавить подробный вывод на процессе оптимизации, установите 'Verbose' на 'false' в вызове deepDreamImage. Заметьте, что слои, которые более глубоки в сетевой урожай более подробные фильтры.

layers = [10 12 14];
channels = 1:30;

for layer = layers
    I = deepDreamImage(net,layer,channels, ...
        'Verbose',false, ...
        'PyramidLevels',1);
    
    figure
    I = imtile(I,'ThumbnailSize',[128 128]);
    imshow(I)
    name = net.Layers(layer).Name;
    title(['Layer ',name,' Features'])
end

Визуализируйте полносвязные слоя

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

Выберите первые два полносвязных слоя (слои 17 и 20).

layers = [17 20];

Для каждого из этих слоев используйте deepDreamImage, чтобы визуализировать первые шесть функций. Установите 'NumIterations' на 50 в вызове deepDreamImage производить более подробные изображения. Изображения, сгенерированные от итогового полносвязного слоя, соответствуют классам изображений.

channels = 1:6;

for layer = layers
    I = deepDreamImage(net,layer,channels, ...
        'Verbose',false, ...
        'NumIterations',50);
    
    figure
    I = imtile(I,'ThumbnailSize',[128 128]);
    imshow(I)
    name = net.Layers(layer).Name;
    title(['Layer ',name,' Features'])
end

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

layer = 23;
channels = [9 188 231 563 855 975];

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

net.Layers(end).Classes(channels)
ans = 6×1 categorical array
     hen 
     Yorkshire terrier 
     Shetland sheepdog 
     fountain 
     theater curtain 
     geyser 

Сгенерируйте подробные изображения, которые строго активируют эти классы.

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

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

|

Похожие темы