无法在 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 caffe 并获得了所需的性能。
我的问题是,我无法使用 "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
设置为任何值不为零是不明智的。
我正在使用深度神经网络进行人脸识别。我正在使用 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 caffe 并获得了所需的性能。
我的问题是,我无法使用 "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
设置为任何值不为零是不明智的。