神经网络-前向传播

来源:互联网 发布:淘宝商品色差严重 编辑:程序博客网 时间:2024/04/28 15:21

转载请标明出处:小帆的帆的专栏

记号

enter image description here

下面会用到这些记号

记号这样设计的原因是,希望产生这样的效果

zl+1=alWl+bl

上一层经过计算,产生,下一层的数据

X: 泛指样本集,不明确说明是用于,训练、验证还是测试
X(,j): 所有样本,第j个特征的值
y: 泛指样本集的真实输出值
alj: 第l层,第j个神经元的激活值
al: 第l层,神经元中的激活值。对于输入层来说,X就是a1
wljk:权重。第l层,从第j个神经元指向下一层第k个神经元
wlk:权重。第l层,指向下一层第k个神经元的权重
zlj: 第l层,第j个神经元激活前的值
zl: 第l层,神经元中激活前的值。zlz2开始,没有z1
σ: 表示某个激活函数
X_train: 训练样本集
y_train: 训练样本集的真实输出值
m: 样本集个数,也就是X的行数
n: 样本集的特征数,也就是X的列数,也等于input_size
input_size: 输入层神经元数量
hidden_size: 隐藏层神经元数量
output_size: 输出层神经元数量

特点

方向:从左往右
作用:由最左边的输入,计算出最右边的输出

推导

1、计算a1, 输入层

在前向传播过程中,我们只使用al而不使用X,因为al可以代表每一层中神经元的激活值,而X只表示输入层的值,所以

a1=X(1)

2、计算a2,隐藏层

首先需要算z2,然后z2经过激活函数后得到a2

z2=a1W1+b1(2)a2=σ(z2)(3)

3、计算a3,输出层

与计算a2一样

z3=a2W2+b2(4)a3=σ(z3)(5)

总结

当把X赋值给a1后,后面计算方式都是一样的,所以只需要下面三个公式就可以计算任何层级的前向传播了。

a1=X(1)zl+1=alWl+bl(6)al=σ(zl)(7)

代码实践

# coding=utf-8import numpy as npdef sigmoid(z):    return 1 / (1 + np.exp(-z))# 数据准备# 假设有一个二分类问题,有4个训练样本,样本有2个特征# 参考上图,下面的网络结构与上图一样# 每个样本有2个特征,因此输入层神经元个数为2input_size = 2# 隐藏层神经元个数hidden_size = 3# 2分类问题,因此输出为0或1.只需要一个神经元output_size = 1m = 4  # 训练样本数# 生成一个4 × 2的矩阵,每一行为一个训练样本X_train = np.random.randn(m, input_size)# 4个样本,每个样本对应的真实值y_train = np.array([0, 1, 1, 0])# 随机生产参数W1 = np.random.randn(input_size, hidden_size) # (2 × 3)b1 = np.random.randn(hidden_size) # (3,)W2 = np.random.randn(hidden_size, output_size) # (3, 1)b2 = np.random.randn(output_size) # (1,)a1 = X_train  # 第一层不需要任何计算,X就是a1# a1: 4 * 2# W1: 2 * 3# z2,应该是4 × 3,因为训练样本有4个,而隐藏层的神经元个数为3# 所以要想通过a1和W1点乘,得到一个4 × 3的矩阵,a1 * W1, (4, 2) * (2, 3) = (4, 3)# a1.dot(W1)是(4, 3),b1是(3,),b1会加到每一行上去z2 = a1.dot(W1) + b1a2 = sigmoid(z2)# z3,跟z2计算一样# z3,应该是4 × 1,因为训练样本有4个,而输出层的神经元个数为1# 所以要想通过a2和W2点乘,得到一个4 × 1的矩阵,a2 * W2, (4, 3) * (3, 1) = (4, 1)z3 = a2.dot(W2) + b2a3 = sigmoid(z3)print a3.shapeprint a3# 可以看出# z的计算方法,都是一样的,无论有多少个隐藏层# a的计算方法,也可以说是一样的,只是这里主要讲述前向传播,因此全部用的sigmoid,换成其他激活函数,整个过程并不会发生任何变化
0 0
原创粉丝点击