assert (cost.shape == ())
return cost
无添加剂更新梯度无添加剂更新梯度
def update_parameters(parameters, grads, learning_rate):
'''
使用梯度下降法更新模型参数
参数:
parameters:模型参数
grads:计算的参数梯度 字典形式
learning_rate:学习率
返回:
parameters:更新后的参数 字典形式
parameters["W" + str(l)] = ...
parameters["b" + str(l)] = ...
'''
L = len(parameters) // 2 # 神经网络层数(输入层是第0层 不算输入层)
# 一次梯度下降迭代 更新参数
for l in range(L): # l 0~L-1
parameters['W' + str(l + 1)] = parameters['W' + str(l + 1)] - learning_rate * grads['dW' + str(l + 1)] parameters['b' + str(l + 1)] = parameters['b' + str(l + 1)] - learning_rate *
grads['db' + str(l + 1)]
return parameters
一,重要步骤:添加正则(损失函数)一,重要步骤:添加正则(损失函数)
#损失函数加正则
def compute_cost_with_regularization(AL, Y,parameters, lambd):
W1 = parameters['W1'] W2 = parameters['W2'] W3 = parameters['W3'] W4 = parameters['W4'] m = AL.shape[1] cross_entropy_cost = compute_cost(AL, Y)
L2_reglarization_cost = 1. / m * lambd / 2 * (
np.sum(np.square(W1)) + np.sum(np.square(W2)) + np.sum(np.square(W3) + np.sum(np.square(W4))))
cost = L2_reglarization_cost + cross_entropy_cost
return cost
反向传播加入正则反向传播加入正则
def sigmoid_backward(dA, cache):
'''
sigmoid激活单元(输出层)的反向传播
参数:
dA:当前层(输出层)激活输出AL的梯度
cache:存储当前层(输出层)的线性组合输出Z,方便激活单元反向传播的计算
返回:
dZ:当前层(输出层)线性组合输出Z的梯度
'''
Z = cache
s = 1. / (1 + np.exp(-Z))
# dZ=dA*(A对Z求导) A=sigmoid(Z) A对Z的导数=A(1-A)
dZ = dA * s * (1 - s)
assert (dZ.shape == Z.shape)