为什么激活函数会降低CNN模型的时间性能?



我正在通过一些不同的小变化测试CNN模型的时间和准确性性能。在这个模型中,一些卷积之间的激活层被跳过。所以我把它们加起来。我注意到添加ELU激活的模型具有

性能每张图像3.07 ms在测试集上92.26%准确率

没有它们的模型有

性能每张图像3.52 ms在测试集上92.34%准确率

虽然模型参数的个数相同。所以我的问题是,为什么激活会降低模型的时间性能这么多?

下面是代码的一部分:

...
nn.Conv2d(28 * filters_multiplier, 28 * filters_multiplier, kernel_size=(3, 1), padding=(1, 0)),
nn.Conv2d(28 * filters_multiplier, 28 * filters_multiplier, kernel_size=(1, 3), padding=(0, 1)),
# nn.ELU(), 
nn.Conv2d(28 * filters_multiplier, 28 * filters_multiplier, kernel_size=(3, 1), padding=(1, 0)),
nn.Conv2d(28 * filters_multiplier, 40 * filters_multiplier, kernel_size=(1, 3), padding=(0, 1)),
...

所以带注释块的代码比不带注释的代码运行得快。

我刚刚测试了ReLU()函数,它的工作速度与没有激活的第一个模型一样快。所以也许问题只是在ELU()?

ReLU和ELU都没有可学习的参数,但它们仍然需要计算来执行。

ELU对所有x >= 0执行指数函数。这是昂贵的计算,所以你的网络是较慢的。

ReLU在计算上很便宜,因为操作x[x < 0] = 0很容易,所以你不会看到时间上的峰值。这就是为什么ReLU作为激活函数被普遍选择的原因之一。

最新更新