Визуализируйте активации нейронной сети для глубокого обучения при помощи LogoNet

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

Сеть распознавания логотипа

Логотипы помогают в идентификации бренда и распознавании. Многие компании включают свои логотипы в рекламу, материалы документации и продвижения. Сеть распознавания логотипа (LogoNet) была разработана в MATLAB® и может распознать 32 логотипа при различных условиях освещения и движениях камеры. Поскольку эта сеть фокусируется только на распознавании, можно использовать его в приложениях, где локализация не требуется.

Необходимые условия

  • Комплект разработчика Arria10 SoC

  • Пакет поддержки Deep Learning HDL Toolbox™ для FPGA Intel и SoC

  • Deep Learning Toolbox™

  • Deep Learning HDL Toolbox™

  • Computer Vision Toolbox™

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

Загружать предварительно обученную серийную сеть LogoNet, введите:

snet = getLogoNetwork();

Создайте целевой объект

Создайте целевой объект, который имеет пользовательское имя для вашего целевого устройства и интерфейса, чтобы соединить ваше целевое устройство к хосту - компьютеру. Интерфейсные опции являются JTAG и Ethernet. Чтобы использовать JTAG, установите Intel™ Quartus™ Standard Edition 18.1 Прайма. Создайте путь к своему установленному Intel исполняемый файл Куарта Прайма, если это уже не настраивается. Например, чтобы установить toolpath, введите:

% hdlsetuptoolpath('ToolName', 'Altera Quartus II','ToolPath', 'C:\altera\18.1\quartus\bin64');

Создать целевой объект, введите:

hTarget = dlhdl.Target('Intel','Interface','JTAG');

Создайте объект рабочего процесса

Создайте объект dlhdl.Workflow класс. Когда вы создаете объект, задаете сеть и имя потока битов. Задайте сохраненную предварительно обученную нейронную сеть LogoNet, snet, как сеть. Убедитесь, что имя потока битов совпадает с типом данных и платой FPGA, для которой вы предназначаетесь. В этом примере целевая плата FPGA является платой Intel Arria10 SOC. Поток битов использует один тип данных.

hW = dlhdl.Workflow('network', snet, 'Bitstream', 'arria10soc_single','Target',hTarget);

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

im = imread('ferrari.jpg');
imshow(im)

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

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

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

analyzeNetwork(snet)

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

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

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

act1 = hW.activations(single(im),'maxpool_1','Profiler','on');
          offset_name          offset_address     allocated_space 
    _______________________    ______________    _________________

    "InputDataOffset"           "0x00000000"     "24.0 MB"        
    "OutputResultOffset"        "0x01800000"     "136.0 MB"       
    "SystemBufferOffset"        "0x0a000000"     "64.0 MB"        
    "InstructionDataOffset"     "0x0e000000"     "8.0 MB"         
    "ConvWeightDataOffset"      "0x0e800000"     "4.0 MB"         
    "EndOffset"                 "0x0ec00000"     "Total: 236.0 MB"

### Programming FPGA Bitstream using JTAG...
### Programming the FPGA bitstream has been completed successfully.
### Finished writing input activations.
### Running single input activations.


              Deep Learning Processor Profiler Performance Results

                   LastLayerLatency(cycles)   LastLayerLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                   10182024                  0.06788                       1           10182034             14.7
    conv_module           10182024                  0.06788 
        conv_1             7088885                  0.04726 
        maxpool_1          3093166                  0.02062 
 * The clock frequency of the DL processor is: 150MHz

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

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

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

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

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

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

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

act1ch33 = act1(:,:,:,22);
act1ch33 = mat2gray(act1ch33);
act1ch33 = imresize(act1ch33,imgSize);

I = imtile({im,act1ch33});
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)

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

Похожие темы