'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)

Code

output with 0 hidden layer

output with 2 hidden layers

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