'Deep neural network gives a constant value as output
I have implemented a neural network from scratch. I have taken random values as both input and output. When I use a single layer( with sigmoid activation) the network performs well. But when I increase the number of layers( No matter which activation I use), The network outputs a constant value.
I have attached the link to the full code and output for single layer and and a network with 2 hidden layers.
HyperParameter (relu,sigmoid,derRelu and derSigmoid are functions)
alpha= 0.01 #learning rate
m=10 #number of examples in training set
numberOfLayers=2 #including input and output layer
activations=[None,relu,sigmoid]
derActivations=[None,derRelu,derSigmoid]
neurons=[10,5,1]
numberOfIterations=1000
Initialization of parameters:
parameters=[]
parameters.append({})
for i in range(1,numberOfLayers):
param={}
param["W"] =np.random.randn(neurons[i],neurons[i-1])*0.01
param["b"] =np.zeros((neurons[i],1))
parameters.append(param)
These are some of the functions
def calculateZ(A,W,b):
Z=np.dot(W,A)+b
return Z
def derL(Y,A):
derL=np.true_divide(1-Y,1-A)-np.true_divide(Y,A)
return derL
def derW(dZ,A):
dW=np.dot(dZ,np.transpose(A))/m;
return dW
def derB(dZ):
db=np.sum(dZ,axis=1,keepdims=True)/m;
return db
def derZ(dW,dZ,Z,derActi):
dZNew=np.multiply(np.dot(np.transpose(dW),dZ),derActi(Z))
return dZNew
def forwardPropagation(layer):
W=parameters[layer]["W"] #current layer
b=parameters[layer]["b"] #current layer
A=parameters[layer-1]["A"] #previous layer
Z=calculateZ(A,W,b)
parameters[layer]["Z"]=Z #current layer
A=activations[layer](Z)
parameters[layer]["A"]=A
def backwardPropagation(layer):
Z=parameters[layer]["Z"] #current layer
if(layer==numberOfLayers-1):
A=parameters[layer]["A"]
dL=derL(Y,A)
dZ=np.multiply(dL,derActivations[layer](Z))
else:
dZ=parameters[layer+1]["dZ"] #next layer
dW=parameters[layer+1]["dW"] #next layer
dZ=derZ(dW,dZ,Z,derActivations[layer]) #current layer
parameters[layer]["dZ"]=dZ
A=parameters[layer-1]["A"] #previous layer
dW=derW(dZ,A) #current layer
parameters[layer]["dW"]=dW
db=derB(dZ) #current layer
parameters[layer]["db"]=db
Training
Y=np.random.randn(1,m)
Y=np.where(Y<0,0,1)
# genrating random input to test the code
parameters[0]["A"]=np.random.randn(neurons[0],m)
costs=[]
for i in range(numberOfIterations):
for layer in range(1,numberOfLayers):
forwardPropagation(layer)
A=parameters[numberOfLayers-1]["A"]
l=calculateLoss(Y,A)
costs.append(l[0][0])
for layer in range(numberOfLayers-1,0,-1):
backwardPropagation(layer)
for layer in range(1,numberOfLayers):
updateParameters(layer)
I am unable to find the problem.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
