可视化卷积神经网络的特征
此示例说明如何可视化卷积神经网络学习的特征。
卷积神经网络使用特征对图像进行分类。网络在训练过程中自行学习这些特征。网络在训练过程中学到的内容有时不明确。但是,您可以使用 deepDreamImage
函数将学习的特征可视化。
卷积层输出一个激活三维体,其中沿第三个维度的切片对应于应用到层输入的单个滤波器。网络末尾的全连接层输出的通道对应于较浅层学习的特征的高级组合。
您可以使用 deepDreamImage
生成可强烈激活网络层特定通道的图像,从而将所学习的特征可视化。
该示例需要 Deep Learning Toolbox™,以及 Deep Learning Toolbox Model for GoogLeNet Network 支持包。
加载预训练网络
加载预训练的 GoogLeNet 网络和对应的类名称。这需要 Deep Learning Toolbox™ Model for GoogLeNet Network 支持包。如果未安装此支持包,则软件会提供下载链接。有关所有可用网络的列表,请参阅预训练的深度神经网络。
[net,classNames] = imagePretrainedNetwork("googlenet");
可视化较浅的卷积层
GoogLeNet 网络中有多个卷积层。靠近网络开头的卷积层具有较小的感受野,用于学习较小的低级特征。靠近网络末端的层具有较大的感受野,用于学习较大的特征。
使用 analyzeNetwork
属性,查看网络架构并找到卷积层。
analyzeNetwork(net)
卷积层 1 上的特征
将 layer
设置为第一个卷积层。该层是网络中的第二层,名为 'conv1-7x7_s2'
。
layer = 2; name = net.Layers(layer).Name
name = 'conv1-7x7_s2'
通过将 channels
设置为索引 1:36
的向量,使用 deepDreamImage
可视化该层学习的前 36 个特征。将 'PyramidLevels'
设置为 1,以避免图像缩放。要将图像显示在一起,可以使用 imtile
。
默认情况下,deepDreamImage
使用兼容的 GPU(如果可用)。否则将使用 CPU。使用 GPU 需要 Parallel Computing Toolbox™ 和支持的 GPU 设备。有关受支持设备的信息,请参阅GPU Computing Requirements (Parallel Computing Toolbox)。
channels = 1:36; I = deepDreamImage(net,name,channels, ... 'PyramidLevels',1);
|==============================================| | Iteration | Activation | Pyramid Level | | | Strength | | |==============================================| | 1 | 15.84 | 1 | | 2 | 423.25 | 1 | | 3 | 849.50 | 1 | | 4 | 1275.84 | 1 | | 5 | 1702.21 | 1 | | 6 | 2128.59 | 1 | | 7 | 2554.97 | 1 | | 8 | 2981.36 | 1 | | 9 | 3407.74 | 1 | | 10 | 3834.13 | 1 | |==============================================| Training finished: Max epochs completed.
figure I = imtile(I,'ThumbnailSize',[64 64]); imshow(I) title(['Layer ',name,' Features'],'Interpreter','none')
这些图像主要包含边缘和颜色,指示层 'conv1-7x7_s2'
中的滤波器是边缘检测器和颜色滤波器。
卷积层 2 上的特征
第二个卷积层名为 'conv2-3x3_reduce'
,对应于层 6。通过将 channels
设置为索引 1:36
的向量,可视化该层学习的前 36 个特征。
要在优化过程中隐藏详细输出,请在调用 deepDreamImage.
时将 'Verbose'
设置为 'false'
。
layer = 6; name = net.Layers(layer).Name
name = 'conv2-3x3_reduce'
channels = 1:36; I = deepDreamImage(net,name,channels, ... 'Verbose',false, ... 'PyramidLevels',1, ... 'OutputScaling',"clipped"); figure I = imtile(I,'ThumbnailSize',[64 64]); imshow(I) name = net.Layers(layer).Name; title(['Layer ',name,' Features'],'Interpreter','none')
该层的滤波器将检测比第一个卷积层更复杂的模式。
可视化较深的卷积层
较深的层学习较浅层学习的特征的高级组合。
增加金字塔等级数和每个金字塔等级的迭代次数可以生成更详细的图像,但代价是额外计算。您可以使用 'NumIterations'
选项增加迭代次数,并使用 'PyramidLevels
' 选项增加金字塔层级数。
layer = 97; name = net.Layers(layer).Name
name = 'inception_4e-1x1'
channels = 1:6; I = deepDreamImage(net,name,channels, ... 'Verbose',false, ... "NumIterations",20, ... 'PyramidLevels',2, ... 'OutputScaling', "clipped"); figure I = imtile(I,'ThumbnailSize',[250 250]); imshow(I) name = net.Layers(layer).Name; title(['Layer ',name,' Features'],'Interpreter','none')
请注意,越深入网络的层会产生越详细的滤波器,这些滤波器已学习了复杂的模式和纹理。
可视化全连接层
要生成最接近每个类的图像,请选择全连接层,并将 channels
设置为类的索引。
选择全连接层(层 142)。
layer = 142; name = net.Layers(layer).Name
name = 'loss3-classifier'
通过将 channels
设置为这些类名称的索引,选择要可视化的类。
channels = [114 293 341 484 563 950];
这些类存储在输出层(最后一层)的 Classes
属性中。您可以通过选择 channels
中的条目来查看所选类的名称。
classNames(channels)
ans = 6×1 string
"snail"
"tiger"
"zebra"
"castle"
"fountain"
"strawberry"
生成强烈激活这些类的详细图像。在调用 deepDreamImage
时将 'NumIterations'
设置为 100,以生成更详细的图像。从全连接层生成的图像对应于图像类。
I = deepDreamImage(net,name,channels, ... 'Verbose',false, ... 'NumIterations',100, ... 'PyramidLevels',2, ... 'OutputScaling', "clipped"); figure I = imtile(I,'ThumbnailSize',[250 250]); imshow(I) name = net.Layers(layer).Name; title(['Layer ',name,' Features'])
生成的图像强烈激活所选类。为“zebra”类生成的图像包含明显的斑马条纹,而为“castle”类生成的图像包含塔楼和窗口。
另请参阅
imagePretrainedNetwork
| dlnetwork
| trainingOptions
| trainnet
| deepDreamImage
| occlusionSensitivity
| gradCAM
| imageLIME