主要内容

查看网络行为使用tsne

此示例显示如何使用tsne命令功能查看经过训练的网络中的激活情况。这个视图可以帮助您理解网络是如何工作的。

tsne(统计学和机器学习工具箱)统计和机器学习工具箱中的函数™ 实现t-分布随机邻居嵌入(t-SNE)[1]。该技术将高维数据(如层中的网络激活)映射到二维。该技术使用一种非线性映射,试图保持距离。通过使用t-SNE可视化网络激活,您可以了解网络如何响应。

您可以使用t-SNE来可视化深度学习网络在通过网络层时如何改变输入数据的表示。您还可以使用t-SNE来查找输入数据的问题,并了解网络对哪些观察结果进行了错误分类。

例如,t-SNE可以将softmax层的多维激活减少为具有类似结构的二维表示。生成的t-SNE图中的紧密簇与网络通常正确分类的类相对应。可视化允许您找到出现在错误簇中的点,表示观察到t网络分类不正确。观测值可能标记不正确,或者网络可能预测某个观测值是另一类的实例,因为它与该类的其他观测值相似。请注意,softmax激活的t-SNE缩减仅使用这些激活,而不使用基础观测值a是的。

下载数据集

此示例使用示例食品图像数据集,该数据集包含九个类别的978张食品照片,大小约为77MB。通过调用下载示例FoodImagesData辅助函数;函数的代码显示在本例结束

dataDir = fullfile (tempdir,“ExampleFoodImageDataset”);url =“//www.tatmou.com/金宝appsupportfiles/nnet/data/ExampleFoodImageDataset.zip”如果~存在(dataDir“dir”)mkdir(dataDir);结束下载ExampleFoodImagesData(url,dataDir);
下载MathWorks示例食物图像数据集…这可能需要几分钟下载…下载完成了…将文件解压缩……解压缩完成……完成了。

食品图像分类训练网络

修改SqueezeNet预训练网络,从数据集中对食物图像进行分类。用一个只有9个过滤器的新卷积层替换最后一个卷积层(它有1000个ImageNet类的1000个过滤器)。每个过滤器对应一种类型的食物。

lgraph = layerGraph (squeezenet ());lgraph = lgraph.replaceLayer (“ClassificationLayer_predictions”...分类层(“姓名”“ClassificationLayer_predictions”));newConv =卷积2dlayer ([14 14], 9,“姓名”“conv”“填充”“相同”);lgraph = lgraph.replaceLayer (“conv10”,newConv);

创建一个图像数据存储包含图像数据的路径。将数据存储分割为训练集和验证集,65%的数据用于训练,其余数据用于验证。由于数据集相当小,过拟合是一个重要问题。为了最小化过拟合,使用随机翻转和缩放来增加训练集。

imds=图像数据存储(数据目录,...“IncludeSubfolders”符合事实的“LabelSource”“foldernames”);8月= imageDataAugmenter (“RandXReflection”符合事实的...“随机反射”符合事实的...“RandXScale”(0.8 - 1.2),...“RandYScale”[0.8 - 1.2]);trainingFraction = 0.65;[trainImds,valImds] = splitEachLabel(imds, trainingFraction);augImdsTrain = augmentedImageDatastore([227 227], trainImds,...“DataAugmentation”8月);augImdsVal = augmentedImageDatastore([227 227], valImds);

创建培训选项并培训网络。SqueezeNet是一个小型网络,可以快速培训。您可以在GPU或CPU上进行培训;此示例在CPU上进行培训。

选择= trainingOptions (“亚当”...“初始学习率”1的军医,...“最大时代”30岁的...“ValidationData”augImdsVal,...“详细”假的,...“阴谋”“训练进步”...“ExecutionEnvironment”“cpu”...“最小批量大小”,128);rng默认的net = trainNetwork(augImdsTrain, lgraph, opts);

验证数据进行分类

使用该网络对验证集中的图像进行分类。为了验证该网络在分类新数据时的合理准确性,绘制真实标签和预测标签的混淆矩阵。

