例子代码位置:https://github.com/lilihongjava/deep_learning/tree/master/单隐藏层2分类神经网络
对上图的数据建立一个模型来做分类
X:一个numpy的矩阵,包含了这些数据点的数值,维度为: (2, 400)
Y:一个numpy的向量,对应着的是X的标签【0 | 1】(红色:0 , 蓝色 :1),度为: (1, 400)
神经网络模型
代码语言:javascript复制n_x - 输入层节点的数量,图中为2
n_h - 隐藏层节点的数量,图中为4
n_y - 输出层节点的数量,图中为1
W1 - 权重矩阵,维度为(n_h,n_x)---(4,2)
b1 - 偏向量,维度为(n_h,1)---(4,1)
W2 - 权重矩阵,维度为(n_y,n_h)---(1,4)
b2 - 偏向量,维度为(n_y,1)---(1,1)
正向传播
正向传播通过公式计算y,对于单个样本
公式:
隐藏层为什么用tanh,是因为tanh激活函数通常比隐藏层单元的sigmoid激活函数效果更好,因为其输出的平均值更接近于零。
而输出层用sigmoid,是因为此项目做的是二分类
向量化公式:
代码语言:javascript复制# 前向传播,python代码
Z1 = np.dot(W1, X) b1
A1 = np.tanh(Z1)
Z2 = np.dot(W2, A1) b2
A2 = sigmoid(Z2)
对于所有样本的成本函数J公式:
代码语言:javascript复制# 计算成本
logprobs = np.multiply(np.log(A2), Y) np.multiply((1 - Y), np.log(1 - A2))
cost = - np.sum(logprobs) / m
反向传播
左边公式为单个样本
公式,右边为向量化后的公式,其中dZ1需要计算
,g激活函数为tanh,求导为
所以
为
代码语言:javascript复制 dZ2 = A2 - Y
dW2 = (1 / m) * np.dot(dZ2, A1.T)
db2 = (1 / m) * np.sum(dZ2, axis=1, keepdims=True)
dZ1 = np.multiply(np.dot(W2.T, dZ2), 1 - np.power(A1, 2))
dW1 = (1 / m) * np.dot(dZ1, X.T)
db1 = (1 / m) * np.sum(dZ1, axis=1, keepdims=True)
更新参数
使用反向传播的(dW1, db1, dW2, db2)来更新(W1, b1, W2, b2)
- α:学习速率
- θ:参数
预测
构建predict()来使用模型进行预测, 使用向前传播来预测结果。 激活值大于0.5为1,小于为0
代码语言:javascript复制# forward_propagation正向传播公式
A2, cache = forward_propagation(X, parameters)
# np.round四舍五入,既大于0.5为1,其他为0
predictions = np.round(A2)
构建神经网络步骤
1. 定义神经网络结构(输入单元的数量,隐藏单元的数量等)。 2. 初始化模型的参数,参数权重W是不能全部初始化为零,会导致
始终等于
,完全对称。这样隐藏层设置多个神经元就没有任何意义了。 3. 循环:
- 实施前向传播
- 计算损失
- 实现向后传播
- 更新参数(梯度下降)