Main Content

使用 GoogLeNet 的 Deep Dream 图像

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

Deep Dream 是深度学习中的一种特征可视化方法,它会合成可强烈激活网络层的图像。通过可视化这些图像,您可以突出显示通过网络学习到的图像特征。这些图像有助于了解和诊断网络行为。

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

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

加载预训练网络

加载预训练的 GoogLeNet 网络和对应的类名称。这需要 Deep Learning Toolbox™ Model for GoogLeNet Network 支持包。如果未安装此支持包,则软件会提供下载链接。有关所有可用网络的列表,请参阅预训练的深度神经网络

[net,classNames] = imagePretrainedNetwork("googlenet");

生成图像

要生成与给定类最相似的图像,请选择全连接层。首先,使用 analyzeNetwork 查看网络架构,找到此层的层索引。

analyzeNetwork(net)

然后选择全连接层,在此示例中为 142。

layer = 142;
layerName = net.Layers(layer).Name
layerName = 
'loss3-classifier'

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

channels = [114 293 341 484 563 950];

您可以通过选择 channels 中的条目来查看所选类的名称。

classNames(channels)
ans = 6×1 string
    "snail"
    "tiger"
    "zebra"
    "castle"
    "fountain"
    "strawberry"

使用 deepDreamImage 生成图像。如果存在兼容的 GPU,此命令会使用 GPU。否则将使用 CPU。使用 GPU 需要 Parallel Computing Toolbox™ 和支持的 GPU 设备。有关受支持设备的信息,请参阅GPU Computing Requirements (Parallel Computing Toolbox)。要获得更生动的图像,请裁剪图像。

I = deepDreamImage(net,layerName,channels,OutputScaling="clipped");
|==============================================|
|  Iteration  |  Activation  |  Pyramid Level  |
|             |   Strength   |                 |
|==============================================|
|           1 |         0.59 |               1 |
|           2 |         1.24 |               1 |
|           3 |         4.56 |               1 |
|           4 |         7.37 |               1 |
|           5 |        11.30 |               1 |
|           6 |        13.99 |               1 |
|           7 |        16.75 |               1 |
|           8 |        19.87 |               1 |
|           9 |        23.71 |               1 |
|          10 |        28.93 |               1 |
|           1 |         6.66 |               2 |
|           2 |         9.83 |               2 |
|           3 |        15.96 |               2 |
|           4 |        14.49 |               2 |
|           5 |        19.06 |               2 |
|           6 |        22.67 |               2 |
|           7 |        24.10 |               2 |
|           8 |        24.78 |               2 |
|           9 |        27.90 |               2 |
|          10 |        32.13 |               2 |
|           1 |        34.09 |               3 |
|           2 |        40.02 |               3 |
|           3 |        50.95 |               3 |
|           4 |        50.22 |               3 |
|           5 |        50.22 |               3 |
|           6 |        54.28 |               3 |
|           7 |        62.82 |               3 |
|           8 |        70.92 |               3 |
|           9 |        66.08 |               3 |
|          10 |        75.71 |               3 |
|==============================================|
Training finished: Max epochs completed.

使用 imtile 一起显示所有图像。

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

生成更详细的图像

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

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

iterations = 100;

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

channels = 293;
I = deepDreamImage(net,layerName,channels, ...
    Verbose=false, ...
    NumIterations=iterations, ...
    OutputScaling="clipped");

figure
imshow(I)

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

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

levels = 4;

生成一个详细图像,该图像强烈激活 'castle' 类(通道 484)。

channels = 484;

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

figure
imshow(I)

另请参阅

| | | | | | |

相关主题