深度聚类的可视化解释

作者:Amit Chaudhary
编译:ronghuaiyang
导读
视觉上的自监督学习方法,结合聚类,将无监督转变为有监督 。
许多自监督方法使用[pretext tasks](https://amitness.com/2020/02/illustrated-selfsupervision -learning/)来生成代理标签,并将无监督学习问题转化为有监督学习的问题 。一些例子包括旋转预测,图像着色,拼图等 。然而,这样的pretext任务是依赖于领域的,需要专业知识来设计它们 。
DeepCluster是Facebook AI研究的Caron等人提出的一种自监督方法,带来了一种不同的方法 。这种方法不需要特定于领域的知识,可以用于学习缺乏注释数据的场景的深层表示 。
DeepClusterDeepCluster结合了两部分:无监督聚类和深度神经网络 。提出了一种端到端联合学习深度神经网络参数及其表示的聚类分配的方法 。这些特征被迭代地生成和聚合,最后得到一个训练过的模型和标签作为输出结果 。
Deep Cluster Pipeline现在让我们了解一下深度聚类的pipleline是如何工作的 。
深度聚类的可视化解释

文章插图
End to End Pipeline of DeepCluster Paper
简介:
如上图所示,将拍摄未标记的图像并对其应用图像增强 。然后,使用AlexNet或vgg16等ConvNet架构作为特征提取器 。首先,对ConvNet进行随机权值初始化,并在最终的分类头之前从层中取特征向量 。然后使用PCA对特征向量进行降维,同时进行白化和L2归一化 。最后,将处理后的特征传递到K-means,对每幅图像进行聚类分配 。
这些聚类分配被用作伪标签,并训练ConvNet来预测这些聚类 。用交叉熵损失来衡量模型的性能 。模型训练了100个epoch,每个epoch进行一次聚类的操作 。最后,我们可以将学到的表示用于下游任务 。
手把手的例子让我们通过一个从输入数据到输出标签的整个pipeline的一步步例子来看看DeepCluster是如何实际应用的:
1. 训练数据
我们从ImageNet数据集中提取未标记的图像,该数据集包括130万张图像,均匀分布在1000个类中 。这些图像的minibatch为256 。
深度聚类的可视化解释

文章插图
Example of ImageNet datasets for DeepCluster
N幅图像的训练集在数学上可以表示为:
深度聚类的可视化解释

文章插图
 
2. 图像增强
将各种变换应用于图像,以便学习到的不受增强的影响的特征 。分别在训练模型学习表示和将图像表示发送到聚类算法时进行了两种不同的增强:
Case 1: 聚类时使用的变换
【深度聚类的可视化解释】当要把模型表示送去进行聚类时,不使用随机增强 。图像简单地调整为256×256,并使用中心剪裁得到224×224的图像 。然后应用归一化 。
深度聚类的可视化解释

文章插图
Augmentations done during clustering in DeepCluster
在PyTorch中,可以这样实现:
from PIL import Imageimport torchvision.transforms as transformsim = Image.open('dog.png')t = transforms.Compose([transforms.Resize(256),                        transforms.CenterCrop(224),                        transforms.ToTensor(),                        transforms.Normalize(mean=[0.485, 0.456, 0.406],                                             std=[0.229, 0.224, 0.225])])aug_im = t(im)Case 2: 训练模型时候的变换
当模型在图像和标签上进行训练时,我们使用随机增强 。图像裁剪为随机大小和高宽比,然后调整为224*224 。然后,图像水平翻转的概率为50% 。最后,利用ImageNet均值和方差对图像进行归一化 。
深度聚类的可视化解释

文章插图
Sequence of Image Augmentations Used before passing to model
在PyTorch中,可以这样实现:
from PIL import Imageimport torchvision.transforms as transformsim = Image.open('dog.png')t = transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])])aug_im = t(im)


推荐阅读