1

我编写了一个简单的 NN 库,它可以创建一个任意大小的神经网络,并且可以使用给定的激活函数及其导数来训练网络。网络使用 sigmoid 作为激活函数做得很好,但永远不会与 relu 或leaky relu 收敛。我使用在 2D 网格上分离 2 组点的问题作为标准问题,以便轻松检测网络是否正在收敛。这是使用 sigmoid 解决问题的结果 :: (x>0 and y>0) or (x<0 and y<0)

在此处输入图像描述

这是使用 Leaky Relu 解决相同问题的结果: 在此处输入图像描述

我自己实现了预测和反向传播函数,所以我认为可能存在问题,但网络在 sigmoid 上表现良好的事实让我认为 relu 和leaky-relu 是问题所在。我自己也实现了它们,但我在我的实现中看不到问题。这是我的 Relu 实现及其衍生物:

## RelU
def Relu(num):
    return np.where(num>0,num,0)


## Relu derivative
def Relu_deriv(num):
    num=np.where(num>0,num,0)
    num=np.where(num==0,num,1)

    return num

这是我的 Leaky relu 实现及其衍生物:

## leaky RelU
def L_Relu(num):
    return np.where(num>0,num,0.01*num)

## leaky RelU deriv
def L_Relu_D(num):
    num=np.where(num<=0,num,1)
    num=np.where(num>=0,num,0.01)

    return num

我也把整个“库”的代码上传到了GitHub: 点击查看GitHub中的代码

您可以在 main.py 中看到预测和反向传播函数的代码。如果你想在分离两组点的问题上测试网络,你可以在 test_problem.py 中运行测试函数

我非常感谢有关问题背后原因以及如何解决问题的任何建议。注意:我虽然问题可能正在死去 relu 但这不应该发生在泄漏的 relu 上。

4

0 回答 0