图();YPred =分类(净,augImdsVal);confusionchart (valImds。标签,YPred,“专栏摘要”“column-normalized”

该网络能很好地对几种图像进行分类。该网站似乎在寿司图片上遇到了麻烦,将许多图片归为寿司,但也将一些图片归为披萨或汉堡。该网络没有将任何图像分类为热狗类。

计算多个层的激活

为了继续分析网络性能,计算数据集中早期最大池化层、最终卷积层和最终softmax层的每个观测的激活情况。以NxM矩阵的形式输出激活,其中N是观察次数,M是激活的维数。M是空间维度和通道维度的乘积。每一行是一个观察,每一列是一个维度。在softmax层,M = 9,因为食物数据集有9个类。矩阵中的每一行包含9个元素,对应于观察结果属于9类食物中的每一类的概率。

earlyLayerName =“pool1”;最后一名=“conv”;softmaxLayerName =“概率”;pool1Activations =激活(网络,...augImdsVal,earlyLayerName,“输出”“行”);finalConvActivations =激活(网络,...augImdsVal finalConvLayerName,“输出”“行”);softmaxActivations =激活(网络,...augImdsVal、softmaxLayerName、,“输出”“行”);

歧义的分类

您可以使用softmax激活来计算最有可能是不正确的图像分类。定义模棱两可第二大概率与最大概率之比。分类的模糊性在0(几乎确定的分类)和1(几乎像第二类一样可能被分类到最有可能的类别)之间。模糊度接近1表示网络不确定特定图像属于哪一类。这种不确定性可能是由两个类引起的,它们的观察结果看起来与网络非常相似,以至于它们无法了解它们之间的差异。或者,高度模糊可能会发生,因为一个特定的观察包含多个类的元素,所以网络不能决定哪个分类是正确的。注意,低歧义并不一定意味着正确的分类;即使网络对一个类有很高的概率,分类仍然可能是错误的。

(R, RI) = maxk (softmaxActivations 2 2);歧义= R(:, 2)。/ R (: 1);

找到最模糊的图像。

[歧义,歧义idx]=排序(歧义,“下降”);

查看模糊图像的最可能类别和真实类别。

班级名册=独特(valImds.Labels);top10Idx = ambiguityIdx (1:10);top10Ambiguity =模棱两可(1:10);最有=班级名册(RI (ambiguityIdx, 1));secondLikely =班级名册(RI (ambiguityIdx, 2));表(top10Idx top10Ambiguity,最有(1:10),secondLikely (1:10), valImds.Labels (ambiguityIdx (1:10)),...“VariableNames”,[“图像#”“歧义”“最有可能”“第二”“真正的课程”])
ans=10×5表图片# Ambiguity似是而非的Second True Class _______ _________ _________ ____________ ____________ 94 0.9879 burger pizza burger 175 0.96311 hamburger french_fries hot_dog 179 0.94939 pizza burger hot_dog 337 0.93426 sushi生鱼片寿司寿司256 0.92972 sushi pizza pizza 297 0.91776 sushi生鱼片寿司寿司283 0.80407 pizza寿司比萨饼270.80278汉堡披萨法式薯条302 0.79283生鱼片寿司寿司201 0.76034披萨希腊沙拉披萨

该网络预测,图像27最有可能是汉堡包或比萨饼。然而,这张照片实际上是炸薯条。查看图片,看看为什么会发生这种错误分类。

v=27;figure();imshow(valImds.Files{v});title(sprintf(“观察:%i\n”+...“实际:%s。预测:%s”v,...字符串(valImds.Labels(v)),字符串(YPred(v)),...“翻译”“没有”);

图像包含几个不同的区域,其中一些区域可能会混淆网络。

使用t-SNE计算数据的二维表示

计算早期max池层、最终卷积层和最终softmax层的网络数据的低维表示形式。使用tsne函数将激活数据的维数从M降低到2。激活的维数越大,t-SNE计算所需的时间越长。因此,早期最大池层(激活有200704个维度)的计算时间比最终softmax层的计算时间长。为t-SNE结果的再现性设置随机种子。

rng默认的pool1tsne = tsne (pool1Activations);finalConvtsne = tsne (finalConvActivations);softmaxtsne = tsne (softmaxActivations);

比较早期和后期层的网络行为

t-SNE技术试图保持距离,以便在高维表示中彼此接近的点在低维表示中也彼此接近。如混淆矩阵所示,该网络能够有效地进行分类。因此,语义相似(或相同类型)的图像,如caesar沙拉和caprese沙拉,在softmax激活空间中彼此接近。t-SNE用一个比九维softmax分数更容易理解和绘制的二维表示来捕捉这种接近性。

早期的图层倾向于操作低层次的功能,如边缘和颜色。更深层的层次学习了具有更多语义意义的高级特征,比如披萨和热狗之间的区别。因此,早期层的激活不会显示任何按类的集群。在激活的高维空间中,两个像素相似的图像(例如,它们都包含许多绿色像素)彼此接近,不管它们的语义内容如何。后一层的激活倾向于将来自同一类的点聚集在一起。这种行为在软最大层最明显,并保留在二维t-SNE表示中。

绘制早期最大池化层、最终卷积层和最终softmax层的t-SNE数据gscatter函数。注意,早期的最大池激活在同一类的图像之间没有显示出任何聚类。最终卷积层的激活在一定程度上是按类聚类的,但不如softmax激活。不同的颜色对应不同的类别。

doLegend =“关”;markerSize = 7;图;次要情节(1,3,1);gscatter (pool1tsne (: 1) pool1tsne (:, 2), valImds。标签,...[],“。”、markerSize doLegend);标题(“马克斯池激活”);次要情节(1、3、2);gscatter (finalConvtsne (: 1) finalConvtsne (:, 2), valImds。标签,...[],“。”、markerSize doLegend);标题(“最终conv激活”);次要情节(1,3,3);gscatter (softmaxtsne (: 1) softmaxtsne (:, 2), valImds。标签,...[],“。”、markerSize doLegend);标题(“Softmax激活”);

探索t-SNE图中的观察值

创建一个更大的softmax激活图,包括标记每个职业的图例。从t-SNE图中,你可以更多地了解后验概率分布的结构。

例如,图中显示了一组不同的、独立的薯条观察结果,而生鱼片和寿司的观察结果并没有很好地解决。与混淆矩阵类似,图中显示,该网络在预测炸薯条类别时更准确。

numClasses=长度(类列表);颜色=线(numclass);h=数字;gscatter(softmaxtsne(:,1),softmaxtsne(:,2),有效标签,颜色);l=图例;l、 翻译=“没有”;l.Location =“bestoutside”

您还可以使用t-SNE来确定哪些图像被网络误分类以及原因。不正确的观测结果往往是对周围星团的颜色错误的孤立点。例如,一个分类错误的汉堡包图像非常接近炸薯条区域(最靠近橙色簇中心的绿色点)。这个点是观测99。在t-SNE图上圈出这个观察值,并显示图像显示图像

obs=99;图(h)保持;Hs = scatter(softmaxtsne(obs, 1), softmaxtsne(obs, 2),...“黑”“线宽”, 1.5);l.String{结束}=“汉堡包”; 持有;图();imshow(valImds.Files{obs});title(sprintf(“观察:%i\n”+...“实际:%s。预测:%s”,obs,...字符串(valImds.Labels(突发))、字符串(YPred(突发))),...“翻译”“没有”);

如果一张图片包含多种食物,网络就会混淆。在这种情况下,网络将图像分类为炸薯条,尽管前景中的食物是汉堡。图片边缘可见的炸薯条造成了混乱。

类似地,模糊不清的图像27(在前面的示例中显示)有多个区域。检查t-SNE图,突出了这个薯条图像的模糊方面。

obs=27;图(h)保持;H = scatter(softmaxtsne(obs, 1), softmaxtsne(obs, 2),...“k”' d '“线宽”, 1.5);l.String{结束}=“炸薯条”; 持有

图像在图中不是一个定义良好的簇,这表明分类可能是不正确的。这张照片离炸薯条区很远,离汉堡区很近。

为什么错误分类必须由其他信息提供,典型的是基于图像内容的假设。然后,您可以使用其他数据或工具来测试假设,这些工具表明图像的哪些空间区域对网络分类很重要。有关示例,请参见咬合敏感度gradcam揭示了Deep Learning决策背后的原因

参考文献

[1] van der Maaten, laurence和Geoffrey Hinton。“使用t-SNE可视化数据。”《机器学习研究学报》9,2008年,页2579 - 2605。

Helper函数

作用dataDir downloadExampleFoodImagesData (url)%下载Example Food Image数据集,包含978张图片%不同种类的食物分为9类。版权所有2019 The MathWorks, Inc.文件名=“ExampleFoodImageDataset.zip”;fileFullPath = fullfile(dataDir, fileName);%下载。zip文件到临时目录。如果~exist(fileFullPath,“文件”)fprintf("下载MathWorks示例食物图像数据集…\n");流(“这可能需要几分钟下载…\n”);websave(文件完整路径,url);fprintf(“下载完成…\n”);其他的流(正在跳过下载,文件已存在…\n);结束%解压文件。%通过检查文件是否存在,检查文件是否已解压缩一个类目录的%。exampleFolderFullPath = fullfile (dataDir,“披萨”);如果~exist(例如FolderFullPath,“dir”)fprintf(“正在解压缩文件…\n”);解压缩(fileFullPath dataDir);流(“解完成…\ n”);其他的流("跳过解压缩,文件已经解压缩…\n");结束流(“完成。\ n”);结束

另请参阅

|||||||(统计学和机器学习工具箱)

相关的话题