主要内容

查看网络使用行为tsne

这个例子展示了如何使用tsne功能视图激活一个训练网络。该视图可以帮助您理解网络是如何工作的。

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

您可以使用t-SNE可视化深度学习网络如何改变输入数据的表示,因为它通过网络层。您还可以使用t-SNE找到问题的输入数据和理解观察网络分类不正确。

例如,t-SNE可以减少softmax层的多维激活具有相似结构的二维表示。紧簇在结果t-SNE情节通常对应于类网络分类正确。可视化允许你找点,出现在了错误的集群,指示一个观测网络分类不正确。观察可能是标签不正确,或网络可能预测,一个观察是一个不同的类的一个实例,因为它看起来类似于其他观察类。注意t-SNE减少将softmax激活只使用那些激活,而不是潜在的观察。

下载数据集

这个示例使用的示例食物图像的数据集,其中包含978照片的食物在九类和大小大约是77 MB。下载数据集到临时目录通过调用downloadExampleFoodImagesData辅助函数;这个helper函数的代码出现在这个例子

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

列车网络的食物图片进行分类

修改SqueezeNet pretrained网络分类图像数据集的食物。取代最后卷积层,拥有1000 1000类ImageNet过滤器,用一个新的卷积层,只有九个过滤器。每个过滤器都对应于一个单一类型的食物。

lgraph = layerGraph (squeezenet ());lgraph = lgraph.replaceLayer (“ClassificationLayer_predictions”,classificationLayer (“名称”,“ClassificationLayer_predictions”));newConv = convolution2dLayer([14] 14日9“名称”,“conv”,“填充”,“相同”);lgraph = lgraph.replaceLayer (“conv10”,newConv);

创建一个imageDatastore图像数据包含路径。把数据存储分成训练集和验证集,使用65%的培训,其余的数据验证。因为数据集是相当小的,过度拟合是一个重要的问题。减少过度拟合,增加训练集与随机翻转和可伸缩性。

imd = imageDatastore (dataDir,“IncludeSubfolders”,真的,“LabelSource”,“foldernames”);8月= imageDataAugmenter (“RandXReflection”,真的,“RandYReflection”,真的,“RandXScale”(0.8 - 1.2),“RandYScale”[0.8 - 1.2]);trainingFraction = 0.65;[trainImds, valImds] = splitEachLabel (imd, trainingFraction);augImdsTrain = augmentedImageDatastore (trainImds (227 227),“DataAugmentation”8月);augImdsVal = augmentedImageDatastore ([227 - 227], valImds);

创建培训方案和培训网络。SqueezeNet是一个小的网络,快速火车。你可以训练GPU和CPU上;这个例子的火车在一个CPU。

选择= trainingOptions (“亚当”,“InitialLearnRate”1的军医,“MaxEpochs”30岁的“ValidationData”augImdsVal,“详细”假的,“阴谋”,“训练进步”,“ExecutionEnvironment”,“cpu”,“MiniBatchSize”,128);rng默认的网= trainNetwork (augImdsTrain lgraph,选择);

验证数据进行分类

使用网络分类图像验证。验证网络是相当准确的分类新数据,情节真实的混淆矩阵和预测标签。

图();YPred =分类(净,augImdsVal);confusionchart (valImds.Labels YPred,“ColumnSummary”,“column-normalized”)

网络分类几个图片。网络似乎麻烦寿司图像,分类很多寿司,但一些披萨和汉堡。网络没有任何图像到热狗类进行分类。

计算激活了好几层

继续分析网络性能,计算每个观测数据集内的激活在早期马克斯池层,最后卷积层,最后softmax层。输出激活NxM矩阵,其中N是观测的数量和M是激活的维度的数量。M是空间和通道尺寸的产品。每一行是一个观察,每一列是一个维度。在将softmax层M = 9,因为数据集有九类的食物。矩阵中的每一行包含九个元素,对应的概率,一个观察属于每个9类的食物。

earlyLayerName =“pool1”;finalConvLayerName =“conv”;softmaxLayerName =“概率”;pool1Activations =激活(网络,augImdsVal earlyLayerName,“OutputAs”,“行”);finalConvActivations =激活(网络,augImdsVal finalConvLayerName,“OutputAs”,“行”);softmaxActivations =激活(网络,augImdsVal softmaxLayerName,“OutputAs”,“行”);

歧义的分类

您可以使用将softmax激活来计算图像分类,最有可能是不正确的。定义模棱两可一个分类的第二大概率的比值最大的概率。之间的一个分类的模糊性是零(近某些分类)和1(近可能分类最可能的类作为第二个类)。1意味着网络附近的一个歧义是不确定在一个特定的图像所属的类。这种不确定性可能会造成两个类的观察出现类似于网络,不能了解它们之间的差异。或者,高歧义可以发生,因为一个特定的观察包含不止一个类的元素,所以网络不能决定哪些分类是正确的。注意,低歧义并不一定意味着正确的分类;即使网络有一个高概率的一个类,分类仍然是不正确的。

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

找到最模糊的图像。

[模棱两可,ambiguityIdx] =排序(模棱两可,“下”);

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

