博主【何宽】分享的【优质作业】已经非常完善了,我直接复制完整之后在自己的虚拟机上跑完全没问题,结果相同。只是对他分步演示的部分,在此提出其中一些需要注意的地方。
- 图片无法显示
plt.imshow()并不能让图片显示出来,还需要在后面加上plt.show()才会加载出那个index=25的猫的图片
- 错误提示:
propagate函数中存在缩进不一致问题,将propagate函数修改成以下形式即可
def propagate(w, b, X, Y):
"""
实现前向和后向传播的成本函数及其梯度。
参数:
w - 权重,大小不等的数组(num_px * num_px * 3,1)
b - 偏差,一个标量
X - 矩阵类型为(num_px * num_px * 3,训练数量)
Y - 真正的“标签”矢量(如果非猫则为0,如果是猫则为1),矩阵维度为(1,训练数据数量)
返回:
cost- 逻辑回归的负对数似然成本
dw - 相对于w的损失梯度,因此与w相同的形状
db - 相对于b的损失梯度,因此与b的形状相同
"""
m = X.shape[1]
#正向传播
A = sigmoid(np.dot(w.T,X) + b) #计算激活值,请参考公式2。
cost = (- 1 / m) * np.sum(Y * np.log(A) + (1 - Y) * (np.log(1 - A))) #计算成本,请参考公式3和4。
#反向传播
dw = (1 / m) * np.dot(X, (A - Y).T) #请参考视频中的偏导公式。
db = (1 / m) * np.sum(A - Y) #请参考视频中的偏导公式。
#使用断言确保我的数据是正确的
assert(dw.shape == w.shape)
assert(db.dtype == float)
cost = np.squeeze(cost)
assert(cost.shape == ())
#创建一个字典,把dw和db保存起来。
grads = {
"dw": dw,
"db": db
}
return (grads , cost)
- 关于optimize函数里面的costs
原文对costs没有详细说明,按我的理解,每调用一次optimize()函数,costs[]都会被初始化(上一次优化得到的costs清空),函数结束时返回的costs是一个数组,存着本次优化(即用更新后的w和b来优化)过程中每100次迭代时所得到的损失函数值。
即
costs=[J0 J100 J200 … J1900]
其中J后面的数字n代表第n次迭代,实际上i的值是从0开始的,即0~1999,所以有J0而没有J2000.
来源:CSDN
作者:泼夫
链接:https://blog.csdn.net/Clover_pofu/article/details/104401583