单隐层全连接神经网络原理

单隐层全连接神经网络原理

本文主要介绍全连接网络的前向传播和后向传播过程的详细推导,没有用到矩阵求导的相关知识,只用了最基本的线性代数和微积分理论,同时最好先了解下python的广播机制
csdn上的公式编辑器不太会用,所有公式推导都用截图的形式了,如果需要源文档可以留言。不喜欢看推导可以直接跳到后面看算法总结和代码

1.网络结构图

所谓单隐层神经网络是一种二层结构的浅层神经网络,如下图所示。
符号约定:
上标代表的是层的编号;
左数第一个下标代表在某一层中的神经元编号;
左数第二个下标代表神经元的权值参数编号,后面也会作为训练数据的编号来用。

输入数据这里用A表示,其他教程一般会用X表示。后面会介绍为什么本文用这种符号表示方法。

在这里插入图片描述
请时刻记得这张图,如果推导部分有看不懂的地方,就回来看看这张图!
请时刻记得这张图,如果推导部分有看不懂的地方,就回来看看这张图!
请时刻记得这张图,如果推导部分有看不懂的地方,就回来看看这张图!

2.工作原理

2.1 网络参数的约定

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 前向传播过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 反向传播过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 算法总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.代码

# -*- coding: utf-8 -*-
"""
Created on Fri Nov  1 20:22:22 2019

@author: Iseno_V
"""
import numpy as np

m = 10000#x训练集大小
n = 2#输入参数的维数
k = 3#隐层的神经元个数
alpha=0.001#学习率

#生成样本集
X=np.hstack((np.random.rand(n,m/2),-np.random.rand(n,m/2)))
Y=np.hstack((np.zeros((1,m/2)),np.ones((1,m/2))))

#生成测试集,大小为m/4
X_test=np.hstack((-np.random.rand(n,m/8),np.random.rand(n,m/8)))
Y_test=np.hstack((np.ones((1,m/8)),np.zeros((1,m/8))))

I = 60000#迭代步数
w1 = np.random.rand(k,n)#初始化参数w1
b1 = np.random.rand(k,1)#初始化参数b1

w2 = np.random.rand(1,k)#初始化参数w2
b2 = np.random.rand(1,1)#初始化参数b2
a0 = X
for i in range(I):
    #正向传播过程
    z1 = np.dot(w1,a0)+b1
    a1 = 1.0/(1+np.exp(-z1))
    z2 = np.dot(w2,a1)+b2
    a2 = 1.0/(1+np.exp(-z2))
    
    #计算损失函数
    if (i+1)%500==0:
        J = - (np.dot(Y,np.log(a2).T)+(np.dot((1-Y),np.log(1-a2).T)))/m
        print('step={1},cost function={0}'.format(J,i+1))
    
     #反向传播过程
    dz2 = (a2-Y)/m#计算梯度dJ/dz2
    dw2 = np.dot(dz2,a1.T)#计算梯度dJ/dw2
    db2 = np.sum(dz2,axis=1,keepdims=True)#计算梯度dJ/db2
    
    dz1 = np.multiply(np.dot(w2.T,dz2),np.exp(-z1)/((1+np.exp(-z1))**2))#计算梯度dJ/dz1
    dw1 = np.dot(dz1,a0.T)#计算梯度dJ/dw1
    db1 = np.sum(dz1,axis=1,keepdims=True)#计算梯度dJ/db1
    
    w2=w2-alpha*dw2#更新w2
    b2=b2-alpha*db2#更新b2
    w1=w1-alpha*dw1#更新w1
    b1=b1-alpha*db1#更新b1

#计算准确率
z1 = np.dot(w1,X_test)+b1
a1 = 1.0/(1+np.exp(-z1))
z2 = np.dot(w2,a1)+b2
a2 = 1.0/(1+np.exp(-z2))
y = (z2>0.5).astype(np.int)
rate = 1-np.sum(np.abs(Y_test - y))/(m/4)
print('accuracy={0}'.format(rate))
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值