班级名册=独特(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表图片#模棱两可最有可能第二真替_______类_________ _______ 94 0.9879汉堡披萨汉堡175 0.96311汉堡french_fries hot_dog 179 0.94939披萨汉堡hot_dog 337 0.93426寿司生鱼片寿司256 0.92972寿司比萨比萨297 0.91776寿司生鱼片寿司生鱼片283 0.80407比萨比萨27 0.80278汉堡披萨french_fries 302 0.76034 0.79283生鱼片寿司寿司201比萨greek_salad披萨

网络预测图像27最有可能汉堡和披萨。然而,这张照片其实是炸薯条。查看图片看到为什么这可能发生误分类。

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

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

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

计算网络数据的低维表示为早日马克斯池层,最后卷积层,最后softmax层。使用tsne函数来降低激活数据的维数M 2。激活的维数越大,t-SNE计算花费的时间越长。因此,计算早期马克斯池层,激活200704维,花费的时间超过最后softmax层。设置随机种子t-SNE结果的再现性。

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

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

t-SNE技术试图保持距离,这样点附近附近的高维表示也彼此彼此的低维表示。混淆矩阵所示,网络是有效的分类到不同的类中。因此,图像语义相似(或相同类型的),如凯撒沙拉和意大利番茄沙拉,将softmax激活空间中相互靠近。t-SNE捕捉这邻近的二维表示更容易理解和情节比nine-dimensional softmax分数。

早期层倾向于使用低级特征,如边缘和颜色。深层学习了高级功能语义,比如披萨和热狗的区别。因此,激活从早期层不显示任何聚类的类。两张图片类似pixelwise(例如,它们都含有大量的绿色像素)互相离得很近,在激活的高维空间,不管他们的语义内容。激活后层倾向于集群点从同一个类。这种行为是在将softmax层最为明显,保存在二维t-SNE表示。

情节t-SNE早期max池数据层,最后卷积层,最后softmax层使用gscatter函数。观察到早期马克斯池激活不表现出任何集群之间的图像相同的类。激活的最后卷积层是由类集群在某种程度上,但不如将softmax激活。不同的颜色对应于观测不同的类。

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

探索观察t-SNE阴谋

创建一个更大的阴谋将softmax激活,包括一个传奇标记每个类。从t-SNE情节,你可以了解更多关于结构的后验概率分布。

例如,情节展示了一个不同的,单独的集群炸薯条的观察,而集群生鱼片和寿司没有很好解决。类似于混淆矩阵,图表明,网络更准确的预测到薯条类。

numClasses =长度(班级名册);颜色=线(numClasses);h =图;gscatter (softmaxtsne (: 1) softmaxtsne (:, 2), valImds.Labels,颜色);l =传奇;l翻译=“没有”;l位置=“bestoutside”;

您还可以使用t-SNE确定哪些图像由网络和分类错误的原因。不正确的观察往往是孤立点集群周围的颜色为他们的错误。例如,一个图像分类错误炸薯条地区附近的汉堡包很(绿点最近的橙色集群)的中心。这个点是99年的观察。圆这个观察t-SNE情节,显示图像imshow

奥林匹克广播服务公司=99年;图(h);hs =散射(softmaxtsne(奥林匹克广播服务公司,1),softmaxtsne(奥林匹克广播服务公司,2),“黑”,“线宽”,1.5);l字符串{结束}=“汉堡包”;持有;图();imshow (valImds.Files{奥林匹克广播服务公司});标题(sprintf (“我观察:% \ n”+“实际:% s。预测:% s”奥林匹克广播服务公司,字符串(valImds.Labels(突发))、字符串(YPred(突发))),“翻译”,“没有”);

如果一个图像包含多种类型的食物,网络可以感到困惑。在这种情况下,网络分类形象薯条虽然前景的食物是汉堡包。炸薯条的边缘可见图像造成的混乱。

同样的,模糊的图像27(如图所示)早些时候有多个地区。检查t-SNE情节突出这薯条图像模糊的一面。

奥林匹克广播服务公司=27;图(h);h =散射(softmaxtsne(奥林匹克广播服务公司,1),softmaxtsne(奥林匹克广播服务公司,2),“k”,' d ',“线宽”,1.5);l字符串{结束}=“炸薯条”;持有;

形象不是一个定义良好的集群的情节,这表明分类可能是不正确的。图像远炸薯条集群,集群和接近汉堡。

为什么必须提供错误分类的其他信息,通常假设基于图像的内容。然后您可以使用其他数据测试的假设,或使用工具,指示哪些空间区域图像的网络分类很重要。有关示例,请参见occlusionSensitivityGrad-CAM揭示了深度学习的决定背后的原因

引用

[1]van der Maaten、劳伦斯和杰弗里•辛顿。“使用t-SNE可视化数据。”机器学习的研究》杂志9,2008年,页2579 - 2605。

Helper函数

函数dataDir downloadExampleFoodImagesData (url)%下载示例食物图像数据集,包含978的图像%不同类型的食物分为9类。% 2019年版权MathWorks公司。文件名=“ExampleFoodImageDataset.zip”;fileFullPath = fullfile (dataDir,文件名);% . zip文件下载到一个临时目录中。如果~存在(fileFullPath“文件”)流(“下载MathWorks例子食物图像数据集…\ n”);流(“这可能花费几分钟下载…\ n”);websave (fileFullPath、url);流(“下载完成…\ n”);其他的流(“跳过下载,文件已经存在…\ n”);结束%解压该文件。%%检查文件是否已经被检查存在解压缩%的类目录。exampleFolderFullPath = fullfile (dataDir,“披萨”);如果~存在(exampleFolderFullPath“dir”)流(“将文件解压缩…\ n”);解压缩(fileFullPath dataDir);流(“解完成…\ n”);其他的流(“跳过压缩,文件已经解压缩…\ n”);结束流(“完成。\ n”);结束

另请参阅

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

相关的话题