import numpy as np
from testCases import *
from gc_utils import sigmoid,relu,dictionary_to_vector,vector_to_dictionary,gradients_to_vector
from testCases import gradient_check_n_test_case
Gradient_check.py
import numpy as np
from testCases import *
from gc_utils import sigmoid,relu,dictionary_to_vector,vector_to_dictionary,gradients_to_vector
from testCases import gradient_check_n_test_case
def gradient_check(x,theta,epsilon= 1e-7):
J=x*theta
dtheta=x
gradapprox=(x*(theta+epsilon)-x*(theta-epsilon))/(2*epsilon)
grad=dtheta
numerator=np.linalg.norm(grad-gradapprox)
denomitor=np.linalg.norm(grad)+np.linalg.norm(gradapprox)
difference=numerator/denomitor
if difference < epsilon:
print "the gradient is correct"
elif difference >= epsilon:
print "the gradient is not so ideal"
return J,difference
x,theta=2,4
J,difference = gradient_check(x,theta)
print("difference = "+str(difference))
def forward_propagation_n(X,Y,parameters):
m=X.shape[1]
W1=parameters["W1"]
b1=parameters["b1"]
W2=parameters["W2"]
b2=parameters["b2"]
W3=parameters["W3"]
b3=parameters["b3"]
Z1=np.dot(W1,X)+b1
A1=relu(Z1)
Z2=np.dot(W2,A1)+b2
A2=relu(Z2)
Z3=np.dot(W3,A2)+b3
A3=sigmoid(Z3)
cost=(-1.0/m)*(np.sum(Y*np.log(A3)+(1-Y)*np.log(1-A3)))
cache=(Z1,A1,W1,b1,Z2,A2,W2,b2,Z3,A3,W3,b3)
return cost,cache
def backward_propagation_n(X,Y,cache):
(Z1,A1,W1,b1,Z2,A2,W2,b2,Z3,A3,W3,b3)=cache
m=X.shape[1]
grads={}
dZ3=A3-Y
dW3=(1.0/m)*np.dot(dZ3,A2.T)
db3=(1.0/m)*np.sum(dZ3,axis=1,keepdims=True)
dA2=np.dot(W3.T,dZ3)
dZ2=np.multiply(dA2,np.int64(Z2>0))
dW2=(1.0/m)*np.dot(dZ2,A1.T)
db2=(1.0/m)*np.sum(dZ2,axis=1,keepdims=True)
dA1=np.dot(W2.T,dZ2)
dZ1=np.multiply(dA1,np.int64(Z1>0))
dW1=(1.0/m)*np.dot(dZ1,X.T)
db1=(1.0/m)*np.sum(dZ1,axis=1,keepdims=True)
grads={"dZ3": dZ3, "dW3": dW3, "db3": db3,
"dA2": dA2, "dZ2": dZ2, "dW2": dW2, "db2": db2,
"dA1": dA1, "dZ1": dZ1, "dW1": dW1, "db1": db1}
return grads