深度学习入门python版小鱼书笔记2实现神经网络前向传播

python实现简单神经网络

  • 神经网络的激活函数使用平滑变化的sigmod函数或ReLU函数
  • 通过巧妙的使用Numpy多维数组,可以高效地实现神经网络
  • 机器学习的问题大体上可以分为回归问题和分类问题
  • 关于输出层的激活函数,回归问题中一般用恒等函数,分类问题中一般用softmax函数
  • 分类问题中,输出层的神经元的数量设置为要分类的类别数
  • 输入数据的集合称为批,通过以批为单位进行推理处理,能够实现高速的运算

一 激活函数

1 阶跃函数
def step_function(x):
	return np.array(x>0,dtype=np.int)
x = np.arange(-5.0,5.0,0.1)  # x 在(-5,5)内 步长为1
y = step_function(x)
2 sigmod函数
def sigmod(x):
    return 1/(1+np.exp(-x))
x = np.arange(-5.0,5.0,0.1)
y = sigmod(x)
3 ReLU函数

f ( x ) = { x x > 0 0 x  ≤  0 f(x)= \begin{cases} x& \text{x > 0}\\ 0& \text{x $ \leq $ 0} \end{cases} f(x)={x0x > 0 0

def relu(x):
    return np.maximum(0,x)

二 输出函数

恒等函数
def identity_function(x):
    return x                            # 定义输出函数为恒等函数
softmax函数

y k = e ( a k ) ∑ i = 1 n e ( a i ) y_k = \displaystyle \frac{e^{(a_k)}}{\displaystyle \sum^{n}_{i = 1}{e^{(a_i)}}} yk=i=1ne(ai)e(ak)

def softmax(a):
    exp_a = np.exp(a)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    return y

三 神经网络前向传播

a 1 ( 1 ) = w 11 ( 1 ) x 1 + w 12 ( 1 ) x 2 + b 1 ( 1 ) a^{(1)}_1 = w^{(1)}_{11}x_1 + w^{(1)}_{12}x_2 + b^{(1)}_1 a1(1)=w11(1)x1+w12(1)x2+b1(1)
A ( 1 ) = X W ( 1 ) + B ( 1 ) A^{(1)} = XW^{(1)} + B^{(1)} A(1)=XW(1)+B(1)

  • 激活函数使用sigmod
  • 输入层到第1层
X = np.array([1.0,0.5])
W1 = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
B1 = np.array([0.1,0.2,0.3])
A1 = np.dot(X,W1) + B1
Z1 = sigmod(A1)
  • 第1层到第2层
W2 = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
B2 = np.array([0.1,0.2])
A2 = np.dot(Z1,W2) + B2
Z2 = sigmod(A2)
  • 第2层到输出层
W3 = np.array([[0.1,0.3],[0.2,0.4]])
B3 = np.array([0.1,0.2])
A3 = np.dot(Z2,W3) + B3
Y = identity_function(A3)  # 输出
  • 封装
  • 定义了init_network()和forwar()函数,init_network()进行权重和偏置的初始化,并将它们保存在字典变量network中。
    forward()则封装了将输入信号转换为输出信号的处理过程.至此 通过使用Numpy高效的实现了神经网络
ef init_network():
    network = { }
    network['W1'] =  np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
    network['b1'] =  np.array([0.1,0.2,0.3])
    network['W2'] =  np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
    network['b2'] =  np.array([0.1,0.2])
    network['W3'] =  np.array([[0.1,0.3],[0.2,0.4]])
    network['b3'] =  np.array([0.1,0.2])
    return network
    
def forward(network,x):
    W1,W2,W3 = network['W1'],network['W2'],network['W3']
    b1,b2,b3 = network['b1'],network['b2'],network['b3']
    a1 = np.dot(x,W1) + b1
    z1 = sigmod(a1)
    a2 = np.dot(z1,W2) + b2
    z2 = sigmod(a2)
    a3 = np.dot(z2,W3) + b3
    y = identity_function(a3)
    return y
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值