欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-14 11:27:09
...

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

本文主要介绍全连接网络的前向传播和后向传播过程的详细推导,没有用到矩阵求导的相关知识,只用了最基本的线性代数和微积分理论,同时最好先了解下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))