单隐层全连接神经网络原理
程序员文章站
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))
上一篇: *牛轧糖的六大品牌,来*一定要买!
下一篇: Flume原理与应用