如何在convnet中初始化过滤器

时间:2016-12-07 14:50:41

标签: tensorflow deep-learning theano keras

我在回顾中阅读了很多论文,但有一点我不明白,卷积层中的过滤器是如何初始化的? 因为,例如,在第一层,过滤器应检测边缘等。 但如果它随机初始化,它可能不准确?对于下一层和高级功能也是如此。 另一个问题是,这些过滤器的价值范围是什么?

非常感谢你!

1 个答案:

答案 0 :(得分:5)

您可以随机初始化过滤器,也可以在其他数据集上预先过滤它们。

一些参考文献:

http://deeplearning.net/tutorial/lenet.html

  

请注意,随机初始化的过滤器非常像边缘   探测器!

     

请注意,我们使用与之相同的权重初始化公式   MLP。权重是从均匀分布中随机抽样的   范围[-1 /扇入,1 /扇入],其中扇入是a的输入数量   隐藏单位。对于MLP,这是图层中的单位数   下面。然而,对于CNN,我们必须考虑到的数量   输入要素图和感受域的大小。

http://cs231n.github.io/transfer-learning/

  

转学习

     

在实践中,很少有人训练整个卷积网络   从头开始(随机初始化),因为它是相对的   很少有足够大小的数据集。相反,它是常见的   在一个非常大的数据集上预先训练一个ConvNet(例如ImageNet,它   包含120万个图像,1000个类别),然后使用   ConvNet既可以作为初始化,也可以作为固定特征提取器   感兴趣的任务。三个主要的转移学习方案看起来   如下:

     
      
  • ConvNet作为固定功能提取器。在ImageNet上预先训练一个ConvNet,删除最后一个完全连接的层(该层的输出   那么是像ImageNet这样的不同任务的1000级分数   将ConvNet的其余部分视为新的固定特征提取器   数据集。在AlexNet中,这将为每个计算4096-D向量   包含隐藏层激活的图像   在分类器之前。我们将这些功能称为 CNN代码。它是   对于这些代码是ReLUd(即阈值处理)的性能很重要   如果他们在训练期间也被设定为阈值   ImageNet上的ConvNet(通常就是这种情况)。一旦你解压缩了   4096-D代码用于所有图像,训练线性分类器(例如线性分类器)   SVM或Softmax分类器)用于新数据集。
  •   
  • 微调ConvNet 。第二个策略是不仅在新的ConvNet上替换和重新训练分类器   数据集,但也要微调预训练网络的权重   通过继续反向传播。可以微调所有   ConvNet的各个层面,或者它可以保留一些早期版本   层固定(由于过度拟合的问题),只调整一些   网络的更高级别部分。这是出于此动机   观察到ConvNet的早期特征包含更多   通用特征(例如边缘检测器或彩色斑点检测器)   应该对许多任务有用,但后来的ConvNet层   逐渐变得更加具体到类的细节   包含在原始数据集中。以ImageNet为例,   其中包含许多犬种,其中很大一部分是   ConvNet的代表性力量可能致力于这些功能   特别是区分狗品种。
  •   
     

预训练模型。由于现代ConvNets需要2-3周的时间来训练ImageNet上的多个GPU,因此通常会看到人们发布   他们最终的ConvNet检查站是为了其他可以使用的人的利益   用于微调的网络。例如,Caffe库有一个   人Model Zoo   分享他们的网络权重。

     

何时以及如何微调?您如何决定应对新数据集执行哪种类型的转移学习?这是一个功能   几个因素,但两个最重要的因素是   新数据集(小或大),以及它与原始数据集的相似性   (例如ImageNet类似于图像和类的内容,   或者非常不同,例如显微镜图像)。记住这一点   ConvNet功能在早期层次中更具通用性   在以后的图层中特定于原始数据集,这里有一些常见的规则   导航4个主要场景的拇指:

     
      
  1. 新数据集很小,与原始数据集类似。由于数据很小,因此对微调ConvNet不是一个好主意   过度拟合的问题。由于数据与原始数据类似,   我们希望ConvNet中的高级功能与此相关   数据集也是如此。因此,最好的想法可能是训练线性   CNN代码上的分类器。
  2.   
  3. 新数据集很大,与原始数据集类似。由于我们拥有更多数据,因此我们可以更加确信我们不会过度适应   如果我们试图通过整个网络进行微调。
  4.   
  5. 新数据集很小但与原始数据集非常不同。由于数据很小,最好只训练一个   线性分类器。由于数据集非常不同,因此可能不同   最好从网络顶部训练分类器,哪个   包含更多数据集特定的功能。相反,它可能会更好   在早期的某个地方训练SVM分类器   网络
  6.   
  7. 新数据集很大,与原始数据集非常不同。由于数据集非常大,我们可以期望我们可以   能够从头开始训练ConvNet。但是,在实践中它是   通常仍然有利于从a的权重初始化   预训练模型。在这种情况下,我们将有足够的数据和   有信心通过整个网络进行微调。
  8.         

    实用建议。执行转移学习时还需要注意以下几点:

         
        
    • 来自预训练模型的约束。请注意,如果您希望使用预训练网络,则可能会受到轻微约束   您可以用于新数据集的体系结构。例如,你不能   任意从预训练网络中取出Conv层。然而,   一些变化是直截了当的:由于参数共享,你可以   在不同空间大小的图像上轻松运行预训练网络。   这在Conv / Pool层的情况下非常明显,因为它们是   前向函数独立于输入音量空间大小(如   只要步伐适合")。在FC层的情况下,这仍然成立   是的,因为FC层可以转换为卷积层:For   例如,在AlexNet中,第一个FC之前的最终汇集量   层的大小为[6x6x512]。因此,FC层看着这个   音量相当于具有卷积层   感知字段大小为6x6,并使用0的填充。
    •   
    • 学习率。对于经过微调的ConvNet权重,使用较小的学习速率是常见的。   (随机初始化的)新线性分类器的权重   计算新数据集的类得分。这是因为我们   期望ConvNet重量相对较好,所以我们不希望   过快地扭曲它们(特别是新的时候)   它们上面的线性分类器正在被随机训练   初始化)。
    •   
         

         

    其他参考资料