目标:带有一个隐藏层的平面数据分类神经网络
参考自:【中文】【吴恩达课后编程作业】Course 1 - 神经网络和深度学习 - 第三周作业
X:一个numpy的矩阵,包含了这些数据点的数值
Y:一个numpy的向量,对应着的是X的标签【0 | 1】(红色:0 , 蓝色 :1)
X的维度为: (2, 400)
Y的维度为: (1, 400)
数据集里面的数据有:400 个
该图是具有两层结构的神经网络(一个隐藏层),隐藏层的结点数为4个(之后可改)
标准差为1 均值为0 的正态分布 随机数
乘上0.01是保证参数足够小(w太大会导致梯度消失)
W1 = np.random.randn(n_h, n_x) * 0.01
b1 = np.zeros(shape=(n_h, 1))
W2 = np.random.randn(n_y, n_h) * 0.01
b2 = np.zeros(shape=(n_y, 1))
注:
z [ 1 ] ( i ) = w [ 1 ] x [ 0 ] ( i ) + b [ 1 ] ( i ) z^{[1](i)} = w^{[1]}x^{[0](i)} + b^{[1](i)} z[1](i)=w[1]x[0](i)+b[1](i)
激活值:
a [ 1 ] ( i ) = t a n h ( z [ 1 ] ( i ) ) a^{[1](i)} = tanh(z^{[1](i)}) a[1](i)=tanh(z[1](i))
z [ 2 ] ( i ) = w [ 2 ] a [ 1 ] ( i ) + b [ 2 ] ( i ) z^{[2](i)} = w^{[2]}a^{[1](i)} + b^{[2](i)} z[2](i)=w[2]a[1](i)+b[2](i)
激活值(预测值):
y ^ ( i ) = a [ 2 ] ( i ) = s i g m o i d ( z [ 2 ] ( i ) ) \hat y^{(i)} = a^{[2](i)} = sigmoid(z^{[2](i)}) y^(i)=a[2](i)=sigmoid(z[2](i))
损失函数:
L ( a ( i ) , y ( i ) ) = − y ( i ) log ( a [ 2 ] ( i ) ) − ( 1 − y ( i ) ) log ( 1 − a [ 2 ] ( i ) ) L(a^{(i)},y^{(i)}) = -y^{(i)}\log(a^{[2](i)}) - (1-y^{(i)})\log(1-a^{[2](i)}) L(a(i),y(i))=−y(i)log(a[2](i))−(1−y(i))log(1−a[2](i))
成本函数:
J = 1 m ∑ i = 1 n L ( a [ 2 ] ( i ) , y ( i ) ) J = {1 \over m} \displaystyle\sum_{i=1}^n L(a^{[2](i)},y^{(i)}) J=m1i=1∑nL(a[2](i),y(i))
d ( c o s t ) d a 2 = − y a 2 + ( 1 − y ) ( 1 − a 2 ) {d(cost) \over da_2} = -{y\over a_2} + {(1-y) \over (1-a_2)} da2d(cost)=−a2y+(1−a2)(1−y)
d a 2 d z 2 = a 2 ( 1 − a 2 ) {da_2 \over dz_2} = a_2(1-a_2) dz2da2=a2(1−a2)
所以,
d z 2 : : = d ( c o s t ) d z = a 2 − y dz_2 ::={d(cost) \over dz} = a_2 - y dz2::=dzd(cost)=a2−y
d w 2 : : = d ( c o s t ) d w 2 = a 1 ⋅ " d z 2 T " dw_2 ::={d(cost) \over dw_2} = a_1 \cdot "dz_2^{T}" dw2::=dw2d(cost)=a1⋅"dz2T"
d b 2 : : = d ( c o s t ) d b 2 = " d z 2 " db_2 ::= {d(cost) \over db_2} = "dz_2" db2::=db2d(cost)="dz2"
其中,
s i g m o i d ( z ) = 1 1 + e − x sigmoid(z) = {1 \over 1 + e^{-x}} sigmoid(z)=1+e−x1
a 2 = s i g m o i d ( z 2 ) a_2 = sigmoid(z_2) a2=sigmoid(z2)
z 2 = w 2 ∗ a 1 + b 2 z_2 = w_2 * a_1 + b_2 z2=w2∗a1+b2
d a 1 d z 1 = 1 − a 1 2 {da_1 \over dz_1} = 1 - a_1^{2} dz1da1=1−a12
d z 1 : : = d ( c o s t ) d z 1 = d ( c o s t ) d z 2 ⋅ d z 2 d a 1 ⋅ d a 1 d z 1 = " d z 2 " ⋅ " w 2 T " ∗ ( 1 − a 1 2 ) dz_1 ::= {d(cost) \over dz_1} = {d(cost) \over dz_2} \cdot {dz_2 \over da_1} \cdot {da_1 \over dz_1} = "dz_2" \cdot "w_2^{T}" * (1 - a_1^{2}) dz1::=dz1d(cost)=dz2d(cost)⋅da1dz2⋅dz1da1="dz2"⋅"w2T"∗(1−a12)
d w 1 : : = d ( c o s t ) d w 1 = x ⋅ " d z 1 T " dw_1 ::={d(cost) \over dw_1} = x \cdot "dz_1^{T}" dw1::=dw1d(cost)=x⋅"dz1T"
d b 1 : : = d ( c o s t ) d b 1 = " d z 1 " db_1 ::= {d(cost) \over db_1} = "dz_1" db1::=db1d(cost)="dz1"
其中,
t a n h ( z ) = e x − e − x e x + e − x tanh(z) = {e^x - e^{-x} \over e^x + e^{-x}} tanh(z)=ex+e−xex−e−x
a 1 = t a n h ( z 1 ) a_1 = tanh(z_1) a1=tanh(z1)
z 2 = w 2 ∗ a 1 + b 2 z_2 = w_2 * a_1 + b_2 z2=w2∗a1+b2
z 1 = z 1 ∗ x + b 1 z_1 = z_1 * x + b_1 z1=z1∗x+b1
梯度下降 更新参数
W1 = W1 - learning_rate * dW1
b1 = b1 - learning_rate * db1
W2 = W2 - learning_rate * dW2
b2 = b2 - learning_rate * db2
由于,输出层使用了sigmoid函数,预测值的范围为(0,1)
使用np.around(),可以对结果进行四舍五入,换句话说,就是把预测的概率转换成独热编码(one-hot encoding)的方式
np.dot() 对于二维矩阵,同线性代数中定义的乘法相同。
np.multiply() 在python中,实现对应元素相乘
example:
X = [[1,2],
[3,4]]
Y = [[5,6],
[7,8]]
np.dot(X,Y)=
[[19 22]
[43 50]]
np.multiply(X,Y)=
[[ 5 12]
[21 32]]
X*Y=
[[ 5 12]
[21 32]]
逻辑回归的准确性: 47 % (正确标记的数据点所占的百分比)
隐藏层的节点数量: 1 ,准确率: 67.5 %
隐藏层的节点数量: 2 ,准确率: 67.25 %
隐藏层的节点数量: 3 ,准确率: 90.75 %
隐藏层的节点数量: 4 ,准确率: 90.5 %
隐藏层的节点数量: 5 ,准确率: 91.25 %
隐藏层的节点数量: 20 ,准确率: 90.5 %
隐藏层的节点数量: 50 ,准确率: 90.75 %
效果同之前的数据集类似,当神经元数达到20时,出现过拟合现象
隐藏层的节点数量: 1 ,准确率: 86.0 %
隐藏层的节点数量: 2 ,准确率: 86.5 %
隐藏层的节点数量: 3 ,准确率: 97.0 %
隐藏层的节点数量: 4 ,准确率: 96.5 %
隐藏层的节点数量: 5 ,准确率: 96.0 %
隐藏层的节点数量: 20 ,准确率: 86.0 %
隐藏层的节点数量: 50 ,准确率: 86.0 %