深度学习可视化
评估深度学习模型的性能可以采用多种方法。混淆矩阵回答了一些关于模型性能的问题,但不是全部。我们如何知道模型识别的是正确的特征?
让我们通过可视化探索深度学习模型的一些简单方法,有关更多信息,请使用与文档示例的链接。
今天我将使用的两个模型都经过了以下几类图像的训练:
现在你可以看到,大多数预测都是正确的,但一旦我加入一些不在预期类别中的动物,预测就有点偏差了。这篇文章的其余部分将使用可视化来寻找为什么模型预测了某种方式。
上面的图片没什么令人兴奋的。这些肯定是熊,图像或多或少是针对熊的。
现在!我们用另一个模型。[与上面的代码相同,只是将net1替换为net2]记住一开始:网络正确地预测所有的熊为熊。那么,为什么要花时间把正确的结果形象化呢?
你看到了吗?此模型始终在左下角激活!因此,该模型预测正确,但为什么它预测熊是可疑的。
在我们继续之前还有一件事:如果我们只是挑出网络关注的最强大/不正确的功能会怎么样?
...有趣!去除图像中最强的特征会导致网络预测错误。这意味着该网络不太可能学习真实的动物特征,而是专注于图像的其他方面。大多数情况下,我发现可视化是洞察模型的好方法,但我很少能证明一个“准确”的模型并不是真正准确的预测!!我在这里的工作已经完成了。
老实说,虽然我发现深度梦境在视觉上很令人愉悦,但我并不经常将其作为一种调试技术,尽管我很有兴趣听取任何有成功例子的人的意见。有时,深层梦境对网络的后期层有帮助,在那里其他技术肯定会失败。
但是,在这个特殊的例子中,即使在跑步100次迭代之后,我也无法找到任何特别吸引力。
背景:数据和模型信息
对于这些可视化,我正在使用由我的同事希瑟Gorr创建的模型。您可以找到以往培训GitHub上的模型的代码在这里。 模型和代码的基本前提是使用野生动物数据,看看MATLAB是否可以正确地识别野生动物的类别。示例图像看起来像这样:熊 | 熊 | 熊 | 大角羊 | 大角羊 |
牛 | 牛 | 土狼 | 土狼 | 狗 |
- [熊|Not-Bear]所有熊都应该被归类为“熊”,其他任何东西应该是“不承担”
- [熊|牛|[羊]:3种必须适合类别的动物
熊|不承受分类器(Net1)
熊 | 熊 | 熊 | 不熊 | 不熊 |
不熊 | 不熊 | 不熊 | 不熊 | 不熊 |
熊|牛|羊分类器(net2)
熊 | 熊 | 熊 | 大角羊 | 大角羊 |
牛 | 牛 | 熊 | 熊 | 牛 |
流行的可视化技术
...以及如何使用它们
像LIME、grado - cam和Occlusion Sensitivity这样的技术可以让你深入了解网络,以及为什么网络会选择一个特定的选项。石灰
ImageLime.是在2020B的Matlab中添加了新技术。让我们调查被称为熊的土狼:首先显示预测和信心。[ypred,scores] =分类(Net2,IMG);[〜,topidx] = maxk(得分,3);topscores = scores(topidx);topclasses =类(topidx);数字;imshow(img)titlestring = compose(“%s(%.2f)”,顶括号,topscores');%'标题(Sprintf(加入(Titlestring,“)))); |
然后,用ImageLime.可视化输出。地图= imageLIME (img, net2 YPred);图imshow(img,'InitialMagnification',150) hold on imagesc(map,'AlphaData',0.5) colormap jet colorbar title(sprintf("Image LIME (%s)", YPred)) hold off |
|
这里,imageLIME表示预测的原因在图像的下角。虽然这显然是一个错误的预测,但最强的特征并不是围绕着郊狼。这将表明这些特征对于熊类来说是不正确的。 |
Grad-Cam
让我们用另一种可用的可视化技术——grado - cam来关注这些熊。在这里,我想你会发现一些关于我们使用的模型的非常有趣的事情。 记住net1.检测熊或不熊,和Net2.侦测熊、牛或羊。 让我们来设置grado - cam。%从网络创建一个层图,删除其最终分类层。lgraph = layerGraph (net2);lgraph = removeLayers(lgraph, lgraph. layers (end).Name);dlnet = dlnetwork (lgraph);%需要知道概率层和一个要素层%Incepionv3,使用softmax(315)和最后一个Relu层softmaxname ='predictions_softmax';featureLayerName ='activation_94_relu';
[classfn,分数]= (net1, img)进行分类;% bear1imshow (img);Title (sprintf("%s (%.2f)", classfn, score(classfn)));dlImg = dlarray(单(img), SSC);[featureMap, dScoresdMap] = dlfeval(@gradcam, dlnet, dlImg, softmaxName, featureLayerName, classfn);%多几行用于可视化gradcamMap = sum(featureMap .* sum(dScoresdMap,[1 2]), 3); / /指定一个字段gradcamMap = extractdata (gradcamMap);gradcamMap =重新调节(gradcamMap);gradcamMap = imresize(gradcamMap, inputSize, 'Method', 'bicubic');在熊1、2和3中运行这段代码,使用bear, not-bear模型,结果如下:
闭塞的敏感性
我们今天要讲的最后一个可视化输出是遮挡敏感性。这是迄今为止最容易实现的代码。标签=分类(net1, img);scoreMap = occlusionSensitivity (net1、img标签);image imshow(img) hold on imagesc(scoreMap,'AlphaData',0.5);colormap喷射在这里,您可以看到绵羊被标记为“不承受”的原因在于动物的中心。我已经半失望没有那些大角照亮,但你能做什么?
梯度归因技术
还有更多的可视化技术,比如梯度归因技术,但我想我们已经讲了很多。要了解更多,你可以查看这个DOC示例。在网络洞察中
深深的梦想
在这里,我们可以可视化网络的学习特征。让我们在第二卷积层可视化网络学习到的前25个特征。层=“conv2d_2”;渠道= 1:25;我= deepDreamImage(net2,layer,channels,…“PyramidLevels”,1,…“详细”,0);figure for i = 1:25 subplot(5,5,i) imshow(i (:,:,:,i)) end |
迭代= 100;layername ='new_fc';i = DeepDreamImage(net1,layername,1,...'verbose',false,...'numitorations',迭代);图imshow(i)此图像正在可视化“熊”类。我没有看到评论特别有洞察力,尽管我看到了从其他预押网络创造的非常有吸引力的深梦图像这个例子。
激活
与Deep Dream类似,您可以使用激活来在通过特定频道之后可视化输入图像,该特定通道显示来自网络的学习功能。我= imread(“bear2.JPG”);imgSize =大小(im);imgSize = imgSize (1:2);act1 =激活(im, net1 conv2d_7);深圳=大小(act1);[sz(1) sz(2) 1 sz(3)]);I = imtile(mat2gray(act1),'GridSize',[7 7]);imshow(i)然后,你可以用激活来快速拉动最强的通道激活。
%找到最强的频道[maxvalue,maxvalueindex] = max(max(max(act1))));Act1chmax = Act1(::::,maxvalueIndex);Act1chmax = Mat2Gray(Act1chmax);ACT1CHMAX = IMRESIZE(ACT1CHMAX,IMGSIZE);i = imtile({Im,Act1chmax});imshow(i)
看到一个相关的文件示例有关使用激活的更多方法。
徐
玛丽亚写了一博客帖子我很高兴地告诉大家,文档中有一个新的例子在这里。这有助于显示类之间的相似之处和差异。 您喜欢的任何其他可视化我应该添加到此集合?让我知道在下面的评论中!
|
- 类别:
- 深度学习
评论
要发表评论,请点击在这里登录您的MathWorks帐户或创建新的。