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

使用 AlexNet 生成 Deep Dream 图像

此示例说明如何使用预训练的卷积神经网络 AlexNet 通过 deepDreamImage 生成图像。

Deep Dream 是深度学习中的一种特征可视化技术,可以合成强烈激活网络层的图像。通过可视化这些图像,您可以突出显示网络所学习的图像特征。这些特征对于理解和诊断网络行为很有用。

您可以通过将靠近网络末端的层的特征可视化来生成有趣的图像。

该示例使用 Deep Learning Toolbox™ 和 Deep Learning Toolbox Model for AlexNet Network 生成图像。

加载预训练网络

加载预训练的 AlexNet 网络。如果未安装 Deep Learning Toolbox Model for AlexNet Network 支持包,则软件会提供下载链接。

net = alexnet;

生成图像

要生成最接近给定类的图像,请选择最终全连接层。首先,通过查看网络 netLayers 属性中的网络架构,找到该层的层索引。

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

然后,选择最终全连接层。最终全连接层为第 23 层。

layer = 23;

您可以通过选择多个类来一次生成多个图像。通过将 channels 设置为这些类名称的索引,选择要可视化的类。

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 

使用 deepDreamImage 生成图像。如果存在兼容的 GPU,此命令会使用 GPU。否则将使用 CPU。在 GPU 上进行训练需要具有 3.0 或更高计算能力的支持 CUDA® 的 NVIDIA® GPU。

I = deepDreamImage(net,layer,channels);
|==============================================|
|  Iteration  |  Activation  |  Pyramid Level  |
|             |   Strength   |                 |
|==============================================|
|           1 |         1.82 |               1 |
|           2 |         4.62 |               1 |
|           3 |         8.05 |               1 |
|           4 |        12.29 |               1 |
|           5 |        18.16 |               1 |
|           6 |        21.09 |               1 |
|           7 |        30.07 |               1 |
|           8 |        34.69 |               1 |
|           9 |        40.84 |               1 |
|          10 |        47.12 |               1 |
|           1 |        15.60 |               2 |
|           2 |        14.05 |               2 |
|           3 |        23.96 |               2 |
|           4 |        21.54 |               2 |
|           5 |        31.55 |               2 |
|           6 |        25.97 |               2 |
|           7 |        34.30 |               2 |
|           8 |        33.81 |               2 |
|           9 |        38.06 |               2 |
|          10 |        33.47 |               2 |
|           1 |        39.11 |               3 |
|           2 |        47.44 |               3 |
|           3 |        52.80 |               3 |
|           4 |        58.48 |               3 |
|           5 |        52.16 |               3 |
|           6 |        63.92 |               3 |
|           7 |        65.21 |               3 |
|           8 |        67.41 |               3 |
|           9 |        76.46 |               3 |
|          10 |        71.61 |               3 |
|==============================================|

使用 imtile 同时显示所有图像。

figure
I = imtile(I);
imshow(I)

生成更详细的图像

增加金字塔等级数和每个金字塔等级的迭代次数可以生成更详细的图像,但代价是额外计算。

您可以使用 'NumIterations' 选项增加迭代次数。将迭代次数设置为 100。

iterations = 100;

生成可强烈激活 "hen" 类(通道 9)的详细图像。将 'Verbose' 设置为 false 以隐藏有关优化过程的详细信息。

channels = 9;
I = deepDreamImage(net,layer,channels, ...
    'Verbose',false, ...
    'NumIterations',iterations);

figure
imshow(I)

要生成更大更详细的输出图像,可以增加金字塔等级数和每个金字塔等级的迭代次数。

将金字塔等级数设置为 4。

levels = 4;

生成可强烈激活 "pot" 类(通道 739)的详细图像。

channels = 739;

I = deepDreamImage(net,layer,channels, ...
    'Verbose',false, ...
    'NumIterations',iterations, ...
    'PyramidLevels',levels);

figure
imshow(I)

另请参阅

|

相关主题