人工智能

应用机器学习和深度学习

深度学习可视化

评估深度学习模型的性能可以通过多种方式来实现。混淆矩阵回答了关于模型性能的一些问题,但不是全部。我们如何知道模型识别了正确的特征?
让我们通过一些简单的方法来探索使用可视化的深度学习模型,并链接到文档示例以获取更多信息。

背景:数据和模型信息

对于这些可视化,我使用的是我的同事Heather Gorr创建的模型。你可以在GitHub上找到她用来训练模型的代码在这里 模型和代码的基本前提是使用野生动物数据,看看MATLAB是否可以用于正确识别野生动物的类别。示例图像如下所示:
大角羊 大角羊
土狼 土狼
我今天要使用的两个模型是在以下几类图像上训练的:
  1. 【熊|非熊】所有的熊都应该归为“熊”,其他的都应该归为“非熊”
  2. [熊|牛|羊]:3类动物必须符合分类
下面是通过每个网络运行的示例图像。

Bear |非Bear分类器(net1)

受不了 受不了
受不了 受不了 受不了 受不了 受不了

熊|牛|羊分类器(net2)

大角羊 大角羊
现在你可以看到,大多数预测都是正确的,但一旦我添加了一些不属于预期类别的动物,预测就会有一点偏差。这篇文章的其余部分是使用可视化来寻找为什么模型预测了某种方式。

流行的可视化技术

...以及如何使用它们

像LIME, Grad-CAM和Occlusion Sensitivity这样的技术可以让你深入了解网络,以及为什么网络选择一个特定的选项。

石灰

imageLIME是在2020b中添加到MATLAB中的新技术。让我们来研究一下被称为熊的土狼:
从展示预测和信心开始。
[YPred,scores] = category (net2,img);[~,topIdx] = maxk(scores, 3);topScores =分数(topIdx);topClasses =类(topIdx);图;imshow(img) titleString = compose("%s (%.2f)",topClasses,topScores');%' title(sprintf(join(titleString, ";")));
然后,用imageLime可视化输出。
map = imageLIME(net2,img,YPred);图imshow(img,'InitialMagnification',150)按住imagesc(map,'AlphaData',0.5) colormap jet colorbar title(sprintf("Image LIME (%s)", YPred))按住
在这里,imageLIME在图像的下角指示了预测的原因。虽然这显然是一个不正确的预测,但最强大的特征并不是围绕着土狼。这将表明熊类的这些特征是不正确的。

Grad-CAM

让我们使用Grad-CAM来关注熊,这是另一种可视化技术。在这里,我想你会发现一些关于我们使用的模型的非常有趣的事情。 记住——net1检测熊或不熊,和net2检测熊,牛或羊。
让我们设置研究生摄像头。
从网络中创建一个层图,删除其最终的分类层。lgraph = layerGraph(net2);lgraph = removeLayers(lgraph, lgraph. layers (end).Name);Dlnet = dlnetwork(lgraph);你需要知道概率层和特征层% inceptionv3,使用softmax(315)和最后一个ReLU层softmaxName = 'predictions_softmax';featureLayerName = 'activation_94_relu';
[classfn,score] = category (net1,img);% bear1imshow (img);Title (sprintf("%s (%.2f)", classfn, score(classfn))));dlImg = dlarray(single(img),'SSC');[featureMap, dScoresdMap] = dlfeval(@gradcam, dlnet, dlImg, softmaxName, featureLayerName, classfn);多写几行,便于可视化。gradcamMap = sum(featureMap .* sum(dScoresdMap, [1 2]), 3);gradcamMap = extractdata(gradcamMap);gradcamMap = rescale(gradcamMap);gradcamMap = imresize(gradcamMap, inputSize, 'Method', 'bicubic');
对熊1、熊2和熊3运行这段代码,使用熊、不熊模型,结果如下:
上面的图片没什么令人兴奋的。这些肯定是熊,这个可视化或多或少是针对熊的。
现在!我们用另一个模型。[代码与上面相同,只是将net1替换为net2]记住,在最开始:网络正确地预测了所有的熊。那么,为什么要花时间去想象正确的结果呢?
你看到了吗?这个模型总是在左下角激活!所以这个模型的预测是正确的,但是为什么它预测熊是可疑的。
在我们继续之前还有一件事:如果我们只是剔除网络所关注的最强/不正确的功能呢?
...有趣!删除图像中最强的特征会导致网络预测错误。这意味着该网络不太可能学习真实的动物特征,而是专注于图像的其他方面。大多数情况下,我发现可视化对于深入了解一个模型是很好的,但我很少能够证明一个“准确”的模型并不能真正准确地预测!!我在这里的工作结束了。

闭塞的敏感性

我们今天要讨论的最后一个输出可视化是遮挡敏感性。这是到目前为止最容易实现的代码。
标签=分类(net1,img);scoreMap = occlusionSensitivity(net1,img,label);图imshow(img) hold on imagesc(scoreMap,'AlphaData',0.5);colormap喷射
在这里你可以看到羊被标记为“不是熊”的原因是在动物的中心。那些大喇叭没亮我有点失望,但你又能怎么办呢?

梯度归因技术

还有更多的可视化技术,如梯度归因技术,但我认为我们已经涵盖了很多。要了解更多信息,可以查看这个医生的例子

网络内幕

深的梦想

在这里,我们可以可视化网络的学习特征。让我们将网络在第二层学习到的前25个特征可视化。
Layer = 'conv2d_2';通道= 1:25;I = deepDreamImage(net2,layer,channels,…“PyramidLevels”,1,…“详细”,0);图i = 1:25 subplot(5,5,i) imshow(i (:,:,:,i))结束
说实话,虽然我发现深度梦境在视觉上很令人愉悦,但我并不倾向于将其作为一种调试技术,尽管我很有兴趣从任何人那里听到成功的例子。有时,深度梦境对网络的后期层是有帮助的,而其他技术肯定会失败。
然而,在这个特殊的例子中,即使在运行100次深度梦境之后,我也找不到任何特别吸引人的东西。
迭代= 100;layerName = 'new_fc';I = deepDreamImage(net1,layerName,1,…“详细”,假的,…“NumIterations”、迭代);图imshow(我)
这个图像显示了“熊”类。我没有看到特别有见地的评论,尽管我看到过非常有吸引力的深度梦境图像,由其他预先训练的网络在这个例子

激活

与深度梦类似,在输入图像经过特定通道后,可以使用激活来可视化输入图像,这些通道显示了从网络中学习到的特征。
im = imread('bear2.JPG');imgSize = size(im);imgSize = imgSize(1:2);Act1 =激活(net1,im,'conv2d_7');Sz =大小(act1);Act1 =重塑(Act1,[sz(1) sz(2) 1 sz(3)]);I = imtile(mat2gray(act1),'GridSize',[7 7]);imshow(我)
然后,你可以使用激活快速拉动最强通道激活。
找到最强的渠道[maxValue,maxValueIndex] = max(max(max(act1)));act1chMax = act1(:,:,:,maxValueIndex);act1chMax = mat2gray(act1chMax);act1chMax = imresize(act1chMax,imgSize);I = imtile({im,act1chMax});imshow(我)
请看相关的文档的例子更多使用激活的方法。

TSNE

玛丽亚写了一篇博客关于这个问题,我很高兴地告诉大家,文档中有一个新例子在这里.这有助于显示类之间的异同。
还有其他你喜欢的我应该添加到这个集合的可视化作品吗?请在下面的评论中告诉我!

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。