【发布时间】:2020-07-31 17:41:15
【问题描述】:
计算成本函数的公式:
计算 w,b 梯度损失的公式:
参数:
- w -- 权重,一个大小为 (num_px * num_px * 3, 1) 的 numpy 数组
- b -- 偏差,一个标量
- X -- 数据大小(num_px * num_px * 3,示例数)
- Y -- 真正的“标签”向量(如果不是猫则包含 0,如果是猫则包含 1)大小(1,示例数)
返回:
成本 -- 逻辑回归的负对数似然成本
dw -- 损失相对于 w 的梯度,因此形状与 w 相同
db -- 损失相对于 b 的梯度,因此形状与 b 相同
我的代码:
import numpy as np
def sigmoid(z):
"""
Compute the sigmoid of z
Arguments:
z -- A scalar or numpy array of any size.
Return:
s -- sigmoid(z)
"""
### START CODE HERE ### (≈ 1 line of code)
s = None
s = 1 / (1 + np.exp(-z))
### END CODE HERE ###
return s
# GRADED FUNCTION: propagate
def propagate(w, b, X, Y):
"""
Implement the cost function and its gradient for the propagation explained above
Tips:
- Write your code step by step for the propagation. np.log(), np.dot()
"""
m = X.shape[1]
# FORWARD PROPAGATION (FROM X TO COST)
### START CODE HERE ### (≈ 2 lines of code)
A = None # compute activation
cost = None # compute cost
k = w * X + b
A = sigmoid(k)
cost = (-Y * np.log(A) - (1 - Y) * np.log(1 - A)).mean() / m
### END CODE HERE ###
# BACKWARD PROPAGATION (TO FIND GRAD)
### START CODE HERE ### (≈ 2 lines of code)
dw = None
db = None
db = np.subtract(A , Y)
dw = np.dot(X,db.T)/m
db = np.sum(db)/m
### END CODE HERE ###
# assert(dw.shape == w.shape)
# assert(db.dtype == float)
# cost = np.squeeze(cost)
# assert(cost.shape == ())
grads = {"dw": dw,
"db": db}
return grads, cost
w, b, X, Y = np.array([[1.],[2.]]), 2., np.array([[1.,2.,-1.],[3.,4.,-3.2]]), np.array([[1,0,1]])
grads, cost = propagate(w, b, X, Y)
print ("dw = " + str(grads["dw"]))
print ("db = " + str(grads["db"]))
print ("cost = " + str(cost))
我的输出:
dw = [[ 0.72851438 0.99581514]
[ 1.5487967 2.38666712]]
db = 0.225798060825
cost = 1.04403235316
预期输出:
dw = [[ 0.99845601] [ 2.39507239]]
db = 0.00145557813678
cost = 5.801545319394553
谁能告诉我为什么我的 dw 维度与预期输出不同并帮助找到成本函数?
【问题讨论】:
-
我投票结束这个问题,因为它不属于这里,而是属于datascience.stackexchange.com
标签: python logistic-regression backpropagation