例子代码位置:https://github.com/lilihongjava/deep_learning/tree/master/%E5%8D%95%E9%9A%90%E8%97%8F%E5%B1%822%E5%88%86%E7%B1%BB%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C

对上图的数据建立一个模型来做分类

X:一个numpy的矩阵,包含了这些数据点的数值,维度为: (2, 400)

Y:一个numpy的向量,对应着的是X的标签【0 | 1】(红色:0 , 蓝色 :1),度为: (1, 400)

神经网络模型

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,对于单个样本x^{(i)}公式:

隐藏层为什么用tanh,是因为tanh激活函数通常比隐藏层单元的sigmoid激活函数效果更好,因为其输出的平均值更接近于零。

而输出层用sigmoid,是因为此项目做的是二分类

向量化公式:

Z^{[1] } = W^{[1]} X + B^{[1]}

A^{[1] } = \tanh(Z^{[1] })

Z^{[2] } = W^{[2]} A^{[1] } + B^{[2] }

\hat{Y} = A^{[2] } = \sigma(Z^{ [2] })

# 前向传播,python代码
Z1 = np.dot(W1, X) + b1
A1 = np.tanh(Z1)
Z2 = np.dot(W2, A1) + b2
A2 = sigmoid(Z2)

对于所有样本的成本函数J公式:

J = - \frac{1}{m} \sum\limits_{i = 0}^{m} \large\left(\small Y\log\left(A^{[2] }\right) + (1-Y)\log\left(1- A^{[2]}\right) \large \right) \small

# 计算成本
logprobs = np.multiply(np.log(A2), Y) + np.multiply((1 - Y), np.log(1 - A2))
cost = - np.sum(logprobs) / m

反向传播

左边公式为单个样本x^{(i)}公式,右边为向量化后的公式,其中dZ1需要计算g^{[1]'}(Z^{[1]}),g激活函数为tanh,求导为1-(\tanh (x))^{2}

所以g^{[1]'}(Z^{[1]})1-a^2

    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)

\theta = \theta - \alpha \frac{\partial J }{ \partial \theta }

  • α:学习速率
  • θ:参数

预测

 

构建predict()来使用模型进行预测, 使用向前传播来预测结果。
激活值大于0.5为1,小于为0

# forward_propagation正向传播公式
A2, cache = forward_propagation(X, parameters)
# np.round四舍五入,既大于0.5为1,其他为0
predictions = np.round(A2)

构建神经网络步骤

1. 定义神经网络结构(输入单元的数量,隐藏单元的数量等)。
2. 初始化模型的参数,参数权重W是不能全部初始化为零,会导致W_1^{[1]}始终等于W_2^{[1]},完全对称。这样隐藏层设置多个神经元就没有任何意义了。
3. 循环:

  • 实施前向传播
  • 计算损失
  • 实现向后传播
  • 更新参数(梯度下降)
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