zoukankan      html  css  js  c++  java
  • 提取高层特征每次都不同问题的解决

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

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

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

  • 相关阅读:
    《转》python学习(5)--数据类型
    《转》python学习(4)对象
    《转》python学习(3)
    《转》python学习--基础下
    《转》python学习--基础上
    python初学总结(二)
    并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理
    并发编程学习笔记(8)----ThreadLocal的使用及源码分析
    并发编程学习笔记(7)----线程之间的通信
    并发编程学习笔记(6)----公平锁和ReentrantReadWriteLock使用及原理
  • 原文地址:https://www.cnblogs.com/2020zxc/p/14730001.html
Copyright © 2011-2022 走看看