python - 使用 ReLU 作为激活函数的注意事项

标签 python numpy machine-learning neural-network activation-function

我正在实现一个神经网络,并希望使用 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 ReLU 是否是解决 XOR 问题的最佳选择,但这应该可以解决您的梯度问题。

关于python - 使用 ReLU 作为激活函数的注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41539047/

相关文章:

python - python数据框中所有行的零索引

Python避免在生成器中重复调用函数

python - 抗锯齿 PNG 在 Qt 中调整大小?

python - 比较数组,找到相同元素并返回索引

python - 如何从产品名称中提取品牌

python - 为继承类设置常量参数的最佳实践

python-3.x - 使用随机整数和跨列的有限总和创建 pandas 数据框

python - Numpy:条件检查后返回 boolean 数组

python - 如何使用 pandas.get_dummies 预测时间

r - 使用 R 从文本中提取位置列表