无法在 caffe 中使用 PReLU train/fine-tune

Unable to train/fine-tune with PReLU in caffe

我正在使用深度神经网络进行人脸识别。我正在使用 CASIA-webface database of 10575 classes for training a deep CNN (used by CASIA, see the paper for details) of 10 Convolution, 5 Pooling and 1 Fully Connected layer. For the activation it uses "ReLU" function. I was able to successfully train it using 并获得了所需的性能。

我的问题是,我无法使用 "PReLU" 激活 train/fine-tune 相同的 CNN。起初,我认为用 "PReLU" 简单替换 "ReLU" 就可以完成这项工作。然而,微调的none(来自用"ReLU"学习的caffemodel)和从头开始学习策略有效.

为了简化学习问题,我将训练数据集显着减少为 50 类。然而,CNN 无法通过 "PReLU" 进行学习,而能够通过 "ReLU".

进行学习

为了了解我的 caffe 在 "PReLU" 上运行良好,我使用 cifar10 数据通过 运行 简单网络("ReLU""PReLU")对其进行了验证它奏效了。

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

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

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

两个基本观察:

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

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

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

"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 设置为任何值不为零是不明智的。