提取高层特征每次都不同问题的解决

  作者在使用vgg16提取高层特征的时候,由于方法不对,导致每次提取的特征都会出现不同现象,原因是出现在nn.Linear()层上,虽然这种差别不是很大,但是放在具体的检索上就要命了,准确率好低,作者就是在这一方面花费了大量的时间寻找了解决方法与问题根源:

  先说一下错误过程:

  首先,作者是通过加载网络、重构网络的方式来提取高层特征的

  加载的网络

通过将pth文件加载到我之前训练的网络结构中:

 1 #训练的vgg16网络
 2 class Vgg16Model2(nn.Module):
 3     def __init__(self,vgg16 = vgg16_default):
 4         super(Vgg16Model2, self).__init__()
 5         ## 预训练的vgg16的特征提取层
 6         self.features = vgg16.features
 7         ## 添加新的全连接层
 8         self.classifier = nn.Sequential(
 9             nn.Linear(25088, 512),
10             nn.ReLU(),
11             nn.Dropout(p=0.5),
12             nn.Linear(512, 256),
13             nn.ReLU(),
14             nn.Dropout(p=0.5),
15             nn.Linear(256, vgg16numcluss)
16         )
17 
18     ## 定义网络的向前传播路径
19     def forward(self, x):
20         x = self.features(x)
21         x = x.view(x.size(0), -1)
22         output = self.classifier(x)
23         return output

然后重构该网络:

 1 #重构的vgg16网络
 2 class Vgg16Tofeature(nn.Module):
 3     def __init__(self,vgg16=vgg16_default):
 4         super(Vgg16Tofeature, self).__init__()
 5         ## 预训练的vgg16的特征提取层
 6         self.features = vgg16.features
 7         ## 添加新的全连接层
 8         self.classifier = nn.Sequential(
 9             nn.Linear(25088, 512),
10             nn.ReLU(),
11         )
12     ## 定义网络的向前传播路径
13     def forward(self, x):
14         x = self.features(x)
15         x = x.view(x.size(0), -1)
16         output = self.classifier(x)
17         return output

  很容易理解,这里输出512维的特征,是没有错的。

  但是,这种方法虽然简单容易理解,但是分类层每次的重构,都会导致其中的参数发生变化,因此对于同一张图像的特征输出总是会有一些差别。

  改进:看我写的另一篇提取高层特征的文章

posted @ 2021-05-04 18:31  兴财啊  阅读(172)  评论(0编辑  收藏  举报