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


      作者在使用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维的特征,是没有错的。

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

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

  • 相关阅读:
    走亲访友
    分而治之
    红色警报
    小字辈
    最长对称子串
    树的遍历
    acwing练习
    组合计数
    同余
    乘法逆元
  • 原文地址:https://www.cnblogs.com/2020zxc/p/14730001.html
Copyright © 2020-2023  润新知