我正在实现一个神经网络,并想使用 ReLU 作为神经元的激活函数。此外,我正在使用 SDG 和反向传播训练网络。我正在用范式 XOR 问题测试神经网络,到目前为止,如果我使用逻辑函数或双曲正切作为激活函数,它会正确分类新样本。
我一直在阅读有关使用 Leaky ReLU 作为激活函数的好处,并在 Python 中实现它,如下所示:
def relu(data, epsilon=0.1):
return np.maximum(epsilon * data, data)
NumPynp
的名称在哪里。相关的导数是这样实现的:
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