神经网络学习笔记
简单神经网络手算!
通过简单神经网络的手算过程。了解代码每步的效果。为以后复杂的网络打个好的基础。
简单的神经网络如上图所示:输入两个参数x1和x2,分别乘权重w1和w2,再加一个偏置参数,最终得到值z,然后将得到的z经过激活函数后,得到预测值a。
如下图所示:
流程图如下:
以代码为例,计算如下:
# 计算dw和db
def propagate(w,b,X,Y):
# dz= a-y ; dw=x*dz; db =dz ; cost = (1/m)Loss; Loss =-( y*loga+(1-y)*log(1-a)); a = sigmoid(z) ; z=x*w+b;
m=X.shape[1]
z = np.dot(w.T,X)+b
print("z:",z)
a = sigmoid(z)
print("a:", a)
loss = -(Y*np.log(a)+(1-Y)*np.log(1-a))
print("loss:",loss)
cost = (1/X.shape[1])*np.sum(loss)
print("cost:",cost)
dz = a-Y
print("dz:",dz)
dw=(1/m)*np.dot(X,dz.T)
print("dw:",dw)
db=(1/m)*np.sum(dz)
print("db:",db)
# 使用断言确保数据正确
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)
#测试一下propagate
print("====================测试propagate====================")
#初始化一些参数
w, b, X, Y = np.array([[1], [2]]), 2, np.array([[1,2,3], [4,5,6]]), 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))
输出结果为:
====================测试propagate====================
z: [[11 14 17]]
a: [[0.9999833 0.99999917 0.99999996]]
loss: [[1.67015613e-05 1.40000008e+01 4.13993765e-08]]
cost: 4.6666725247884155
dz: [[-1.67014218e-05 9.99999168e-01 -4.13993756e-08]]
dw: [[0.6666605 ]
[1.66664293]]
db: 0.3333274752169162
dw = [[0.6666605 ]
[1.66664293]]
db = 0.3333274752169162
cost = 4.6666725247884155
代码中给的初试数据如下图:
第一步计算z=wx+b
z = np.dot(w.T,X)+b
即将w转置后和矩阵A求积。
其中w是21的。理解为有两个参数,w1和w2。X为23的。理解为有三个输入集合。Y为1*3的。有三个真实值。
数学公式如下图:
a = sigmoid(z)
loss = -(Y*np.log(a)+(1-Y)*np.log(1-a))
cost = (1/X.shape[1])*np.sum(loss)
dz = a-Y
计算步骤如下图所示:
dw=(1/m)*np.dot(X,dz.T)
np.dot(X,dz.T)
做的运算就是将所有样本的每个x和对应的dz相乘后相加。除以样本数量后,得到的就是平均值。
db运算同dw。