如何测量预训练模型(例如 vgg、resnet...)提取的图像特征之间的语义相似度?

Posted

技术标签:

【中文标题】如何测量预训练模型(例如 vgg、resnet...)提取的图像特征之间的语义相似度?【英文标题】:How to measure the semantic similarities among image features extracted by pre-trained models(e.g. vgg, resnet...)? 【发布时间】:2021-11-05 22:47:18 【问题描述】:

据我所知,预训练模型作为特征提取器在许多任务中表现出色,这要归功于其丰富的训练数据集。

但是,我想知道模型是否,比如说vgg-16

有一定的能力从输入图像中提取一些“语义”信息?

如果答案是肯定的,则给出unlabeled dataset

是否可以通过测量提取特征的语义相似性来“聚类”图像?


其实我也花了一些功夫:

    通过 Pytorch 加载预训练的 vgg-16。 加载 Cifar-10 数据集并转换为批量张量 X,大小为 (5000, 3, 224, 224)。 微调vgg.classifier,定义其输出维度为4096。 提取特征:
 features = vgg.features(X).view(X.shape[0], -1) # X: (5000, 3, 224, 224)

 features = vgg.classifier(features) # features: (5000, 25088)

 return features # features: (5000, 4096)
    尝试cosine similarityinner producttorch.cdist,却发现有几个坏集群。

有什么建议吗?提前致谢。

【问题讨论】:

【参考方案1】:

您可能不想一直走到最后一层,因为它们包含特定于手头分类任务的特征。使用分类器中更高层的特征可能会有所帮助。此外,您想切换到评估模式,因为 VGG-16 在其分类器中有一个 dropout 层。

>>> vgg16 = torchvision.models.vgg(pretrained=True).eval()

截断分类器:

>>> vgg16.classifier = vgg16.classifier[:4]

现在vgg16 的分类器将如下所示:

(classifier): Sequential(
  (0): Linear(in_features=25088, out_features=4096, bias=True)
  (1): ReLU(inplace=True)
  (2): Dropout(p=0.5, inplace=False)
  (3): Linear(in_features=4096, out_features=4096, bias=True)
)

然后提取特征:

>>> vgg16(torch.rand(1, 3, 124, 124)).shape
torch.Size([1, 4096])

【讨论】:

谢谢,你的方法确实对我有用(至少性能大大提高了)!顺便说一句,在我的代码实践中,我在vgg.parameters() 中设置了param.requires_grad = False,该设置与vgg.eval() 有什么区别? param.requires_grad = False, or equivalently vgg.requires_grad_(False)` 将确保网络的权重不受优化器的影响,它本质上对应于冻结模型。另一方面,eval 将停用在评估期间应该使用的某些层特征(主要是批规范和 dropouts),这些通常只能在训练时激活。您可以在此处阅读有关latter 的更多信息。

以上是关于如何测量预训练模型(例如 vgg、resnet...)提取的图像特征之间的语义相似度?的主要内容,如果未能解决你的问题,请参考以下文章

使用ResNet101作为预训练模型训练Faster-RCNN-TensorFlow-Python3-master

ResNet RGB 表示在 tensorflow-slim

4. 使用预训练的PyTorch网络进行图像分类

4. 使用预训练的PyTorch网络进行图像分类

Keras深度学习实战——基于ResNet模型实现性别分类

在 torchvision.models.resnet34 中训练 resnet 预训练模型时,Pytorch 如何在 ImageNet 中处理图像?