深度学习

理解和使用深度学习网络

神经网络特征可视化

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

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

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

数据和模型

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

再邻居搜索

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

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

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

使用t-SNE的语义聚类

t-分布随机邻域嵌入(t-SNE)是一种非线性降维技术,允许在低维空间嵌入高维数据。(通常我们选择二维或三维的低维空间,因为这样可以很容易地绘制和可视化)。此低维空间的估计方式应确保其与高维空间保持相似性。换句话说,两个相似的物体在低维空间中有很高的接近概率,而两个不同的物体应该用遥远的点来表示。该技术可用于可视化深度神经网络特征。
让我们将这种技术应用到数据集的训练图像,并得到数据的二维和三维嵌入。
与k-nn示例类似,我们将首先可视化原始数据(像素空间)和最终平均池层的输出。
层={'data','pool5'};对于k=1:length(layers)dataTrainFS=激活(netFood、imdsTrainAu、layers{k}、'OutputAs','rows');所有TSNE2DIM(:,:,k)=tsne(数据列车);所有TSNE3DIM(:,:,k)=tsne(数据列车),'NumDimensions',3);结束图;子批次(1,2,1);gscatter(所有TSNE2DIM(:,1,1),所有TSNE2DIM(:,2,1),标签);标题(sprintf('semanticclustering-%s layer',layers{1}));子批次(1,2,2);gscatter(所有TSNE2DIM(:,1,结束),所有TSNE2DIM(:,2,结束),标签);标题(sprintf('semanticclustering-%s layer',layers{end}));图形子批次(1,2,1);散点3(AlltSNE3dim(:,1,1),AlltSNE3dim(:,2,1),AlltSNE3dim(:,3,1),20*one(3500,1),标签)标题(sprintf('Semantic clustering-%s layer',layers{1}));子批次(1,2,2);散点3(AlltSNE3dim(:,1,end),AlltSNE3dim(:,2,end),AlltSNE3dim(:,3,end),20*one(3500,1),标签)标题(sprintf('Semantic clustering-%s layer',layers{end}));
无论是在二维还是三维图像中,都可以看到数据以非常随机的模式分散在整个空间中。但是,当我们为“pool5”的输出绘制嵌入时,模式是非常不同的。现在,我们可以根据图像的语义内容清晰地看到点簇。集群对应于数据中可用的5个不同类。这意味着高层网络学习的表征包含图像中物体的鉴别信息,使网络能够准确预测物体的类别。
除了这些可视化提供的关于网络的信息外,它们还可以用于检查数据本身。例如,让我们可视化一些图像,这些图像在错误的集群中,并看看我们是否能了解为什么网络没有预测到输出。

错误语义集群中的图像示例

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

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


|
  • 打印
  • 发送电子邮件

评论

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