人工智能

应用机器学习和深度学习

神经网络特征可视化

网络学习的数据和语义内容的可视化

这篇文章来自Maria Duarte Rosa,她将讨论将网络学习的特征可视化的不同方法。
今天,我们来看看用两种方法来洞察网络的两种方法:再邻居而且t-SNE,我们将在下面详细描述。
使用t-SNE的语义聚类

使用t-SNE的训练网络的可视化

数据集和模型

在这两个练习中,我们都会用到ResNet-18,以及我们最喜欢的食物数据集,你可以在这里下载.(请注意,这是一个非常大的下载。我们只是举个例子,因为食物和每个人都有关系!这段代码应该适用于任何其他数据集)。
网络已经重新训练从数据中识别出5类对象:
沙拉 披萨 薯条 汉堡 寿司
接下来,我们想要可视化我们的网络,并理解神经网络用于分类数据的特征。以下是可视化网络高级特征的两种方法,以获得超越准确性的网络洞察力。

k近邻搜索

最近邻搜索是一种优化问题,其目标是找到空间中与给定点最接近(或最相似)的点。k近邻搜索识别特征空间中与点最近的k个近邻。度量空间中的接近度通常使用距离度量来定义,例如欧几里得距离或闵可夫斯基距离。点越相似,这段距离就越小。这种技术通常被用作机器学习分类方法,但也可以用于神经网络的数据可视化和高级特征,这就是我们要做的事情。
让我们从食物数据集中的5张测试图像开始:
idxTest = [394 97 996 460 737];im = imtile(string({imdsTest.Files{idxTest}}),'ThumbnailSize',[100 100], 'GridSize', [5 1]);
在像素空间的训练数据中寻找这些图像的10个最近的邻居。下面的代码将获得特性(即。"activations")为所有测试图像,并找到哪些元素最接近我们选择的样本图像。
获取特征,也就是激活
dataTrainFS =激活(netFood, imdsTrainAu, 'data', 'OutputAs', 'rows');imgFeatSpaceTest =激活(netFood, imdsTestAu,'data', 'OutputAs', 'rows');dataTestFS = imgFeatSpaceTest(idxTest,:);
创建KNN模型并搜索最近的邻居
Mdl = createns(dataTrainFS,'Distance','euclidean');idxKnn = knnsearch(Mdl,dataTestFS, 'k', 10);
在像素空间中搜索相似性通常不会返回关于图像语义内容的任何有意义的信息,而只能返回像素强度和颜色分布的相似性。数据(像素)空间中10个最近的邻居不一定与测试图像对应同一类。没有“学习”发生。
看看第四行:
薯条的图像是黄色的,顶部更亮,底部是黑色的。像素空间中大多数最近的邻居似乎是包含相同像素强度和颜色模式的任何类别的图像(它们顶部稍亮,底部稍暗)。让我们将其与通过网络传递的图像进行比较,并在特征空间中搜索10个最近的邻居,其中的特征是网络的最终平均池化层pool5的输出。
dataTrainFS =激活(netFood, imdsTrainAu, 'pool5', 'OutputAs', 'rows');imgFeatSpaceTest =激活(netFood, imdsTestAu,'pool5', 'OutputAs', 'rows');dataTestFS = imgFeatSpaceTest(idxTest,:);
创建KNN模型并搜索最近的邻居
Mdl = createns(dataTrainFS,'Distance','euclidean');idxKnn(:,:) = knnsearch(Mdl,dataTestFS, 'k', 10);

第一列(突出显示)是测试图像,其余列是10个最近的邻居

现在我们可以看到颜色和强度不再重要,而是图像中物体的更高层次的特征。最近的邻居现在是同一类的图像。这些结果表明,来自深度神经网络的特征包含了图像的语义内容信息。换句话说,该网络通过学习高级对象特定特征来学习区分类,类似于让人类区分汉堡和披萨,或凯撒沙拉和寿司。
K-NN:我们能从中学到什么?
这可以证实我们期望从网络中看到什么,或者只是以一种新的方式对网络进行另一种可视化。如果网络的训练精度很高,但特征空间中最近的邻居(假设特征是网络最后一层的输出)不是来自同一类的对象,这可能表明网络没有捕获任何与类相关的语义知识,但可能已经学会了基于训练数据的一些工件进行分类。

