【机器学习小记】【平面数据分类】deeplearning.ai course1 3rd week programming

带有一个隐藏层的平面数据分类

  • 数据集介绍
    • 数据集形状
  • 模型搭建
  • 参数初始化
  • 前向传播
    • 隐藏层
    • 输出层
  • 反向传播
    • 输出层
    • 隐藏层
  • 梯度下降更新参数
  • 预测
  • 其他
    • np.dot() 与 np.multiply() 的区别
  • 结果
    • 使用简单逻辑回归
    • 测试不同的隐藏层神经元数
  • 测试其他数据集
    • 原始数据集
    • 测试不同的隐藏层神经元数

目标:带有一个隐藏层的平面数据分类神经网络

参考自:【中文】【吴恩达课后编程作业】Course 1 - 神经网络和深度学习 - 第三周作业

数据集介绍

【机器学习小记】【平面数据分类】deeplearning.ai course1 3rd week programming_第1张图片

X:一个numpy的矩阵,包含了这些数据点的数值
Y:一个numpy的向量,对应着的是X的标签【0 | 1】(红色:0 , 蓝色 :1)

数据集形状

X的维度为: (2, 400)
Y的维度为: (1, 400)
数据集里面的数据有:400

模型搭建

该图是具有两层结构的神经网络(一个隐藏层),隐藏层的结点数为4个(之后可改)
【机器学习小记】【平面数据分类】deeplearning.ai course1 3rd week programming_第2张图片

参数初始化

标准差为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))

注:

  1. w这里已经【转置】
  2. b这里也可以用python的【广播】机制,而不用赋值成向量

前向传播

隐藏层

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))(1y(i))log(1a[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=1nL(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+(1a2)(1y)
d a 2 d z 2 = a 2 ( 1 − a 2 ) {da_2 \over dz_2} = a_2(1-a_2) dz2da2=a2(1a2)
所以,
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)=a2y
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+ex1

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=w2a1+b2


隐藏层

d a 1 d z 1 = 1 − a 1 2 {da_1 \over dz_1} = 1 - a_1^{2} dz1da1=1a12

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)da1dz2dz1da1="dz2""w2T"(1a12)
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+exexex

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=w2a1+b2

z 1 = z 1 ∗ x + b 1 z_1 = z_1 * x + b_1 z1=z1x+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() 的区别

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]]

结果

使用简单逻辑回归

【机器学习小记】【平面数据分类】deeplearning.ai course1 3rd week programming_第3张图片

逻辑回归的准确性: 47 % (正确标记的数据点所占的百分比)

测试不同的隐藏层神经元数

当n_h = 5时,效果比较好
【机器学习小记】【平面数据分类】deeplearning.ai course1 3rd week programming_第4张图片

【机器学习小记】【平面数据分类】deeplearning.ai course1 3rd week programming_第5张图片
【机器学习小记】【平面数据分类】deeplearning.ai course1 3rd week programming_第6张图片
当神经元数达到20时,出现过拟合现象

隐藏层的节点数量: 1  ,准确率: 67.5 %
隐藏层的节点数量: 2  ,准确率: 67.25 %
隐藏层的节点数量: 3  ,准确率: 90.75 %
隐藏层的节点数量: 4  ,准确率: 90.5 %
隐藏层的节点数量: 5  ,准确率: 91.25 %
隐藏层的节点数量: 20  ,准确率: 90.5 %
隐藏层的节点数量: 50  ,准确率: 90.75 %

测试其他数据集

原始数据集

【机器学习小记】【平面数据分类】deeplearning.ai course1 3rd week programming_第7张图片

测试不同的隐藏层神经元数

【机器学习小记】【平面数据分类】deeplearning.ai course1 3rd week programming_第8张图片

【机器学习小记】【平面数据分类】deeplearning.ai course1 3rd week programming_第9张图片
【机器学习小记】【平面数据分类】deeplearning.ai course1 3rd week programming_第10张图片
效果同之前的数据集类似,当神经元数达到20时,出现过拟合现象

隐藏层的节点数量: 1  ,准确率: 86.0 %
隐藏层的节点数量: 2  ,准确率: 86.5 %
隐藏层的节点数量: 3  ,准确率: 97.0 %
隐藏层的节点数量: 4  ,准确率: 96.5 %
隐藏层的节点数量: 5  ,准确率: 96.0 %
隐藏层的节点数量: 20  ,准确率: 86.0 %
隐藏层的节点数量: 50  ,准确率: 86.0 %

你可能感兴趣的:(#,初学深度学习,机器学习,神经网络)