本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

可视化卷积神经网络的特征

此示例说明如何可视化卷积神经网络学习的特征。

卷积神经网络使用特征对图像进行分类。网络在训练过程中自行学习这些特征。网络在训练过程中学到的内容有时不明确。但是,您可以使用 deepDreamImage 函数将学习的特征可视化。

网络的卷积层输出多个二维数组。每个数组(或通道)对应于应用到层输入的过滤器。全连接层输出的通道对应于较浅层学习的特征的高级组合。

您可以使用 deepDreamImage 生成可强烈激活网络层特定通道的图像,从而将所学习的特征可视化。

该示例需要 Deep Learning Toolbox™,以及 Deep Learning Toolbox Model for AlexNet Network 支持包。

加载预训练网络

加载预训练的 AlexNet 网络。

net = alexnet;

可视化卷积层

AlexNet 网络中有五个二维卷积层。靠近网络开头的卷积层具有较小的感受域大小,学习较小的低级特征。靠近网络末端的层具有较大的感受域大小,学习较大的特征。

使用 Layers 属性,查看网络架构并找到卷积层。请注意,二维卷积层是层 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'

通过将 channels 设置为索引 1:56 的向量,使用 deepDreamImage 可视化该层学习的前 56 个特征。将 'PyramidLevels' 设置为 1,以避免图像缩放。要将图像显示在一起,可以使用 imtile

默认情况下,deepDreamImage 使用兼容的 GPU(如果可用)。否则将使用 CPU。在 GPU 上进行训练需要具有 3.0 或更高计算能力的支持 CUDA® 的 NVIDIA® GPU。

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。通过将 channels 设置为索引 1:30 的向量,可视化该层学习的前 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 个特征可视化。要在优化过程中隐藏详细输出,请在调用 deepDreamImage 时将 'Verbose' 设置为 'false'。请注意,更深入网络的层会产生更详细的过滤器。

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 可视化前六个特征。在调用 deepDreamImage 时将 'NumIterations' 设置为 50,以生成更详细的图像。从最终全连接层生成的图像对应于图像类。

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'])

另请参阅

|

相关主题