使用ReLU作为激活函数的考虑

我正在实现一个神经网络,并希望使用ReLU作为神经元的激活函数。此外,我使用SDG和反向传播来训练网络。我用经典的XOR问题来测试神经网络,到目前为止,如果我使用逻辑函数或双曲正切作为激活函数,它能够正确分类新样本。

我读了一些关于使用Leaky ReLU作为激活函数的好处的文章,并在Python中实现了它,像这样:

def relu(data, epsilon=0.1):    return np.maximum(epsilon * data, data)

其中npNumPy的名称。相关的导数实现如下:

def relu_prime(data, epsilon=0.1):    if 1. * np.all(epsilon < data):        return 1    return epsilon

使用这个函数作为激活函数时,我得到了不正确的结果。例如:

  • 输入 = [0, 0] –> 输出 = [0.43951457]

  • 输入 = [0, 1] –> 输出 = [0.46252925]

  • 输入 = [1, 0] –> 输出 = [0.34939594]

  • 输入 = [1, 1] –> 输出 = [0.37241062]

可以看出,输出与预期的XOR结果有很大不同。所以问题是,使用ReLU作为激活函数是否有特别需要考虑的地方?

请不要犹豫,向我询问更多上下文或代码。提前感谢。

编辑:在导数中有一个错误,因为它只返回一个单一的浮点值,而不是NumPy数组。正确的代码应该是:

def relu_prime(data, epsilon=0.1):    gradients = 1. * (data > epsilon)    gradients[gradients == 0] = epsilon    return gradients

回答:

你的relu_prime函数应该是这样的:

def relu_prime(data, epsilon=0.1):    gradients = 1. * (data > 0)    gradients[gradients == 0] = epsilon    return gradients

请注意,这里是将数据矩阵中的每个值与0进行比较,而不是epsilon。这是根据Leaky ReLUs的标准定义,当x > 0时梯度为1,否则为epsilon,从而创建了一个分段梯度。

我无法评论Leaky ReLUs是否是解决XOR问题的理想选择,但这应该能解决你的梯度问题。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注