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

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

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

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

Загрузите предварительно обученную сеть AlexNet. Если Модель Deep Learning Toolbox™ для пакета Сетевой поддержки AlexNet не установлена, то программное обеспечение обеспечивает ссылку на загрузку.

net = alexnet;

Считайте и покажите изображение. Сохраните его размер для будущего использования.

im = imread(fullfile(matlabroot,'examples','nnet','face.jpg'));
imshow(im)

imgSize = size(im);
imgSize = imgSize(1:2);

Просмотрите сетевую архитектуру

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

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

Слой Image Input задает входной размер. Можно изменить размер изображения прежде, чем передать его через сеть, но сеть также может обработать увеличенные изображения. Если вы питаете сетевые увеличенные изображения, активации также становятся больше. Однако, поскольку сеть обучена на изображениях размера 227 227, это не обучено распознать объекты или функции, больше, чем тот размер.

Покажите активации первого сверточного слоя

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

act1 = activations(net,im,'conv1');

Активации возвращены как трехмерный массив с третьей размерностью, индексирующей канал на conv1 слой. Показать эти активации с помощью imtile функционируйте, измените размерность массива к 4-D. Третья размерность во входе к imtile представляет цвет изображения. Установите третью размерность иметь размер 1, потому что активации не имеют цвета. Четвертая размерность индексирует канал.

sz = size(act1);
act1 = reshape(act1,[sz(1) sz(2) 1 sz(3)]);

Теперь можно показать активации. Каждая активация может принять любое значение, поэтому нормировать выход с помощью mat2gray. Все активации масштабируются так, чтобы минимальная активация была 0, и максимум равняется 1. Отобразите 96 изображений на 8 12 сетка, один для каждого канала в слое.

I = imtile(mat2gray(act1),'GridSize',[8 12]);
imshow(I)

Исследуйте активации в определенных каналах

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

Измените размер активаций в канале 32, чтобы иметь тот же размер как оригинальное изображение и отобразить активации.

act1ch32 = act1(:,:,:,32);
act1ch32 = mat2gray(act1ch32);
act1ch32 = imresize(act1ch32,imgSize);

I = imtile({im,act1ch32});
imshow(I)

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

Найдите самый сильный канал активации

Также можно попытаться найти интересные каналы, программно исследовав каналы с большими активациями. Найдите канал с самой большой активацией с помощью max функционируйте, измените размер и покажите активации.

[maxValue,maxValueIndex] = max(max(max(act1)));
act1chMax = act1(:,:,:,maxValueIndex);
act1chMax = mat2gray(act1chMax);
act1chMax = imresize(act1chMax,imgSize);

I = imtile({im,act1chMax});
imshow(I)

Сравните с оригинальным изображением и заметьте, что этот канал активируется на ребрах. Это активируется положительно на легких левых/темных правых краях, и негативно на темных левых/легких правых краях.

Исследуйте более глубокий слой

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

act5 = activations(net,im,'conv5');
sz = size(act5);
act5 = reshape(act5,[sz(1) sz(2) 1 sz(3)]);

I = imtile(imresize(mat2gray(act5),[48 48]));
imshow(I)

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

[maxValue5,maxValueIndex5] = max(max(max(act5)));
act5chMax = act5(:,:,:,maxValueIndex5);
imshow(imresize(mat2gray(act5chMax),imgSize))

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

В сетке всех каналов существуют каналы, которые могут активироваться на глазах. Исследуйте каналы 3 и 5 далее.

I = imtile(imresize(mat2gray(act5(:,:,:,[3 5])),imgSize));
imshow(I)

Многие каналы содержат области активации, которые являются и легкими и темными. Это положительные и отрицательные активации, соответственно. Однако только положительные активации используются из-за исправленного линейного модуля (ReLU), который следует за conv5 слой. Чтобы исследовать только положительные активации, повторите анализ, чтобы визуализировать активации relu5 слой.

act5relu = activations(net,im,'relu5');
sz = size(act5relu);
act5relu = reshape(act5relu,[sz(1) sz(2) 1 sz(3)]);

I = imtile(imresize(mat2gray(act5relu(:,:,:,[3 5])),imgSize));
imshow(I)

По сравнению с активациями conv5 слой, активации relu5 слой ясно точно определяет области изображения, которые имеют сильные черты лица.

Протестируйте, распознает ли канал глаза

Проверяйте ли каналы 3 и 5 из relu5 слой активируется на глазах. Введите новое изображение одним закрытым глазом на сеть и сравните получившиеся активации с активациями оригинального изображения.

Считайте и покажите изображение одним закрытым глазом и вычислите активации relu5 слой.

imClosed = imread(fullfile(matlabroot,'examples','nnet','face-eye-closed.jpg'));
imshow(imClosed)

act5Closed = activations(net,imClosed,'relu5');
sz = size(act5Closed);
act5Closed = reshape(act5Closed,[sz(1),sz(2),1,sz(3)]);

Постройте изображения и активации в одной фигуре.

channelsClosed = repmat(imresize(mat2gray(act5Closed(:,:,:,[3 5])),imgSize),[1 1 3]);
channelsOpen = repmat(imresize(mat2gray(act5relu(:,:,:,[3 5])),imgSize),[1 1 3]);
I = imtile(cat(4,im,channelsOpen*255,imClosed,channelsClosed*255));
imshow(I)
title('Input Image, Channel 3, Channel 5');

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

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

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

| |

Похожие темы