前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单隐藏层神经网络对数据做2分类

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

作者头像
lovelife110
发布2021-01-14 14:45:18
5440
发布2021-01-14 14:45:18
举报
文章被收录于专栏:爱生活爱编程爱生活爱编程

例子代码位置: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)

神经网络模型

代码语言: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,对于单个样本

x^{(i)}
x^{(i)}

公式:

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

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

向量化公式:

Z^{[1] } = W^{[1]} X + B^{[1]}
Z^{[1] } = W^{[1]} X + B^{[1]}
A^{[1] } = \tanh(Z^{[1] })
A^{[1] } = \tanh(Z^{[1] })
Z^{[2] } = W^{[2]} A^{[1] } + B^{[2] }
Z^{[2] } = W^{[2]} A^{[1] } + B^{[2] }
\hat{Y} = A^{[2] } = \sigma(Z^{ [2] })
\hat{Y} = A^{[2] } = \sigma(Z^{ [2] })
代码语言:javascript
复制
# 前向传播,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
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
代码语言:javascript
复制
# 计算成本
logprobs = np.multiply(np.log(A2), Y) + np.multiply((1 - Y), np.log(1 - A2))
cost = - np.sum(logprobs) / m

反向传播

左边公式为单个样本

x^{(i)}
x^{(i)}

公式,右边为向量化后的公式,其中dZ1需要计算

g^{[1]'}(Z^{[1]})
g^{[1]'}(Z^{[1]})

,g激活函数为tanh,求导为

1-(\tanh (x))^{2}
1-(\tanh (x))^{2}

所以

g^{[1]'}(Z^{[1]})
g^{[1]'}(Z^{[1]})

1-a^2
1-a^2
代码语言: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)

\theta = \theta - \alpha \frac{\partial J }{ \partial \theta }
\theta = \theta - \alpha \frac{\partial J }{ \partial \theta }
  • α:学习速率
  • θ:参数

预测

构建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是不能全部初始化为零,会导致

W_1^{[1]}
W_1^{[1]}

始终等于

W_2^{[1]}
W_2^{[1]}

,完全对称。这样隐藏层设置多个神经元就没有任何意义了。 3. 循环:

  • 实施前向传播
  • 计算损失
  • 实现向后传播
  • 更新参数(梯度下降)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 神经网络模型
  • 正向传播
  • 反向传播
  • 更新参数
  • 预测
  • 构建神经网络步骤
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档