【问题标题】:Unable to train/fine-tune with PReLU in caffe无法在 caffe 中使用 PReLU 进行训练/微调
【发布时间】:2016-09-24 17:25:48
【问题描述】:

我正在使用深度神经网络进行人脸识别。我正在使用包含 10575 个类的 CASIA-webface 数据库来训练 10 个卷积层、5 个池化层和 1 个全连接层的深度 CNN(由 CASIA 使用,详见 paper)。对于激活它使用"ReLU" 函数。我能够使用 成功训练它并获得所需的性能。

我的问题是,我无法使用"PReLU"activation 训练/微调同一个 CNN。起初,我认为用"PReLU" 简单地替换"ReLU" 就可以完成这项工作。但是,微调(来自使用"ReLU" 学习的caffemodel)和从头开始学习策略都不起作用。

为了简化学习问题,我只用 50 个类显着减少了训练数据集。然而,CNN 无法使用"PReLU" 进行学习,而它可以使用"ReLU" 进行学习。

为了了解我的 caffe 可以与 "PReLU" 一起正常工作,我通过使用 cifar10 数据运行简单的网络("ReLU""PReLU")来验证它并且它可以正常工作。

我想通过社区了解是否有人有类似的观察。或者如果有人可以提供任何建议来解决这个问题。

【问题讨论】:

  • 您是否更改了任何训练参数?例如,学习率或收敛ε?微调模型有时需要微调一两个参数。另外,我不确定 P/ReLU 函数的插入位置:论文没有指出它们,所以我假设它们在通常的位置(与 POOL 相邻)。
  • 是的,正如您提到的,我尝试了不同范围的训练参数。 P/ReLU 在 Conv 层之后插入。

标签: caffe computer-vision neural-network deep-learning caffe face-recognition


【解决方案1】:

"ReLU""PReLU" 激活之间的主要区别在于,后者的激活函数对于输入的负值具有非零斜率,并且该斜率可以从数据中学习。据观察,这些属性使训练对权重的随机初始化更加稳健。
我使用"PReLU" 激活对最初使用"ReLU"s 训练的网络进行微调,我体验到更快、更稳健的收敛。

我的建议是将"ReLU"替换成如下配置

layer {
  name: "prelu"
  type: "PReLU"
  bottom: "my_bottom"
  top: "my_bottom" # you can make it "in-place" to save memory
  param { lr_mult: 1 decay_mult: 0 }
  prelu_param { 
    filler: { type: "constant" val: 0 } 
    channel_shared: false
  }
}

请注意,通过将负斜率初始化为 0,"PReLU" 激活实际上与"ReLU" 相同,因此您可以从与原始网络完全相同的位置开始微调。

还请注意,我明确设置了学习率和衰减率系数(分别为 1 和 0)——您可能需要稍微调整这些参数,但我相信将 decay_weight 设置为除零以外的任何值都是不明智。

【讨论】:

    【解决方案2】:

    我能够使用 PReLu 为我的网络进行良好的训练,尽管使用 ReLu 的准确度略低。是的,我也简单地将 ReLu 换成了 PReLu。

    但是,我几乎一直注意到 PReLU 的收敛速度比 ReLu 快得多。那么,也许您需要降低学习率?

    【讨论】:

    • 我尝试了许多不同的学习率范围,从 0.1 到 0.00001。我使用默认的 SGD 求解器。
    • 我有同样的经历:使用 ReLU 训练网络,使用 PReLU 将其微调到不同的数据库效果更好。
    【解决方案3】:

    两个基本观察:

    • 不保证 PReLU 产生的结果比使用 ReLU 的结果更准确。它在 ImageNet 上与 AlexNet 一起工作得更好,但这只是暗示了进一步的研究和改进;它不一定会转移到其他应用程序。
    • CIFAR、ImageNet 和 CASIA-webface 不是相同的应用程序。

    您已经完成了正确的第一步,即更改了学习率。接下来,我将尝试调整命令行参数:更改收敛 epsilon、动量、权重衰减或其他内部调整参数。有时,即使是很小的拓扑变化,也需要进行调整。

    更改输入批量大小。是否允许以其他方式更改拓扑,例如更改卷积层?您可能会看到使用 CONV2 过滤器的不同方法得到的结果。

    【讨论】:

    • 最近的几项工作通过将 ReLU 替换为 PReLU,在相同的 CNN 和 DB 上获得了更好的结果。因此,我的目标是通过遵循这一点而不是更改网络配置来获得更好的性能。我可以去改变收敛ε、动量等。但问题是我应该以什么学习率改变这些?我对求解器类型有一些不确定性。有什么建议吗?
    • 好的;这删除了我的一些建议。对于其余的,我会尝试使用原始的训练率,在每个方向上将其他的更改为 1.5 倍。我对更改求解器的主要步骤不太熟悉,但是……您使用的是 SoftMax 吗?
    • 是的,SoftMax。我正在使用 SGD 求解器。我不知道更改求解器类型(例如 ADAM)是否有帮助!
    • 嗯,显而易见的反应 :-) 是尝试其他求解器,看看他们做了什么。
    猜你喜欢
    • 2015-12-19
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2017-07-13
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    相关资源
    最近更新 更多