【问题标题】:How filters are initialized in convnet过滤器如何在 convnet 中初始化
【发布时间】:2017-04-22 13:51:20
【问题描述】:

看了很多关于convnets的论文,但是有一点不明白,卷积层的filter是怎么初始化的? 因为,例如,在第一层,过滤器应该检测边缘等。 但是如果它随机初始化,它会不准确吗?下一层和高级特征也是如此。 还有一个问题,这些过滤器中值的范围是多少?

非常感谢你!

【问题讨论】:

    标签: tensorflow deep-learning theano keras


    【解决方案1】:

    您可以随机初始化过滤器,也可以在其他数据集上对其进行预训练。


    一些参考资料:

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

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

    请注意,我们使用的权重初始化公式与 MLP。权重是从均匀分布中随机抽取的 范围 [-1/fan-in, 1/fan-in],其中 fan-in 是输入的数量 隐藏单元。对于 MLP,这是层中的单元数 以下。然而,对于 CNN,我们必须考虑到 输入特征图和感受野的大小。

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

    迁移学习

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

    • ConvNet 作为固定特征提取器。取一个在 ImageNet 上预训练的 ConvNet,去掉最后一个全连接层(这一层的输出 是 ImageNet 等不同任务的 1000 个类别分数),然后 将 ConvNet 的其余部分视为新的固定特征提取器 数据集。在 AlexNet 中,这将为每个 立即包含隐藏层激活的图像 在分类器之前。我们将这些功能称为 CNN 代码。它是 这些代码是 ReLUd 对性能很重要(即阈值 为零)如果它们在训练过程中也被阈值 ImageNet 上的 ConvNet(通常是这种情况)。一旦你提取 所有图像的 4096-D 代码,训练线性分类器(例如线性 SVM 或 Softmax 分类器)用于新数据集。
    • 微调卷积网络。第二个策略是不仅在新的卷积网络上替换和重新训练分类器 数据集,但也可以微调预训练网络的权重 通过继续反向传播。可以微调所有 ConvNet 的层,或者可以保留一些较早的层 固定层(由于过度拟合问题)并且只微调一些 网络的上层部分。这是由 观察到 ConvNet 的早期特征包含更多 通用特征(例如边缘检测器或颜色斑点检测器) 应该对许多任务有用,但 ConvNet 的后面几层 逐渐变得更加具体到类的细节 包含在原始数据集中。以 ImageNet 为例, 其中包含许多犬种,其中很大一部分 ConvNet 的表征能力可能用于 专门用于区分犬种。

    预训练模型。由于现代 ConvNets 需要 2-3 周才能在 ImageNet 上跨多个 GPU 进行训练,因此通常会看到人们发布 他们最终的 ConvNet 检查点,以造福于其他可以使用的人 用于微调的网络。例如,Caffe 库有一个 Model Zoo人在哪里 分享他们的网络权重。

    何时以及如何进行微调?您如何决定应该在新数据集上执行哪种类型的迁移学习?这是一个函数 几个因素,但最重要的两个是 新数据集(小或大)及其与原始数据集的相似性 (例如,在图像内容和类别方面类似于 ImageNet, 或非常不同,例如显微镜图像)。请记住, ConvNet 特征在早期层更通用 original-dataset-specific 在后面的层中,这里是一些常见的规则 导航 4 个主要场景的经验:

    1. 新数据集很小,与原始数据集相似。由于数据很小,因此微调 ConvNet 不是一个好主意,因为 过度拟合的担忧。由于数据与原始数据相似, 我们期望 ConvNet 中的高级特征与此相关 数据集也是如此。因此,最好的想法可能是训练线性 CNN 代码上的分类器。
    2. 新数据集很大并且与原始数据集相似。由于我们有更多的数据,我们可以更有信心我们不会过拟合 如果我们要尝试对整个网络进行微调。
    3. 新数据集很小,但与原始数据集有很大不同。由于数据很小,最好只训练一个 线性分类器。由于数据集非常不同,因此可能不会 最好从网络的顶部训练分类器,其中 包含更多特定于数据集的功能。相反,它可能会更好地工作 从早期某处的激活中训练 SVM 分类器 网络。
    4. 新数据集很大,与原始数据集有很大不同。由于数据集非常大,我们可能期望我们可以 负担得起从头开始训练 ConvNet。然而,在实践中它是 通常仍然有益于使用来自 a 的权重进行初始化 预训练模型。在这种情况下,我们将有足够的数据和 对整个网络进行微调的信心。

    实用建议。在执行迁移学习时,还需要注意一些其他事项:

    • 预训练模型的约束。请注意,如果您希望使用预训练网络,您可能会受到以下方面的限制 可用于新数据集的架构。例如,您不能 从预训练的网络中任意取出 Conv 层。然而, 一些变化是直截了当的:由于参数共享,您可以 轻松地在不同空间大小的图像上运行预训练网络。 这在 Conv/Pool 层的情况下很明显,因为它们的 前向函数与输入体积空间大小无关(如 只要步幅“适合”)。在 FC 层的情况下,这仍然成立 true 因为 FC 层可以转换为卷积层:对于 例如,在 AlexNet 中,第一个 FC 之前的最终池化量 层的大小为 [6x6x512]。因此,FC层看这个 体积相当于有一个卷积层 接受域大小为 6x6,填充为 0。
    • 学习率。与正在微调的 ConvNet 权重相比,通常使用较小的学习率 (随机初始化的)新线性分类器的权重 计算新数据集的类分数。这是因为我们 期望ConvNet的权重比较好,所以我们不希望 太快和太多地扭曲它们(尤其是当新的 他们上面的线性分类器是从随机训练的 初始化)。

    其他参考资料

    【讨论】:

      猜你喜欢
      • 2016-06-14
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 2018-08-31
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      相关资源
      最近更新 更多