我正在尝试使用 Keras 实现一个非常具体的卷积神经网络。
主要区别在于我必须使用非常规激活函数:log
和exp
。
ConvNet的基本结构如下:
输入 => Conv2D => 激活日志 => 平均池 => 激活 Exp => ...
问题是:随着权重变得太小,log
激活值会迅速达到 -inf
。
我需要使用log
和exp
的原因是因为对于某些层我想模拟*产品池*,这是当前层的较小窗口(过滤器)。
如果我应用 log(a)
和 log(b)
,我可以进行正常的平均池化 ~ log(a)+ log(b)
后跟一个 exp
激活,它对应于我想要的产品:a * b = exp( log(a)+log(b) )
.
为了摆脱 -inf
,我尝试使用 SGD 和较低的学习率来训练网络,这样我可以获得更大的权重,但没有成功。
请问,您是否知道如何避免由于权重很小而导致的 -inf
,或者有一种更智能的方法来获得产品池而不需要记录
激活函数?
谢谢。
最佳答案
您的激活输出快速达到 -inf 的事实告诉我,您的卷积层的输出非常小!我无法为您提供如何避免 -inf 的明确答案,因为这取决于您的网络结构、输入值的范围以及网络训练的任务。
但是,我建议两种可能的解决方案:
- 您可能需要重新考虑您的权重初始化技术。许多实用的 CNN 都是从均值为零且方差相对较小(约 1x10^-3)的高斯分布进行初始化,这将成为网络中的一个问题,因为大多数权重非常小,并将导致卷积输出低于 1。
- 考虑激活输出的下限,例如 max{..} 函数。
关于machine-learning - 具有对数和指数激活函数的卷积神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47726549/