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