这个例子展示了如何将卷积神经网络学习到的特征可视化。
卷积神经网络的使用特性对图像进行分类。网络在训练过程中自己学习这些特征。网络在训练中学到的东西有时是不清楚的。但是,您可以使用deepDreamImage
函数将学到的特征可视化。
的卷积layers输出一个3D激活卷,其中沿三维的切片对应于应用于层输入的单个过滤器。输出的通道完全连接网络末端的层对应于早期层学习到的特征的高级组合。
您可以通过使用deepDreamImage
生成强烈激活网络层的特定通道的图像。
该示例需要深度学习工具箱™和深度学习工具箱模型为GoogLeNet网络金宝app支持包。
加载一个预先训练好的GoogLeNet网络。
Net = googlenet;
在GoogLeNet网络中有多个卷积层。接近网络开始的卷积层有一个小的接受域大小,学习小的,低级的特征。接近网络末端的层有更大的接受域大小和学习更大的特征。
使用analyzeNetwork
,查看网络结构,定位卷积层。
analyzeNetwork(净)
卷积层1的特征
集层
是第一个卷积层。这一层是网络中的第二层,被命名为“conv1-7x7_s2”
.
图层= 2;name = net.Layers(layer).Name
Name = 'conv1-7x7_s2'
将这一层学习到的前36个特性可视化deepDreamImage
通过设置渠道
是指标的向量1:36
.集“PyramidLevels”
到1,这样图像就不会缩放。要将图像显示在一起,您可以使用imtile
.
deepDreamImage
默认情况下,如果可用,使用兼容的GPU。否则它将使用CPU。使用GPU需要并行计算工具箱™和支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU支金宝app持按版本划分(并行计算工具箱).
频道= 1:36;I = deepDreamImage(net,name,channels,...“PyramidLevels”1);
|==============================================| | 迭代| |金字塔激活水平| | |力量 | | |==============================================| | 1 | 0.26 | 1 | | 2 | 6.99 | 1 | | 3 | 14.24 | 1 | | 4 | 21.49 | 1 | | 5 | 28.74 | 1 | | 6 | 35.99 | 1 | | 7 | 43.24 | 1 | | 8 | 50.50 | 1 | | 9 | 57.75 | 1 | | 10 | 65.00 | 1 | |==============================================|
figure I = imtile(I,“ThumbnailSize”64年[64]);imshow (I)标题([“层”、名称、“特性”),“翻译”,“没有”)
这些图像大多包含边缘和颜色,这表明滤镜在层“conv1-7x7_s2”
是边缘检测器和颜色滤镜。
卷积层2的特性
第二个卷积层被命名“conv2-3x3_reduce”
,对应第6层。通过设置来可视化这一层学习到的前36个特性渠道
是指标的向量1:36
.
若要抑制优化过程的详细输出,请设置“详细”
来“假”
在呼唤deepDreamImage。
图层= 6;name = net.Layers(layer).Name
名称= 'conv2-3x3_reduce'
频道= 1:36;I = deepDreamImage(net,name,channels,...“详细”假的,...“PyramidLevels”1);figure I = imtile(I,“ThumbnailSize”64年[64]);imshow(I) name = net.Layers(layer).Name;标题([“层”、名称、“特性”),“翻译”,“没有”)
这一层的过滤器检测到比第一个卷积层更复杂的模式。
较深层的层学习较早期层学习过的特征的高级组合。
增加金字塔层的数量和每个金字塔层的迭代次数可以产生更详细的图像,但需要额外的计算。方法可以增加迭代的次数“NumIterations”
选项,并使用'增加金字塔等级的数量PyramidLevels
”选项。
图层= 97;name = net.Layers(layer).Name
名称= 'inception_4e-1x1'
渠道= 1:6;I = deepDreamImage(net,name,channels,...“详细”假的,...“NumIterations”, 20岁,...“PyramidLevels”2);figure I = imtile(I,“ThumbnailSize”250年[250]);imshow(I) name = net.Layers(layer).Name;标题([“层”、名称、“特性”),“翻译”,“没有”)
注意,在网络中更深的层产生了更详细的过滤器,学习了复杂的模式和纹理。
要产生最接近每个类的图像,选择完全连接层,并设置渠道
作为类的索引。
选择完全连接层(层142)。
图层= 142;name = net.Layers(layer).Name
名称= 'loss3-classifier'
通过设置选择要可视化的类渠道
作为这些类名的索引。
通道= [114 293 341 484 563 950];
类存储在类
属性的输出层(最后一层)。中的条目可以查看所选类的名称渠道
.
net.Layers(结束). class(渠道)
ans =6×1分类蜗牛老虎斑马城堡喷泉草莓
生成强烈激活这些类的详细图像。集“NumIterations”
打到100的电话deepDreamImage
以产生更详细的图像。从全连接层生成的图像对应于图像类。
I = deepDreamImage(net,name,channels,...“详细”假的,...“NumIterations”, 100,...“PyramidLevels”2);figure I = imtile(I,“ThumbnailSize”250年[250]);imshow(I) name = net.Layers(layer).Name;标题([“层”、名称、“特性”])
生成的图像强烈激活所选类。为“斑马”类生成的图像包含明显的斑马条纹,而为“城堡”类生成的图像包含炮塔和窗户。
googlenet
|deepDreamImage
|occlusionSensitivity
|gradCAM
|imageLIME