单隐藏层神经网络对数据做2分类

2021-01-14 14:45:18 浏览数 (1)

例子代码位置: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. 循环:

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

0 人点赞