我实现了一个具有1个隐藏层的神经网络进行分类。它使用sigmoid activation
函数和cross entropy
损失。但是在看cs231n的讲座时,我遇到了收敛速度更快的relu activation
函数。所以,我使用relu激活隐藏层,但是准确度从超过90%
急剧下降到30-40%
。以前我一直在为relu而奋斗,因为cost function
总是倾向于{log
中添加一个小值来修复这个问题。在
以下是我在以前使用sigmoid激活的版本中修改的最重要的代码片段。我无法突出显示我更改的部分,所以我添加了#changed
注释。如果有人想仔细看的话,我会把整个代码都写出来。在
代码段:
激活功能:
def relu(arg): #I have tried both relu and leaky relu
return 1*(arg<0)*0.0001*arg + (arg>=0)*arg
def reluGrad(arg):
for i in range(arg.shape[0]):
for j in range(arg.shape[1]):
if arg[i][j]>0:
arg[i][j]=1
else:
arg[i][j]=0
return arg
def softmax(x):
x = x.transpose()
e_x = np.exp(x - np.max(x))
return (e_x / e_x.sum(axis=0)).transpose()
前进道具:
^{pr2}$计算成本:
cost = -(output*(np.log(a3))+(1-output)*(np.log(1-a3))).sum()
cost = (1/len(data))*cost + (lamb/(2*len(data)))*((np.delete(theta1,0,0)**2).sum() + (np.delete(theta2,0,0)**2).sum())
后盾:
sigma3 = a3-output
sigma2 = (sigma3.dot(np.transpose(theta2)))* reluGrad(np.insert(z2,0,np.ones(len(z2)),1)) #changed
sigma2 = np.delete(sigma2,0,1)
delta2 = (np.transpose(a2)).dot(sigma3)
delta1 = (np.transpose(a1)).dot(sigma2)
grad1 = delta1/len(data) + (lamb/len(data))*np.insert(np.delete(theta1,0,0),0,np.zeros(len(theta1[0])),0)
grad2 = delta2/len(data) + (lamb/len(data))*np.insert(np.delete(theta2,0,0),0,np.zeros(len(theta2[0])),0)
更新θ
theta1 = theta1 - alpha*grad1
theta2 = theta2 - alpha*grad2
为什么准确度降低?这个relu函数的实现有什么问题?在
目前没有回答
相关问题 更多 >
编程相关推荐