基于t-SNE的语义聚类

t-分布式随机邻居嵌入(t-SNE)是一种非线性降维技术,允许将高维数据嵌入到低维空间中。(通常我们选择低维空间为二维或三维,因为这便于绘图和可视化)。低维空间的估计方法是保持与高维空间的相似性。换句话说,两个相似的物体在低维空间中有很大的概率是附近的,而两个不同的物体应该用遥远的点来表示。该技术可用于深度神经网络特征的可视化。
让我们将这种技术应用于数据集的训练图像,并获得数据的二维和三维嵌入。
与k-nn示例类似,我们将从可视化原始数据(像素空间)和最终平均池化层的输出开始。
Layers = {'data', 'pool5'};for k = 1:length(layers) dataTrainFS =激活(netFood, imdsTrainAu, layers{k}, 'OutputAs', 'rows');AlltSNE2dim(:,:,k) = tsne(dataTrainFS);AlltSNE3dim(:,:,k) = tsne(dataTrainFS), 'NumDimensions', 3);图;gscatter(AlltSNE2dim(:,1,1), AlltSNE2dim(:,2,1), labels);title(sprintf('语义聚类- %s层',层{1}));gscatter(AlltSNE2dim(:,1,end), AlltSNE2dim(:,2,end), labels);title(sprintf('语义聚类- %s层',layers{end}));图; subplot(1,2,1);scatter3(AlltSNE3dim(:,1,1),AlltSNE3dim(:,2,1),AlltSNE3dim(:,3,1), 20*ones(3500,1), labels) title(sprintf('Semantic clustering - %s layer', layers{1})); subplot(1,2,2);scatter3(AlltSNE3dim(:,1,end),AlltSNE3dim(:,2,end),AlltSNE3dim(:,3,end), 20*ones(3500,1), labels) title(sprintf('Semantic clustering - %s layer', layers{end}));
在二维和三维图像中,都可以看到数据以一种非常随机的模式分散在整个空间中。但是当我们为'pool5'的输出绘制嵌入图时,模式就非常不同了。现在我们可以根据图像的语义内容清楚地看到点的集群。这些集群对应于数据中可用的5个不同的类。这意味着高层由网络学习的表示包含关于图像中对象的判别信息,这使得网络能够准确地预测对象的类别。
这些可视化除了提供关于网络的信息外,还可以用于检查数据本身。例如,让我们可视化一些图像,这些图像在错误的聚类中,看看我们是否可以深入了解为什么网络没有预测到输出。

错误语义聚类中的图像示例

让我们仔细看看pool5层的2D图像,并放大一些错误分类的图像。
im = imread(imdsTrain.Files{1619});标题(“看起来像沙拉的汉堡”);
沙拉堆里的汉堡。与其他汉堡图片不同的是,照片中有大量的沙拉,没有面包或小圆面包。
im = imread(imdsTrain.Files{125});标题(“看起来像汉堡包的凯撒沙拉”);
汉堡堆里的沙拉。这可能是因为图像背景中包含一个面包或面包。
im = imread(imdsTrain.Files{3000});imshow(im);title('看起来像汉堡包的寿司');
也许是因为它有一些看起来像汉堡的特征?
最后,我认为将网络所有层的t-SNE可视化是很有趣的,在这里我们可以看到数据开始是随机点,然后慢慢地适当地聚集在一起。
您可以使用下面的“获取MATLAB代码”链接下载代码。你需要带上你自己预先训练好的网络和数据集,因为这并不包括在内。
希望您觉得这些可视化效果有趣且有用!有问题要问玛丽亚吗?请在下方评论!

版权所有2018 The MathWorks, Inc.
获取MATLAB代码


|
  • 打印
  • 发送电子邮件

评论

要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。