如何测量预训练模型(例如 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 similarity
、inner product
、torch.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
在 torchvision.models.resnet34 中训练 resnet 预训练模型时,Pytorch 如何在 ImageNet 中处理图像?