深度聚类的可视化解释( 二 )

Sobel变换
一旦我们得到了归一化的图像,我们就把它转换成灰度 。然后,我们使用Sobel滤波器增加图像的局部对比度 。

深度聚类的可视化解释

文章插图
Sobel Transformation in DeepCluster
下面是改编自作者实现的简化代码片段,我们可以将它应用到上面得到的增强图像aug_im上 。
import torchimport torch.nn as nn# Fill kernel of Conv2d layer with grayscale kernelgrayscale = nn.Conv2d(3, 1, kernel_size=1, stride=1, padding=0)grayscale.weight.data.fill_(1.0 / 3.0)grayscale.bias.data.zero_()# Fill kernel of Conv2d layer with sobel kernelssobel = nn.Conv2d(1, 2, kernel_size=3, stride=1, padding=1)sobel.weight.data[0, 0].copy_(    torch.FloatTensor([[1, 0, -1],                       [2, 0, -2],                       [1, 0, -1]]))sobel.weight.data[1, 0].copy_(    torch.FloatTensor([[1, 2, 1],                       [0, 0, 0],                       [-1, -2, -1]]))sobel.bias.data.zero_()# Combine the twocombined = nn.Sequential(grayscale, sobel)# Applybatch_image = aug_im.unsqueeze(dim=0)sobel_im = combined(batch_image)3. 确定聚类的数量(类别数)
要进行聚类,我们需要决定聚类的数量 。这将是模型将要训练的类的数量 。
深度聚类的可视化解释

文章插图
Impact of number of clusters on DeepCluster model
默认情况下,ImageNet有1000个类,但是本文使用了10,000个聚类,因为这样可以对未标记的图像进行更细粒度的分组 。例如,如果你以前有一组猫和狗,你增加聚类,然后可以创建猫和狗品种的分组 。
4. 模型结构
本文主要采用AlexNet架构,由5个卷积层和3个全连接层组成 。删除LRN层,使用Batch Normalization 。也添加了Dropout 。使用的卷积尺寸为2012年比赛所用的:96, 256, 384, 384, 256 。
深度聚类的可视化解释

文章插图
AlexNet Architecture Used in DeepCluster
另外,本文还尝试用带batch normalization的vgg16替换AlexNet,以查看对性能的影响 。
5. 生成初始的标签
为了生成用于训练的模型的初始标签,我们使用随机权重初始化AlexNet,并去除最后一个完全连接的层FC3 。我们在图像上对模型进行前向传递,并在图像上取来自模型的第二个全连接层FC2的特征向量 。该特征向量的维数为4096 。
深度聚类的可视化解释

文章插图
How Feature Vectors are taken from AlexNet for Clustering
对整个数据集的batch中的所有图像重复此过程 。因此,如果我们有N幅图像,我们将得到一个图像特征矩阵[N, 4096] 。
深度聚类的可视化解释

文章插图
The Image-Feature Matrix Generated in DeepCluster
6. 聚类
在聚类之前,对图像特征矩阵进行降维处理 。
深度聚类的可视化解释

文章插图
Preprocessing for clustering in DeepCluster
在降维方面,采用主成分分析(PCA)方法,将特征从4096维降至256维,然后进行白化 。本文使用faiss库来进行大规模操作 。Faiss提供了一种有效的PCA实现方法,可以应用于图像特征矩阵x:
import faiss# Apply PCA with whiteningmat = faiss.PCAMatrix(d_in=4096, d_out=256, eigen_power=-0.5)mat.train(x)x_pca = mat.apply_py(x)然后,对PCA后得到的值进行L2归一化处理 。
import numpy as np  norm = np.linalg.norm(x_pca, axis=1)x_l2 = x_pca / norm[:, np.newaxis]这样,我们最终得到了N幅图像的矩阵(N, 256) 。现在对预处理后的特征进行K-means聚类,得到图像及其对应的聚类 。这些聚类将充当伪标签,模型将在其上进行训练 。
深度聚类的可视化解释


推荐阅读